如何使用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,添加两个基础权限:
如果你的测试环境AS/400服务没有配置SSL加密,在安卓9.0及以上系统会默认拦截明文流量,需要在<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><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
相关产品推荐
相关产品推荐

