使用 IBM DB2 Connect 驱动程序调用 i 系列上的存储过程

Posted

技术标签:

【中文标题】使用 IBM DB2 Connect 驱动程序调用 i 系列上的存储过程【英文标题】:Calling stored procedure on i Series using IBM DB2 Connect driver 【发布时间】:2011-01-27 12:21:49 【问题描述】:

我有一个 C# 应用程序,我试图从中调用 ISeries 存储过程(包装一个 RPGLE 程序)。此 RPGLE 程序将结果集返回给我的 C# 应用程序。 当我尝试调用存储过程时,它会出错并无限期挂起。在调试模式下,我可以看到如帖子末尾所示的 SQL 错误消息。如果我使用 OleDBConnection,它可以正常工作,但它不适用于 DB2 Connect。

我尝试在我的页面上设置跟踪,但它没有帮助,因为页面只是挂起并且我无法查看堆栈跟踪。

在 ISeries 方面,我可以看到程序正确执行(为了测试,我在程序末尾的测试文件中写了一条记录。)

以前有没有其他人遇到过这个错误?我将不胜感激。

谢谢。

代码:-

DB2Connection conn1 = new DB2Connection(ConfigurationManager.ConnectionStrings  ["db2IBM"].ConnectionString);
        conn1.Open();

        string callString5 = "PGMLIBLE.GETCONSIGNMENTS";

        DB2Command cmd1 = new DB2Command(callString5, conn1);
        cmd1.CommandType = CommandType.StoredProcedure;
        cmd1.CommandTimeout = 5;

        DB2Parameter prmCons = cmd1.Parameters.Add("prmCons", DB2Type.Char, 7);
        prmCons.Direction = ParameterDirection.Input;
        prmCons.Value = "JUT0016";

        DB2Parameter prmCmp = cmd1.Parameters.Add("prmCmp", DB2Type.Char, 3);
        prmCmp.Direction = ParameterDirection.Input;
        prmCmp.Value = "DTA";

        DB2Parameter prmIorE = cmd1.Parameters.Add("prmIorE", DB2Type.Char, 1);
        prmIorE.Direction = ParameterDirection.Input;
        prmIorE.Value = "Y";

        DB2DataAdapter adp = new DB2DataAdapter(cmd1);
        DataTable dt = new DataTable();

        adp.Fill(dt);
     // If I just execute cmd1.executeNonquery it doesn't error.
     //  cmd1.ExecuteNonQuery(); 
        GridView2.DataSource = dt;
        GridView2.DataBind();

        conn1.Close();
        conn1.Dispose();
        cmd1.Dispose();

错误信息:-

ERROR [58005] [IBM][DB2.NET] SQL0902 An unexpected exception has occurred in  Process: 5652 Thread 10 AppDomain: Name:aa196883-1-129406018469512609
There are no context policies.

Function: SQLExecDirectADONET (Params)
 CallStack:    at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   at System.Environment.get_StackTrace()
   at IBM.Data.DB2.DB2ConnPool.HandleUnknownErrors(String strFncMsg, Exception exception, Boolean bThrow)
   at IBM.Data.DB2.DB2Command.ExecuteReaderObject(CommandBehavior behavior, String method, DB2CursorType reqCursorType, Boolean abortOnOptValueChg, Boolean skipDeleted, Boolean isResultSet, Int32 maxRows, Boolean skipInitialValidation)
   at IBM.Data.DB2.DB2Command.ExecuteReaderObject(CommandBehavior behavior, String method)
   at IBM.Data.DB2.DB2Command.ExecuteReader(CommandBehavior behavior)
   at IBM.Data.DB2.DB2Command.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at ShowConsignmentsOpen.Page_Load(Object sender, EventArgs e) in c:\Inetpub\TestStoredProc\ShowConsignmentsOpen.aspx.cs:line 50
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.showconsignmentsopen_aspx.ProcessRequest(HttpContext context) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\teststoredproc\f35f719b\99c08192\App_Web_yti93vc5.2.cs:line 0
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
   at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(Exception error)
   at System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
   at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
   at System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)
   at System.Web.HttpRuntime.ProcessRequest(HttpWorkerRequest wr)
   at Microsoft.VisualStudio.WebHost.Request.Process()
   at Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Connection conn) InnerException Message: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Check InnerException property for more detail.  SQLSTATE=58005

