2

次の列名とタイプのOracle11gテーブルがあります。

ID VARCHAR2(32 BYTE)
VERSION VARCHAR2(12 BYTE)

ODP.NETとC#を使用して、このテーブルのUpdateステートメントのOracleパラメーター化コマンドでバインド変数を機能させようとしていますが、うまくいきません。これが私が使用しているコードです:

string constr = gconstr + "; Data Source=" + db;
OracleConnection con = new OracleConnection(constr);
con.Open();
ddiId = "WS_5043";
ddiVer = "1.0.3";

string UPDATE_CLOB_QUERY = "UPDATE :ddiTable SET version=:ddiVer WHERE id=:ddiId";

Oracle.DataAccess.Types.OracleXmlType ret;
OracleCommand oracleCommand2 = new OracleCommand(UPDATE_CLOB_QUERY, con);
oracleCommand2.Parameters.Clear();
oracleCommand2.Parameters.Add("ddiId", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiId;
oracleCommand2.Parameters.Add("ddiTable", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiTable;
oracleCommand2.Parameters.Add("ddiVer", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiVer;
oracleCommand2.ExecuteNonQuery();
oracleCommand2.Dispose();

上記のコードをVS2010で実行すると、次のOracleエラーが発生します。

ORA-01036: illegal variable name/number

ただし、SQLでバインド変数宣言を削除すると、上記は機能します。

string UPDATE_CLOB_QUERY = "UPDATE wstable SET version='1.0.2' WHERE id='WS_5043'";

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

バインド変数とパラメーター化されたOracleコマンドを、上記のようなSQL Updateコマンドで動作させる方法を知る必要があります。これは、最終的に他のテーブルのラージCLOBを更新し始めるためです(もちろん、SQLで文字列としてCLOBを連結します)。サイズ制限エラーが発生します)。したがって、これを機能させることが最初の勝利になります。

4

1 に答える 1

2

この行では;

oracleCommand2.Parameters.Add("ddiTable", OracleDbType.Varchar2, ParameterDirection.Input).Value = ddiTable;

実際には、パラメータとしてテーブル名()を追加しようとしますddiTable。あなたはそれをすることはできません。また、クエリテーブル名をパラメータとして追加する意味はありません。またParameters.Add()、3つのパラメーターを持つメソッドを使用する場合は、次のようなパラメーターとして使用する必要があります。

public OracleParameter Add(
    string parameterName,
    OracleType dataType,
    int size
)

これが唯一のオーバーロード方法です。ParameterDirection.Inputメソッドの3番目のパラメータータイプを取得するためのオーバーロードはありませんParameters.Add()

要件として、上記のようなSQLUpdateコマンドで動作するバインド変数とパラメーター化されたOracleコマンドを取得する方法を知る必要があります。

これらを読むことをお勧めします。

于 2013-01-08T22:48:12.600 に答える