代码之家  ›  专栏  ›  技术社区  ›  madatanic

使用.NET连接到AS400

  •  37
  • madatanic  · 技术社区  · 14 年前

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

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

    7 回复  |  直到 14 年前
        1
  •  29
  •   Nicola Isotta Ravi Kadaboina    6 年前
        2
  •  11
  •   LCJ    5 年前

    下面是我为解决这个问题所做的。

    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客户端解决方案

    IBM i Access Client Solutions

        3
  •  5
  •   Wildcat Matt    7 年前

    如其他答案中所述,如果已经安装了ibmiaccess客户机,那么可以使用IBM.Data.DB2.iSeries包。

    如果您没有ibmiaccess软件,您可以利用 JTOpen JT400.78 它将引入IKVM运行时。

    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();
    

    从记录集到数据表的转换有点笨拙,给我的VBScript时代带来了糟糕的回忆。性能可能不会很快让人眼花缭乱,但它是有效的。

        4
  •  1
  •   Mark    6 年前

       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 返回的结果。如果有人需要/想要在IBMAS/400中插入/更新值的方法,请留下评论,我将与大家分享。。。

        5
  •  0
  •   raabsoft    12 年前

    我正在使用这个代码,对我来说非常好!

      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
  •  0
  •   Joseph Morgan    9 年前

    我最近在NuGet上发现了ADO.Net驱动程序。我的电脑上安装了iSeries客户端访问,所以我不能说它是否可以作为独立的,但它确实可以连接。唯一的问题是我实际上看不到任何表或过程。我想可能有一个模式或者库或者一些我还没有深入研究的东西。如果我找到答案,我会发帖的。同时,我仍然可以访问服务器并使用NuGet适配器编写大部分代码。

        7
  •  -1
  •   user1322600    13 年前

    http://asna.com/us/ 因为他们有一些使用SQL和AS400的开发工具。