如何在VB.NET中通过ODBC连接AS400及解决填充DataSet后无数据显示问题
解决VB.NET通过ODBC连接AS400填充DataSet无数据的问题
我看了你的代码,发现几个关键问题导致你拿不到数据,咱们一步步来梳理和修正:
1. OdbcDataAdapter未实例化
你在全局声明了dm As OdbcDataAdapter,但在GetData方法里完全没对它做实例化(也就是没写dm = New OdbcDataAdapter()),直接调用dm.SelectCommand = cmd会触发空引用异常,根本走不到填充数据的步骤。
2. 连接对象管理混乱+异常处理变量错误
- 你在
GetData里又重新创建了OdbcConnection,既浪费资源,也没复用ConnServer里的连接逻辑; - 异常捕获里写的
con.Close(),但你的连接变量名是cn,这里会直接编译报错,而且就算能运行,没判断连接状态就调用Close也会出问题。
3. 潜在的排查点
- 先把你的SQL查询
query拿到AS400自带的查询工具(比如STRSQL)里跑一遍,确认本身能返回数据; - 检查AS400_CA这个DSN的配置是否正确,确保能正常连接到目标服务器;
- 确认
root用户有查询目标表的权限。
修正后的代码示例
Dim cn As OdbcConnection Sub ConnServer() Try ' 只在连接未初始化或已关闭时重新创建并打开 If cn Is Nothing OrElse cn.State <> ConnectionState.Open Then cn = New OdbcConnection("DSN=AS400_CA;UID=root;PWD=*****;") cn.Open() End If Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical, "Ecriture Comptable") End Try End Sub Public Function GetData(query As String) As DataTable Dim resultTable As New DataTable() Try ' 先确保连接可用 ConnServer() If cn Is Nothing OrElse cn.State <> ConnectionState.Open Then MsgBox("连接失败,无法获取数据", MsgBoxStyle.Exclamation) Return resultTable End If ' 使用Using自动释放资源,避免内存泄漏 Using cmd As New OdbcCommand(query, cn) Using dm As New OdbcDataAdapter(cmd) dm.Fill(resultTable) End Using End Using Catch ex As Exception MsgBox($"获取数据出错:{ex.Message}", MsgBoxStyle.Critical) ' 异常时确保连接能正确关闭 If cn IsNot Nothing AndAlso cn.State = ConnectionState.Open Then cn.Close() End If cn = Nothing ' 重置连接,下次调用时重新创建 End Try Return resultTable End Function
优化说明
- 用
Using语句自动管理OdbcCommand和OdbcDataAdapter的资源,不用手动释放; - 统一连接管理逻辑,避免重复创建连接;
- 异常处理里增加了连接状态检查,防止无效关闭操作;
- 直接填充DataTable,比DataSet更简洁高效。
内容的提问来源于stack exchange,提问作者user9067306
相关产品推荐
相关产品推荐

