2009-07-10 2 views
2

C#でExecuteOracleNonQueryを使用して、ストアドプロシージャを使用してOracleデータベースにレコードをINSERTするが、ROWIDを返すように見えない。 C#のでC#でExecuteOracleNonQueryからROWIDを取得する方法

... Oracleパッケージ内

using (OracleConnection oc= 
    new OracleConnection(AppConfiguration.ConnectionString)) 
{ 
    OracleCommand myCommand = new OracleCommand("PKG_TEST.INSERT", oc); 
    myCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.Parameters.AddWithValue("p_Id", allAssets.Id); 
    myCommand.Parameters.AddWithValue("p_Description", allAssets.Description); 
    OracleString rowId; 
    try 
    { 
     myConnection.Open(); 
     result = myCommand.ExecuteOracleNonQuery(out rowId); 
     allAssets.RowId = rowId.ToString(); 
    } 
    catch(System.Exception ex) 
    { 
     Console.WriteLine(ex.StackTrace); 
    } 
    finally 
    { 
     myConnection.Close(); 
    } 
} 
return result; 

手順...

PROCEDURE insert (
    p_id    IN ALL_ASSETS.id%TYPE, 
    p_description  IN ALL_ASSETS.description%TYPE 
) 
IS 
BEGIN 
    INSERT INTO ALL_ASSETS 
       (id, description) 
     VALUES (p_id, p_description); 
END insert; 

は誰もが、ROWIDが返される方法上の任意の光を当てるしてくださいことはできますか?

EDIT - コードを上記のように変更しましたが、まだROWIDが返されません。また、1つのレコードだけが挿入されています。

ありがとうございました。

答えて

1

Hmmm実際には、ストアドプロシージャのoutパラメータとしてROWIDを指定する必要がありますか?私はExecuteOracleNonQueryが自動的にC#out変数として返すと考えました。

+0

私はそれが私がそれを最初に宣言しなかった理由だと思ったのです。しかし、私はまだ何も戻っていませんでした。 –

+0

SPが正確に1行に影響していることは絶対に確かですか?ドキュメンテーションは、それが返されないかもしれないことを示唆しています... – Calanus

+0

ええ、私はそれをトレースして、1つのレコードだけが挿入されています。 –

2

なぜROWIDが返されると思いますか? DBの最後にはどこに問い合わせてもらえませんでした。プロシージャはROWIDを返さず、どちらを返すのかわかりません。

影響を受けた行のROWIDを自動的に戻すことは、INSERT/UPDATE/MERGEおよびDELETE(ただし、その場合の点はわかりません)でも機能します。

を使用できます。INSERT INTO ALL_ASSETS(id、description)VALUES(p_id、p_description)v_rowidにROWIDを戻します。

v_rowidはPL/SQLの変数となり、追加のパラメータとしてデータベースから戻すことも、プロシージャを関数に変換することもできます。

+0

情報ありがとう、ゲーリー。私はout paramとして自分自身を戻してみましたが、無駄になりました(元のコードはこれを持っていました)。 C#には、このインスタンスのROWIDを返すために使用されるoutキーワードがあります。 MSSQL: "ExecuteOracleNonQueryは、正確に1つの行に影響を与えるINSERT、DELETE、またはUPDATEステートメントを実行している場合、出力パラメータとしてrowidを返すという点でExecuteNonQueryと異なります。これにより、Oracleの行を一意に識別できますその後の関連するクエリでパフォーマンスを向上させることができます。 しかし、これはどのように返されるのかは言及していません! –

関連する問題