使用 .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的主要内容,如果未能解决你的问题,请参考以下文章

连接到 db2 7.1 as400 的 jdbc 驱动程序

将 PHP 连接到 IBM i (AS/400)

我需要从Oracle Apex连接到DB2 AS / 400数据库。

JT400 - IBMi 机器拒绝 JDBC 连接,但在 Windows 机器上工作

我可以使用 sql 在 AS400 中创建“逻辑文件”吗?

我可以将Sony HDR-AS100连接到现有接入点