【问题标题】:Connect to AS400 using .NET使用 .NET 连接到 AS400
【发布时间】:2011-03-21 04:21:42
【问题描述】:

我正在尝试使用 SQL 构建一个 .NET Web 应用程序来查询 AS400 数据库。这是我第一次接触 AS400。

我必须在我的机器(或 AS400 服务器)上安装什么才能连接? (IBM iSeries Access for Windows ??)

连接字符串的组成部分是什么?

在哪里可以找到使用 SQL 命令构建数据访问层的示例代码?

谢谢。

【问题讨论】:

    标签: c# .net asp.net sql ibm-midrange


    【解决方案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 的开发工具。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-09-13
              • 1970-01-01
              • 2016-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-06
              相关资源
              最近更新 更多