ODBC 连接 C#

问题描述 投票:0回答:1

尝试使用 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.
c# ibm-midrange
1个回答
0
投票

首先简单介绍一下:

  • 如果您完全不熟悉 .Net; .Net非常强大,但有一定的学习曲线。首先尝试了解 .Net 背后的哲学 - 它有不同的版本(更多内容这里),并且还有所谓的扩展。您可以在 Microsoft 帮助页面的底部看到这一点。如果您想在非 Windows 平台(例如移动平台、Linux 甚至 AS/400 IBM i PASE)上重用代码,这一点可能很重要。
  • 有 C# 和 VB.Net - 谨慎做出决定。我发现 VB.Net 更容易使用且不会丢失功能(仅是我个人的意见)。
  • 与RPG(甚至COBOL)相反,其他语言/生态系统中的数据库I/O非常具有函数调用的特征。也许您会怀念能够编写“SELECT * FROM F1 INTO :F1R”将所有字段一次放入数据结构中的舒适感;哦,好吧...

准备工作:

  • 确保计算机上安装了 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:

    1. 在 VS 中,转到“工具”->“Nuget 包管理器”->“包管理器控制台”
    2. 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>;"
    • 请注意,要使用 commit ,AS400 IBM i 上的文件需要记录日志,否则您将收到 Error SQL 7008

这是我们将使用的文件的 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 永远。

如果您喜欢这篇文章,请随时接受它作为答案 - 非常感谢,祝一切顺利!

© www.soinside.com 2019 - 2024. All rights reserved.