Вызов хранимой процедуры в i Series с использованием драйвера IBM DB2 Connect
У меня есть приложение на 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
2 ответа
Я всегда делал следующее:
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();
Я не могу вспомнить, как сделать направление, но это в основном, как я реализовал это в прошлом.
Об этом давно спрашивали, но я все равно отвечу.
Посмотрите на это сообщение об ошибке:
ОШИБКА [58005] [IBM][DB2.NET] SQL0902 Произошло непредвиденное исключение в процессе: 5652 Поток 10 Домен приложения: Имя:aa196883-1-129406018469512609
Там нет контекстной политики.
После выполнения поиска по тексту "Нет контекстных политик"., Я нашел это:
Там вы увидите следующее:
Возвращаемое значение
Тип: System.String
Строка, образованная объединением буквенной строки "Name:", понятного имени домена приложения и либо строковых представлений политик контекста, либо строки "Нет политик контекста".
Итак, что это значит?
Скорее всего, это исходит из этого:
ConfigurationManager.ConnectionStrings ["db2IBM"].ConnectionString
Именно так вы и написали.
Эта ошибка может быть вызвана одним из следующих:
- эти пробелы вызывают ошибку, или
db2IBM
не существует в разделе Строка подключения вашего файла Web.config.
Для получения справки по настройке раздела "Строка подключения" см. Следующее: