[英]Run AS400 stored procedure from C# throw an error
我正在嘗試從我的代碼運行存儲過程,並且出現以下錯誤:
附加信息:錯誤[42S02] [IBM] [系統i Access ODBC驅動程序] [DB2 for i5 / OS]
SQL0204-MyLibrary中的StoredProc1類型* FILE未找到。
我的代碼:
internal DataTable Retrieve()
{
var sql = string.Format("Select * from StoredProc1");
DataSet dataset = new DataSet();
OdbcCommand command = new OdbcCommand(sql);
// MyConnectionString = "ODBC;DATABASE=MyLibrary;DSN=AS400-MyLibrary;UID=MyUser;PWD=MyPwd;ALLOWUNSCHAR=0;"
// It works fine for sure since I can change the StoredProc1 to a table instead and the query works fine. So it is not a connection problem.
command.Connection = _libraryConnection.Connection;
command.CommandType = CommandType.StoredProcedure;
OdbcDataAdapter adapter = new OdbcDataAdapter(command);
lock (_anyObj)
{
_libraryConnection.OpenConnection();
adapter.Fill(dataset);
_libraryConnection.CloseConnection();
}
return dataset.Tables[0];
}
AS400存儲過程SQL:
BEGIN
DECLARE C2 CURSOR WITH RETURN FOR
SELECT * FROM MyLibrary.TABLE1;
OPEN C2 ;
END
存儲過程的AS400選項:
Max number of result sets: 0
Data access: Read SQL Data
Concurrent access resolution: Default
Transaction control: Do not commit on return
Unified debugger mode: Disallow debug mode
AS400版本7發行版1
編輯:我更改了sql變量,如下所示:
var sql = "{CALL StoredProc1()}";
現在它沒有引發異常,但另一方面,我在數據表中沒有任何行。 查詢表肯定包含記錄。
在數據庫中查找該過程:StoredProc1。 它正在打開一個不存在的文件。
要使其工作,需要執行以下操作:
2種不同的連接選項:
使用ODBC連接
internal DataTable Retrieve()
{
var sql = "CALL STOREDPROC1()"; // THOSE ARE THE POSSIBLE SYNTHAXES
// OR var sql = "{CALL STOREDPROC1()}";
DataSet dataset = new DataSet();
OdbcCommand command = new OdbcCommand(sql);
command.Connection = _libraryConnection.Connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = 0; // OPTIONAL
OdbcDataAdapter adapter = new OdbcDataAdapter(command);
lock (_anyObj)
{
_libraryConnection.OpenConnection();
adapter.Fill(dataset);
_libraryConnection.CloseConnection();
}
return dataset.Tables[0];
}
使用ADODB連接
internal DataTable Retrieve()
{
var sql = "STOREDPROC1()"; // THIS IS THE SYNTHAX
OleDbDataAdapter adapter= new OleDbDataAdapter();
DataTable dt = new DataTable();
ADODB.Command command = new ADODB.Command();
ADODB.Recordset rs = new ADODB.Recordset();
command.ActiveConnection = _libraryConnection.Connection;
command.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc;
command.CommandText = sql;
command.CommandTimeout = 0; // OPTIONAL
rs.CursorLocation = ADODB.CursorLocationEnum.adUseServer;
lock (_anyObj)
{
rs.Source = command;
rs.Open();
adapter.Fill(dt, rs);
rs.Close();
}
return dt;
}
存儲過程的AS400選項:
Max number of result sets: 1
Data access: Read SQL Data
Concurrent access resolution: Default
Transaction control: Do not commit on return
Unified debugger mode: Disallow debug mode
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.