DB2与.NET Core 2.1

5
我使用Visual Studio 2017和.Net Core 2.1安装了IBM.Data.DB2.Core版本(1.2.2.100),我试图测试与DB2(z/OS服务器)的简单连接,但出现以下错误。我们的DB2服务器类型是OS390,版本是11。
错误 [42968] [IBM] SQL1598N 尝试连接数据库服务器失败,因为存在许可证问题。
 using (DB2Connection con = new DB2Connection("Server=xxxx.xxxx.com:446;Database=XXXX;UID=XXXXXX;PWD=xxxxx"))
            {
                try
                {
                    con.Open();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            } 

我将许可文件复制到了.nuget\packages\ibm.data.db2.core\1.2.2.100\build\clidriver\license文件夹中。我尝试了这里提到的所有方法:https://www.ibm.com/developerworks/community/blogs/96960515-2ea1-4391-8170-b0515d08e4da/entry/Instructions_for_downloading_and_using_DB2_NET_Core_provider_package?lang=en。有什么想法吗?

您是否有连接到DB2 z/OS的许可证?它与DB2 LUW不同。您是否拥有Db2 Connect(产品)? - data_henrik
@data_henrik 是的,我们有。 - Yass
3个回答

3

IBM DB2 Nuget包适用于 .net core 版本1.1和1.2,带有DB2驱动程序版本11。如果您的DB2版本低于11,则这两个软件包将不受支持。以下是解决此问题的步骤:

  1. 安装IBM DB2 Nuget包版本1.0
  2. 使用1.0安装路径更新环境PATH变量
  3. 删除/卸载计算机上安装的任何其他DB2驱动程序
  4. 关闭您的Visual Studio版本并重新打开它,它将无任何问题地工作。

此外,1.0版本不需要许可证文件。希望这能帮助到您。


你是如何实际连接的?1.0到1.1和1.2之间存在重大变化,因此降级有点麻烦。很让人沮丧的是,仅仅连接到DB2实例就这么困难。我仍然无法理解为什么我们需要一个许可证文件。@Yass - Matt Koch
是的,在降级后我成功连接了而不需要许可文件。我认为当您将解决方案部署为容器时,许可文件是必需的,因为您没有其他东西来检查您的许可证。 - Yass
1
我不相信这是正确的。我正在运行DB2 v10.5.0.5,并且有<PackageReference Include="IBM.Data.DB2.Core" Version="1.2.2.100" />。我能够连接和查询,没有任何问题。只需简单地执行dotnet add package IBM.Data.DB2.Core,我就可以开始工作了。 - Lucas

3

我在这个问题上花了几个小时,使用最新版本的 1.3.0.100 包和我已经安装的有效 DB2 11.1 许可证,以下是对我有效的解决方案。我猜想,只要您已经拥有许可证,这种方法也适用于1.1和1.2版本。

将以下代码块添加到您的项目文件中,并根据您的本地设置需要调整 DB2License 路径:

  <ItemGroup>
    <DB2License Include="C:\ProgramData\IBM\DB2\{FOLDER NAME THAT VARIES BY INSTALL}\license\**\*.*"/>
  </ItemGroup>
  <Target Name="CopyFiles" AfterTargets="AfterBuild">
    <Copy SourceFiles="@(DB2License)" DestinationFolder="$(OutDir)\clidriver\license\" />
  </Target>

重要的部分似乎是在你的应用程序运行之前,$(OutDir)\clidriver\license\中有所有必要的文件来表示有效的DB2 11.1+许可证。对于我来说,有3个文件。对于服务器构建和发布,可能需要稍微复杂一些的设置才能将正确的文件放置到预期位置。
以下是我尝试过但似乎对我没有帮助的其他事项,但可能会对其他人有所帮助:
  1. IBM网站上的一些文章建议将%userprofile%\.nuget\packages\IBM.Data.DB2.Core\<version>\build\clidriver\bin%userprofile%\.nuget\packages\IBM.Data.DB2.Core\<version>\build\clidriver\license添加到您的PATH环境变量中。这似乎是完全不必要的。
  2. 其他文章或论坛帖子建议将许可证文件复制到nuget包许可证文件夹%userprofile%\.nuget\packages\IBM.Data.DB2.Core\<version>\build\clidriver\license。这可以工作,但并不理想,因为它需要在每台机器上进行nuget包还原后的操作,如果以后更改nuget包的版本,则需要重新执行此操作。当然,没有任何地方提到“嘿,只需复制许可证到此路径”,指定包含现有许可证的默认目录:C:\ProgramData\IBM\DB2\{FOLDER NAME THAT VARIES BY INSTALL}\license\

1
你可以使用这个教程。

https://www.ibm.com/support/knowledgecenter/SSFMBX/com.ibm.swg.im.dashdb.doc/connecting/connect_connecting__net_applications.html

代码示例

using System;
using IBM.Data.DB2;

namespace dotNetSSLTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DB2Command MyDB2Command = null;
            // Use the dsn alias that you defined in db2dsdriver.cfg with the db2cli writecfg command in step 1.
            String MyDb2ConnectionString = "database=alias;uid=userid;pwd=password;"; 
            DB2Connection MyDb2Connection = new DB2Connection(MyDb2ConnectionString);
            MyDb2Connection.Open();
            MyDB2Command = MyDb2Connection.CreateCommand();
            MyDB2Command.CommandText = "SELECT branch_code, city from GOSALES.BRANCH";
            Console.WriteLine(MyDB2Command.CommandText);

            DB2DataReader MyDb2DataReader = null;
            MyDb2DataReader = MyDB2Command.ExecuteReader();
            Console.WriteLine("BRANCH\tCITY");
            Console.WriteLine("============================");
            while (MyDb2DataReader.Read())
            {
                for (int i = 0; i <= 1; i++)
                {
                    try
                    {
                        if (MyDb2DataReader.IsDBNull(i))
                        {
                            Console.Write("NULL");
                        }
                        else
                        {
                            Console.Write(MyDb2DataReader.GetString(i));
                        }
                    }
                    catch (Exception e)
                    {
                        Console.Write(e.ToString());
                    }
                    Console.Write("\t"); 

                }
                Console.WriteLine("");
            }
            MyDb2DataReader.Close();
            MyDB2Command.Dispose();
            MyDb2Connection.Close();
        }
    }
}

有没有一种编程方式可以以编程方式设置db2cli? - john k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接