You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#在Xamarin安卓应用中建立IBM AS400 DB2连接

Xamarin.Android 下 C# 连接 IBM AS/400 DB2 实现指南

注:以下操作针对C#、Xamarin开发新手做了步骤拆解,跳过冗余概念说明,直接给可落地的操作路径

首先明确核心原则:生产环境绝对不要让安卓端直连AS/400 DB2。原因很简单:APK反编译门槛极低,硬编码的库账号密码会直接泄露;公网暴露DB2服务端口存在极高的入侵风险;移动端网络切换频繁,直连很容易打满数据库连接池拖垮业务。生产环境请走中间API层转发,下面分两种场景给出具体操作:


方案1:直连方案(仅适用于内网测试、非生产场景)

  • 第一步:引用适配的驱动
    IBM官方提供的IBM.Data.DB2.iSeries桌面版驱动不兼容Xamarin.Android的Mono运行时,别直接从Nuget搜了就装,会报兼容性错误。你需要找支持MonoAndroid架构的托管版iSeries驱动,把对应dll引入Xamarin.Android项目后,在属性面板把dll的「复制到输出目录」选项设置为「如果较新则复制」。
  • 第二步:配置安卓必要权限
    打开项目路径下的Properties/AndroidManifest.xml,添加两个基础权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    如果你的测试环境AS/400服务没有配置SSL加密,在安卓9.0及以上系统会默认拦截明文流量,需要在<application>节点加属性:android:usesCleartextTraffic="true",否则连接会直接被系统拦截。
  • 第三步:编写数据库操作代码
    注意所有数据库IO操作必须放在非主线程执行,否则安卓会直接抛出NetworkOnMainThreadException导致应用崩溃,用Task.Run包裹异步执行即可,参考代码:
    using IBM.Data.DB2.iSeries;
    using System.Data;
    
    // 测试用可以临时写在这里,正式用请做加密存储,不要明文硬编码
    private const string ConnectionString = "DataSource=你的AS400服务器IP;UserID=数据库账号;Password=数据库密码;DefaultCollection=默认Schema名;";
    
    public async Task<DataTable> ExecuteQuery(string sql)
    {
        return await Task.Run(() =>
        {
            var result = new DataTable();
            // using语法会自动释放连接资源,不用手动写Close/Dispose,避免连接泄漏
            using (var conn = new iDB2Connection(ConnectionString))
            {
                conn.Open();
                using (var cmd = new iDB2Command(sql, conn))
                using (var adapter = new iDB2DataAdapter(cmd))
                {
                    adapter.Fill(result);
                }
            }
            return result;
        });
    }
    
  • 新手常见踩坑排查
    • 报BadImageFormat/FileNotFoundException:90%是驱动版本不兼容,换适配MonoAndroid的驱动版本就行
    • 报连接超时:先在安卓设备所在网络用telnet测AS/400的DRDA端口(默认8471,不对找运维确认)通不通,端口通了再调代码
    • 偶发连接失效:不要把连接对象设成全局静态常驻,移动端网络切换(WiFi切流量、断网重连)会让长连接失效,每次操作新建连接、用完释放就好。

方案2:生产环境推荐方案(中间层转发)

这个方案不用折腾端上的驱动兼容,稳定性和安全性都高很多,新手也更容易排查问题:

  • 在和AS/400同内网的服务器上部署一个轻量WebAPI服务,服务端用官方完整版iSeries驱动连接DB2,把增删改查逻辑封装成HTTP接口,同时做好权限校验、限流、日志能力
  • 安卓端不需要引入任何DB2驱动,直接用原生HttpClient调用封装好的HTTP接口拿数据即可,参考代码:
    using System.Net.Http;
    using Newtonsoft.Json;
    
    private readonly HttpClient _httpClient = new HttpClient();
    
    public async Task<T> GetData<T>(string apiEndpoint)
    {
        var response = await _httpClient.GetStringAsync(apiEndpoint);
        return JsonConvert.DeserializeObject<T>(response);
    }
    

新手提示:如果是刚接触C#和Xamarin开发,优先选方案2,不用踩驱动兼容、网络适配的各种坑,也是企业级移动端开发的标准实现方式。

内容的提问来源于stack exchange,提问作者Malartrower

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:18:15