使用 .NET 连接到 AS400
Posted
技术标签:
【中文标题】使用 .NET 连接到 AS400【英文标题】:Connect to AS400 using .NET 【发布时间】:2011-03-21 04:21:42 【问题描述】:我正在尝试使用 SQL 构建一个 .NET Web 应用程序来查询 AS400 数据库。这是我第一次接触 AS400。
我必须在我的机器(或 AS400 服务器)上安装什么才能连接? (IBM iSeries Access for Windows ??)
连接字符串的组成部分是什么?
在哪里可以找到使用 SQL 命令构建数据访问层的示例代码?
谢谢。
【问题讨论】:
【参考方案1】:您需要 AS400 .Net 数据提供程序。在这里检查: https://www-01.ibm.com/support/docview.wss?uid=isg3T1027163
对于连接字符串示例,请在此处查看: https://www.connectionstrings.com/as-400/
此外,请查看红皮书以获取代码示例并开始使用。 http://www.redbooks.ibm.com/redbooks/pdfs/sg246440.pdf
【讨论】:
该 .NET 数据提供程序没有下载链接。这是 AS400 本身自带的吗? 参考此链接:forums.asp.net/p/1497318/3610952.aspx 据此,只要您安装了 IBM iSeries Access for Windows Client,它就应该在以下文件夹中:C:\Program Files\IBM\Client访问\IBM.Data.DB2.iSeries.dll 对不起,也许我不清楚我的问题。我在哪里可以获得 IBM iSeries Access for Windows Client? @madantanic - 没问题。我认为你必须从 IBM 获得这个软件。自从我在 AS/400 上工作已经有很长时间了(当时我使用 JAVA 访问它),但如果我没记错的话,在我们的商店里,我们不得不联系 IBM 的支持代表,他们给我们寄来了 CD它。我会从您的 AS/400 系统管理员开始,告诉他们您需要什么。不幸的是,我认为这些东西不能免费下载。 您需要来自 IBM 的媒体,或者拥有一个允许您下载软件的 IBM 帐户。【参考方案2】:以下是我为解决问题所做的。
安装了IBM i Access for Windows
。不是免费的
在项目中引用了以下dll
IBM.Data.DB2.iSeries.dll Interop.cwbx.dll(如果使用数据队列) Interop.AD400.dll(如果使用数据队列)数据访问
using (iDB2Command command = new iDB2Command())
command.Connection = (iDB2Connection)_connection;
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue(Constants.ParamInterfaceTransactionNo, 1);
command.CommandText = dynamicInsertString;
command.ExecuteScalar();
连接字符串
<add name="InterfaceConnection"
connectionString="Data Source=myserver.mycompany.com;User ID=idbname;Password=mypassxxx;
Default Collection=ASIPTA;Naming=System"/>
更新
可能不支持 Windows 8.1 之后的操作系统上的 Windows 访问。试用替代产品 IBM i Access Client Solutions
IBM i Access Client Solutions
【讨论】:
【参考方案3】:如其他答案所述,如果您已经安装了 IBM i Access 客户端,则可以使用 IBM.Data.DB2.iSeries 包。
如果您没有 IBM i Access 软件,您可以利用 JTOpen 并使用 Java 驱动程序。您需要 nuget 包 JT400.78,它将拉入 IKVM 运行时。
在我的例子中,我需要在 AS400 上查询一个 DB2 数据库并输出一个 DataTable。我发现了一些提示和小的代码 sn-ps,但并不全面,所以我想分享我能够构建的内容,以防它帮助其他人:
using com.ibm.as400.access;
using java.sql;
var sql = "SELECT * FROM FOO WITH UR";
DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
Connection conn = DriverManager.getConnection(
"jdbc:as400:" + ServerName + ";prompt=false", UserName, Password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
int ct = md.getColumnCount();
DataTable dt = new DataTable();
for(int i=1; i<=ct; i++)
dt.Columns.Add(md.getColumnName(i));
while (rs.next())
var dr = dt.NewRow();
for (int i = 1; i <= ct; i++)
dr[i - 1] = rs.getObject(i);
dt.Rows.Add(dr);
rs.close();
从 RecordSet 到 DataTable 的转换有点笨拙,让我回想起我的 VBScript 日子。性能可能并不快,但它确实有效。
【讨论】:
【参考方案4】:非常古老的问题 - 但这仍然是相关的。我需要使用 .NET 查询我们的 AS/400,但以上答案均无效,因此我最终使用 OleDb 创建了自己的方法:
public DataSet query_iseries(string datasource, string query, string[] parameterName, string[] parameterValue)
try
// Open a new stream connection to the iSeries
using (var iseries_connection = new OleDbConnection(datasource))
// Create a new command
OleDbCommand command = new OleDbCommand(query, iseries_connection);
// Bind parameters to command query
if (parameterName.Count() >= 1)
for (int i = 0; i < parameterName.Count(); i++)
command.Parameters.AddWithValue("@" + parameterName[i], parameterValue[i]);
// Open the connection
iseries_connection.Open();
// Create a DataSet to hold the data
DataSet iseries_data = new DataSet();
// Create a data adapter to hold results of the executed command
using (OleDbDataAdapter data_adapter = new OleDbDataAdapter(command))
// Fill the data set with the results of the data adapter
data_adapter.Fill(iseries_data);
return iseries_data;
catch (Exception ex)
MessageBox.Show(ex.Message);
return null;
你会像这样使用它:
DataSet results = query_iseries("YOUR DATA SOURCE", "YOUR SQL QUERY", new string[] "param_one", "param_two" , new string[] "param_one_value", "param_two_value");
它返回返回结果的DataSet
。如果有人需要/想要一种在 IBM AS/400 中插入/更新值的方法,请发表评论,我会分享...
【讨论】:
嗨,马克,您添加了哪个 dll 引用?哪行代码确实调用了模拟器?...您可以在 Git 上输出您的示例代码或项目并在此处分享链接.. 感谢您的帮助! 您需要安装可从 IBM 网站获得的 IBM iAccess 驱动程序。然后在 windows ODBC 数据源管理器(64 位)中配置您的 AS/400 数据源。配置后,您无需包含任何 DLL - 只需使用using System.Data.OleDb
并使用 OleDb 格式发送 SQL 查询。
谢谢,但这不会启动模拟器?建立连接后,我将如何启动模拟器并将值传递给它...谢谢。如果您在这方面有任何专业知识,请整理一篇文章(JDE 是最大的 ERP 系统之一),并且需要这样的文章/博客。谢谢【参考方案5】:
我正在使用这段代码,对我来说工作得很好!
Try
Dim sqltxt As String = "SELECT * FROM mplib.pfcarfib where LOTEF=" & My.Settings.loteproceso
dt1 = New DataTable
Dim ConAS400 As New OleDb.OleDbConnection
ConAS400.ConnectionString = "Provider=IBMDA400;" & _
"Data Source=192.168.100.100;" & _
"User ID=" & My.Settings.usuario & ";" & _
"Password=" & My.Settings.contrasena
Dim CmdAS400 As New OleDb.OleDbCommand(sqltxt, ConAS400)
Dim sqlAS400 As New OleDb.OleDbDataAdapter
sqlAS400.SelectCommand = CmdAS400
ConAS400.Open()
sqlAS400.Fill(dt1)
grid_detalle.DataSource = dt1
grid_detalle.DataMember = dt1.TableName
Catch ex As Exception
DevExpress.XtraEditors.XtraMessageBox.Show("Comunicación Con El AS400 No Establecida, Notifique a Informatica..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Me.Close()
End Try
【讨论】:
【参考方案6】:我最近在 NuGet 上发现了 ADO.Net 驱动程序。我的 PC 上安装了 iSeries 客户端访问,所以我不能说它是否可以独立运行,但它确实可以连接。唯一的问题是我实际上看不到任何表格或过程。我认为可能有一个模式或库或者我还没有深入了解的东西。如果我找到答案,我会发布。同时,我仍然可以使用 NuGet 适配器访问服务器并编写我的大部分代码。
【讨论】:
【参考方案7】:查看http://asna.com/us/,因为他们有一些使用 SQL 和 AS400 的开发工具。
【讨论】:
以上是关于使用 .NET 连接到 AS400的主要内容,如果未能解决你的问题,请参考以下文章
我需要从Oracle Apex连接到DB2 AS / 400数据库。