【问题讨论】:

【参考方案1】:

我一直都是这样做的:

    DB2Connection conn1 = new DB2Connection(ConfigurationManager.ConnectionStrings ["db2IBM"].ConnectionString);
    conn1.Open();

    string callString5 = "PGMLIBLE.GETCONSIGNMENTS";

    DB2Command cmd1 = new DB2Command(callString5, conn1);
    cmd1.CommandType = CommandType.StoredProcedure;
    cmd1.CommandTimeout = 5;

    cmd1.Parameters.Add("prmCons", DB2Type.Char, 7).Value = "JUT0016";
    prmCons.Direction = ParameterDirection.Input;

    cmd1.Parameters.Add("prmCmp", DB2Type.Char, 3).Value = "DTA";
    prmCmp.Direction = ParameterDirection.Input;

    cmd1.Parameters.Add("prmIorE", DB2Type.Char, 1).Value = "Y";
    prmIorE.Direction = ParameterDirection.Input;

    DB2DataAdapter adp = new DB2DataAdapter(cmd1);
    DataTable dt = new DataTable();

    adp.Fill(dt);
 // If I just execute cmd1.executeNonquery it doesn't error.
 //  cmd1.ExecuteNonQuery(); 
    GridView2.DataSource = dt;
    GridView2.DataBind();

    conn1.Close();
    conn1.Dispose();
    cmd1.Dispose();

我不记得如何做方向,但这基本上是我过去实现的方式。

【讨论】:

嗨,迈克,这和我的做法一样。该代码适用于 Oledb 驱动程序,因此我怀疑该代码有问题。错误消息显示“没有上下文策略”。可能是因为我的机器上有一些权限问题,还是因为我在 DB2 安装过程中遗漏了一些设置? 我知道 IBM iSeries .NET 驱动程序可能很挑剔。在这样的奇怪错误中,尝试一下可能不会有什么坏处。特别是如果它在 OLEDB 中工作。抱歉,除了三次检查您的权限之外,我没有任何其他建议。【参考方案2】:

这是很久以前问过的,但无论如何我都会回答。

看看这个错误信息:

错误 [58005] [IBM][DB2.NET] SQL0902 进程中发生意外异常:5652 线程 10 AppDomain:名称:aa196883-1-129406018469512609 没有上下文策略。

在对文本“没有上下文策略。”进行搜索后,我发现了这个:

MSDN AppDomain.ToString Method

在那里,您将看到以下内容:

返回值 类型:System.String 通过连接文字字符串“名称:”、应用程序域的友好名称以及上下文策略的字符串表示形式或字符串“没有上下文策略”而形成的字符串。

那么,这是什么意思?

很可能,它来自这个:

ConfigurationManager.ConnectionStrings  ["db2IBM"].ConnectionString

你就是这么写的。

该错误可能由以下任一原因引起:

    这些空格导致错误,或者 db2IBM 在您的 Web.config 文件的连接字符串部分中不存在。

有关设置连接字符串部分的帮助,请参阅以下内容:

Setting up connection string in ASP.NET to SQL SERVER

【讨论】:

以上是关于使用 IBM DB2 Connect 驱动程序调用 i 系列上的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

python用ibm_db模块操作db2

db2 python [处理失败]

使用 PHP Cloud Foundry 应用程序连接到 IBM zOS 系统/DB2 表

Db2 Warehouse:如何使用 SSL 与 ibm 数据服务器驱动程序进行连接

缺少驱动程序类 com.ibm.db2.jcc.DB2Driver 的依赖关系

未找到指定的 JDBC 驱动程序 com.ibm.db2.jcc.DB2Driver 类