1

C#コードからDB2ストアドプロシージャを呼び出そうとすると、次のエラーメッセージが表示されます。

エラー[42601][IBM][CLIドライバー][DB2/NT64]SQL0104N「get_profile_internet」の後に予期しないトークン「END-OF-STATEMENT」が見つかりました。予想されるトークンには、「JOIN」が含まれる場合があります。SQLSTATE = 42601

私は何が間違っているのですか?


これがDB2-ストアドプロシージャコードです

create procedure db2admin.pr_get_profile_internet (
    IN p_profile_internet_id INT
)
BEGIN
    DELCARE c_profile_internet CURSOR WITH RETURN TO CLIENT FOR
        SELECT * 
        FROM profile_internet 
        WHERE profile_internet_id = p_profile_internet_id;

    OPEN c_profile_internet;
END;

これが私のC#コードです

    public CDataResult<DataSet> GetProfileInternet() {
        string v_connection_string = General.GetDBConnection();
        CDataResult<DataSet> v_result = new CDataResult<DataSet>();
        OdbcConnection v_connection = new OdbcConnection(v_connection_string);
        try {
            // Open Connection
            v_connection.Open();
            OdbcCommand cmd = new OdbcCommand("db2admin.pr_get_profile_internet", v_connection);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("p_profile_internet_id", OdbcType.Int);
            cmd.Parameters["p_profile_internet_id"].Value = this.ProfileInternetId;
            OdbcDataAdapter da = new OdbcDataAdapter(cmd);
            DataSet ds = new DataSet("GetProfileInternet");
            da.Fill(ds);
            if (ds != null && ds.Tables[0].Rows.Count > 0) {
                v_result.ErrorOccured = false;
                v_result.ErrorMessageEn = "";
            } else {
                v_result.ErrorOccured = true;
                v_result.ErrorMessageEn = "Error! User code is not valid.";
            }
        } catch (Exception ex) {
            v_result.ErrorOccured = true;
            v_result.ErrorMessageEn = "DB error: CProfileInternet->GetProfileInternet()";
            v_result.ErrorException = ex.Message + '\n' + ex.InnerException;
        } finally {
            if (v_connection != null) {
                v_connection.Close();
            }
        }
        return v_result;
    }

最新のC#コードバージョンは次のとおりです。

    public CDataResult<DataSet> GetProfileInternet()
    {
        string v_connection_string = General.GetDBConnection();
        CDataResult<DataSet> v_result = new CDataResult<DataSet>();
        OdbcConnection v_connection = new OdbcConnection(v_connection_string);

        try
        {
            // Open Connection
            v_connection.Open();

            OdbcCommand cmd = new OdbcCommand("call db2admin.pr_get_profile_internet", v_connection);
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("p_profile_internet_id", OdbcType.Int);
            cmd.Parameters["p_profile_internet_id"].Direction = ParameterDirection.Input;
            cmd.Parameters["p_profile_internet_id"].Value = this.ProfileInternetId;

            OdbcDataAdapter da = new OdbcDataAdapter(cmd);
            DataSet ds = new DataSet("GetProfileInternet");
            da.Fill(ds);

            if (ds != null && ds.Tables[0].Rows.Count > 0)
            {
                v_result.ErrorOccured = false;
                v_result.ErrorMessageEn = "";
            }
            else
            {
                v_result.ErrorOccured = true;
                v_result.ErrorMessageEn = "Error! User code is not valid.";
            }
        }

        catch (Exception ex)
        {
            v_result.ErrorOccured = true;
            v_result.ErrorMessageEn = "DB error: CProfileInternet->GetProfileInternet()";
            v_result.ErrorException = ex.Message + '\n' + ex.InnerException;
        }

        finally
        {
            if (v_connection != null)
            {
                v_connection.Close();
            }
        }

        return v_result;
    }

これが私のDB2ストアドプロシージャコードです。

create procedure db2admin.pr_get_profile_internet

(IN p_profile_internet_id int)開始

Declare c_profile_internet CURSOR WITH RETURN TO CLIENT FOR
Select  * 
From    db2admin.profile_internet 
Where   profile_internet_id = p_profile_internet_id;

Open c_profile_internet;

終わり;

これが私のテーブル構造です

create table profile_internet
(
profile_internet_id         int not null, 
code_client                 varchar(30) not null,
prenom                      varchar(100) not null,
nom                         varchar(100) not null,
adresse                     varchar(100) not null,
appartement                 varchar(100) null,
ville                       varchar(100) not null,
code_postal                 varchar(30) not null,
code_province               varchar(10) not null,
telephone_domicile          varchar(30) null,
telephone_mobile            varchar(30) null,
telephone_bureau            varchar(30) null,
extension_bureau            varchar(10) null,
date_de_naissance           date null,
langue                      varchar(1)  not null,
courriel                    varchar(100) null,
profil_actif                smallint not null,
date_creation               timestamp not null,
creer_par                   varchar(30) not null,
date_modification           timestamp not null,
modifier_par                varchar(30) not null,
    primary key (profile_internet_id)
)
;

CREATE UNIQUE INDEX idx_profile_internet_code_client ON profile_internet (code_client);
CREATE UNIQUE INDEX idx_profile_internet_courriel ON profile_internet (courriel);

次のエラーメッセージが表示されないようにするにはどうすればよいですか。

エラー[42884][IBM][CLIドライバー][DB2/NT64]SQL0440N互換性のある引数を持つタイプ「PROCEDURE」の「DB2ADMIN.PR_GET_PROFILE_INTERNET」という名前の許可されたルーチンが見つかりませんでした。SQLSTATE = 42884

4

3 に答える 3

0

ステートメントの終わりを処理できるように、ストアドプロシージャを呼び出すときにDataReaderを開く必要があるようです。

OdbcDataReader Reader = cmd.ExecuteReader();

それから

while (Reader.Read())
            {
                try
                {
                }

            }
于 2013-02-27T17:06:28.197 に答える
0

'CALL'SP名だけでなく、動詞を使用して完全なODBC構文を指定する必要があります。

于 2013-02-27T18:22:44.827 に答える
0

将来のためにあなたと解決策を共有したいと思います。

まず、Visual Studio 2005を使用していて、ローカルマシンにDB2Express10.1.2.2をインストールしました。ファイルC:\ Program Files \ IBM \ SQLLIB \ BIN \ netf20 \ IBM.Data.DB2.dllへの参照を追加しましたが、機能しませんでした。接続を開こうとすると、次のエラーメッセージが返され続けます。ERROR-エラー情報がありません

この問題を修正するために、Visual Studio 2010で同じプロジェクトを作成し、ファイルC:\ Program Files \ IBM \ SQLLIB \ BIN \ netf40\IBM.Data.DB2.dllへの参照を追加しました。プロジェクトのプロパティで、ターゲットフレームワークを.Net Framework 4に変更し、DB2ストアドプロシージャを呼び出すことができました。

C#の作業コードは次のとおりです。

using IBM.Data.DB2;


public DataSet GetProfileInternet()
{
    string v_connection_string = "Database=myDatabase;Server=myServer:myPort;UID=myUserId;PWD=myPassword";
    DB2Connection v_connection = new DB2Connection(v_connection_string);

    try
        {
    // Open Connection
    v_connection.Open();

    DB2Command cmd = new DB2Command("pr_get_profile_internet", v_connection);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("p_profile_internet_id", DB2Type.Integer);
    cmd.Parameters["p_profile_internet_id"].Direction = ParameterDirection.Input;
    cmd.Parameters["p_profile_internet_id"].Value = 1;

    DB2DataAdapter da = new DB2DataAdapter(cmd);
    DataSet ds = new DataSet("GetProfileInternet");
    da.Fill(ds);

    return ds;

}

catch (Exception ex)
{
    throw ex;
}

finally
{
    if (v_connection != null)
    {
        v_connection.Close();
    }
}
}
于 2013-03-01T15:49:42.030 に答える