时间:2010-07-26 16:04:54

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

7 个答案:

答案 0 :(得分:26)

答案 1 :(得分:10)

以下是我为解决此问题所做的工作。

安装了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"/>

<强>更新

  

IBM不打算在Windows 8.1以外的操作系统上支持IBM i Access for Windows。替代产品是IBM i Access Client解决方案

IBM i Access Client Solutions

答案 2 :(得分:2)

如其他答案中所述,如果已安装IBM i Access客户端,则可以使用IBM.Data.DB2.iSeries包。

如果您没有IBM i Access软件,则可以使用JTOpen并使用Java驱动程序。您需要nuget包JT400.78,它将引入IKVM运行时。

在我的情况下,我需要在AS400上查询DB2数据库并输出DataTable。我找到了几个提示和小代码片段,但没有全面的,所以我想分享我能够建立起来的东西,以防它帮助其他人:

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时代的不良闪回。性能可能不会快速致盲,但它确实有效。

答案 3 :(得分:1)

一个非常老的问题-但这仍然有意义。我需要使用.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中插入/更新值的方法,请发表评论,我将分享...

答案 4 :(得分:0)

我正在使用此代码,对我来说非常有用!

  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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

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