簡體   English   中英

從C#運行AS400存儲過程會引發錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM