尝试使用 microsoft 文档进行 ODBC 连接测试,但没有任何效果,我最终必须使用 ODBC 启动并运行与 AS400 接口的代码,也许更多,但我需要让 ODBC 工作首先
这是代码:
using System;
using System.Data;
using System.Data.Odbc;
static private void InsertRow(string connectionString)
string queryString =
"INSERT INTO Customers (CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')";
OdbcCommand command = new OdbcCommand(queryString);
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
command.Connection = connection;
connection.Open();
command.ExecuteNonQuery();
// The connection is automatically closed at
// the end of the Using block.
首先简单介绍一下:
准备工作:
确保计算机上安装了 ACS (IBM i Access Client Solutions),以便与 AS400 IBM i 建立 ODBC 连接。 ACS 包含 IBM i ODBC 驱动程序。您可以在“驱动程序”选项卡下的 Windows ODBC 数据源管理器中检查这一点
还有一个较小的捆绑包,名为“IBM i ACS Windows 应用程序包”,其中还包含 ODBC 驱动程序(还有适用于 Linux、Max 和 PASE 的驱动程序) - 查看 AS400 IFS 目录 /QIBM/ProdData/Access/ACS/Base,您 可能会在那里找到安装包;否则您需要 IBM ID 才能 下载它。请在此处观看此视频:获取 ODBC 驱动程序来访问 DB2 为了我
要使用System.Data.Odbc,您需要安装.Net包(扩展)System.Data.Odbc:
dotnet add package System.Data.Odbc --version 8.0.0
粘贴到控制台并按 Enter。您需要 AS400 IBM i ODBC 连接字符串。全部记录于此:IBM i ODBC 连接字符串关键字
"Driver={IBM i Access ODBC Driver}System=<AS400-Hostname or IP Address>;Cmt=0;Uid=<AS400 User Id>;Pwd=<AS400 Password>;"
这是我们将使用的文件的 DDS
UNIQUE
R F1R
F1NR 6S
F1NAME 30
F1STATUS 1
K F1NR
随后
CRTPF FILE(MyLib/F1) SRCFILE(MyLib/QDDSSRC)
(完美主义者也可以在评论中添加创建此文件的等效SQL,谢谢。)
现在我们准备好进行一些编码了。
(其他完美主义者请原谅我没有使用 try/catch 或使用,我知道,但这只是为了展示基础知识)
请注意 - 与其他一些代码示例相反 - 我不会关闭连接,而是始终保持连接,因为启动 AS400 IBM i ODBC 连接非常慢。
另请注意,我在本示例中使用 ODBCTransaction 语句,但由于我使用 CommitLevel.None,因此在将 CommitLevel 更改为其他值之前,它们不会产生任何效果。 (一个应该使用承诺控制,但那是另一回事了)。
using System;
using System.Data;
using System.Data.Odbc;
enum CommitLevel : int
{ /* AS400 COMMIT() DB2 Classic Isolation Level */
/* -------------- --------------------------- */
None = 0, /* *NONE (*NC) N/A No Commitment Comntrol */
ReadCommited = 1, /* *CS CS Cursor Stablility */
ReadUncommited = 2, /* *CHG UR Read Uncommited */
RepeatableRead = 3, /* *ALL (*RS) RS Read Stability */
Serializable = 4 /* *RR RR Repeatable Read */
}
class AS400ODBCExample
{
public static void Main(string[] args)
{
// Counters
int recordsInserted = 0;
int recordsRead = 0;
// AS400 Connection String
string cnnstrAS400 = "Driver={IBM i Access ODBC Driver};" +
"System=MySystem;" +
"Cmt=" + (int)CommitLevel.None + ";" +
"Uid=MyUser;Pwd=MyPassword;";
// Libary name
string curLib = "MyLib";
// Create the Connection object
// plus three Command objects (only to be tidy)
// plus a DataReader
// and a Transaction Object.
OdbcConnection cnnAS400 = new OdbcConnection(cnnstrAS400);
OdbcCommand odbcCmdDelete = new OdbcCommand();
OdbcCommand odbcCmdRead = new OdbcCommand();
OdbcCommand odbcCmdInsert = new OdbcCommand();
OdbcDataReader dataReader;
OdbcTransaction traAS400 = null;
// Open (establish) the AS400 IBM i Connection
cnnAS400.Open();
// Give the odbcCmd Objects the connection
// and Set current schema (= library)
odbcCmdDelete.Connection = cnnAS400;
odbcCmdDelete.CommandText = "SET CURRENT SCHEMA = '" + curLib + "'";
odbcCmdDelete.ExecuteNonQuery();
odbcCmdRead.Connection = cnnAS400;
odbcCmdRead.CommandText = "SET CURRENT SCHEMA = '" + curLib + "'";
odbcCmdRead.ExecuteNonQuery();
odbcCmdInsert.Connection = cnnAS400;
odbcCmdInsert.CommandText = "SET CURRENT SCHEMA = '" + curLib + "'";
odbcCmdInsert.ExecuteNonQuery();
// Our first SQL command is to clear our example table
traAS400 = cnnAS400.BeginTransaction();
odbcCmdDelete.Transaction = traAS400;
odbcCmdDelete.CommandText = "DELETE FROM F1";
odbcCmdDelete.ExecuteNonQuery();
traAS400.Commit();
// Next, we insert three rows of data
traAS400 = cnnAS400.BeginTransaction();
odbcCmdInsert.Transaction = traAS400;
odbcCmdInsert.Parameters.Clear();
odbcCmdInsert.CommandText = "INSERT INTO F1 (F1Nr, F1Name, F1Status) VALUES(?, ?, ?)";
odbcCmdInsert.Parameters.Add("F1Nr", OdbcType.Int).Value = 1;
odbcCmdInsert.Parameters.Add("F1Name", OdbcType.Char).Value = "Los Pollos Hermanos";
odbcCmdInsert.Parameters.Add("F1Status", OdbcType.Char).Value = "A";
recordsInserted += odbcCmdInsert.ExecuteNonQuery();
odbcCmdInsert.Parameters.Clear();
odbcCmdInsert.Parameters.Add("F1Nr", OdbcType.Int).Value = 2;
odbcCmdInsert.Parameters.Add("F1Name", OdbcType.Char).Value = "Hamlin, Hamlin & McGill";
odbcCmdInsert.Parameters.Add("F1Status", OdbcType.Char).Value = "C";
recordsInserted += odbcCmdInsert.ExecuteNonQuery();
odbcCmdInsert.Parameters.Clear();
odbcCmdInsert.Parameters.Add("F1Nr", OdbcType.Int).Value = 3;
odbcCmdInsert.Parameters.Add("F1Name", OdbcType.Char).Value = "Madrigal Electromotive GmbH";
odbcCmdInsert.Parameters.Add("F1Status", OdbcType.Char).Value = "A";
recordsInserted += odbcCmdInsert.ExecuteNonQuery();
traAS400.Commit();
Console.WriteLine("{0} Records inserted.", recordsInserted);
Console.WriteLine();
// Now, we read the data and write it to the console window
odbcCmdRead.CommandText = "SELECT * FROM F1";
dataReader = odbcCmdRead.ExecuteReader(CommandBehavior.SequentialAccess);
Console.WriteLine("Data after Insert:");
while (dataReader.Read())
{
recordsRead++;
Console.WriteLine("{0} {1} {2}", dataReader["F1Nr"], dataReader["F1Name"], dataReader["F1Status"]);
}
Console.WriteLine("{0} Records read.", recordsRead);
Console.WriteLine();
// Finally, clean up,
dataReader.Close();
odbcCmdDelete.Dispose();
odbcCmdRead.Dispose();
odbcCmdInsert.Dispose();
cnnAS400.Close();
}
}
而且 - 瞧!
好了,这就是全部;AS400 IBM i 永远。
如果您喜欢这篇文章,请随时接受它作为答案 - 非常感谢,祝一切顺利!