【问题标题】:DB2 with .NET Core 2.1带有 .NET Core 2.1 的 DB2
【发布时间】:2018-06-06 16:47:42
【问题描述】:

我使用 Visual Studio 2017 和 .Net Core 2.1 安装了 IBM.Data.DB2.Core 版本 (1.2.2.100)。我试图测试简单的 DB2(z/OS 服务器)连接并得到以下错误。我们的 DB2 Server 类型是 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 是的,我们有。

标签: db2 .net-core


【解决方案1】:

在这上面花了几个小时,使用当前最新版本的包 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\&lt;version&gt;\build\clidriver\bin%userprofile%\.nuget\packages\IBM.Data.DB2.Core\&lt;version&gt;\build\clidriver\license 添加到您的PATH 环境变量中。这似乎完全没有必要。
  2. 其他文章或论坛帖子建议将您的许可证文件复制到 nuget 包许可证文件夹 %userprofile%\.nuget\packages\IBM.Data.DB2.Core\&lt;version&gt;\build\clidriver\license。这可行,但并不理想,因为它需要在每台机器上完成在 nuget 包还原后,然后如果您稍后更改 nuget 包的版本,则重新完成.当然,提到“嘿,只需将许可证复制到此路径”的地方都没有指定包含您现有许可证的默认目录:C:\ProgramData\IBM\DB2\{FOLDER NAME THAT VARIES BY INSTALL}\license\

【讨论】:

    【解决方案2】:

    用于 .net 核心版本 1.1 和 1.2 的 IBM DB2 Nuget 包附带 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 实例,这非常令人沮丧。我仍然不明白为什么我们需要许可证文件。 @亚斯
    • 是的,我可以在降级后没有许可证文件的情况下成功连接。我认为当您将解决方案部署为容器时需要许可证文件,您没有其他任何东西可以检查您的许可证。
    • 我不相信这是正确的。我正在运行DB2 v10.5.0.5,并拥有&lt;PackageReference Include="IBM.Data.DB2.Core" Version="1.2.2.100" /&gt;。我能够毫无问题地连接和查询。刚刚做了一个简单的dotnet add package IBM.Data.DB2.Core,我就去参加比赛了。
    【解决方案3】:

    您可以使用本教程

    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?
    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多