答案 0 :(得分:26)
答案 1 :(得分:10)
以下是我为解决此问题所做的工作。
安装了IBM i Access for Windows
。不是免费的
在项目中提到了以下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解决方案
答案 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的开发工具。