1

データベース テーブルのセットを動的に更新しようとしています。2 つの変数があります。 table_name& field_name. これらはforeach、 をループするループによって取り込まれますDataTableDataTable名前の新しい行にヒットするたびに、それぞれ変更されます。このループ内で、新しい Oracle 接続を作成し、現在の table_name/field_name で更新を書き込もうとします。しかし、オラクルは私のExcecuteNonQueryコマンドでエラーを出し続けます。どんな助けでも大歓迎です!!

編集:パラメーターを含めるように再フォーマットしましたが、まだ機能しません。私が間違っていることについて誰か考えがありますか?

foreach (DataRow fieldtable in setofTables.Tables[0].Rows)
{

    //do work                   
    table_name = fieldtable["table_name"].ToString().Trim();
    field_name = fieldtable["field_name"].ToString().Trim();

    MessageBox.Show(table_name + field_name);

    //create parameters

    OracleParameter fieldParamater = new OracleParameter("field_name", OracleDbType.Varchar2);
    OracleParameter diffParameter = new OracleParameter("mark_diff_oracle", OracleDbType.BinaryFloat);
    OracleParameter wellIdParameter = new OracleParameter("id", OracleDbType.Char);
    //wellIdParameter.Size = 10;

    //create oracle connection and open 
    OracleConnection OrclCon2 = new OracleConnection("Data Source=" + dbname + "; User Id=" + userid + ";Password=" + password1 + ";");
    OrclCon2.Open();

    //prepare sql to be passed to oracle 
    string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where  id = ':id' and :field_name is not null;";
    MessageBox.Show(UpdateOraSQL);   



    //create dommand
    OracleCommand UpdateDB = new OracleCommand(UpdateOraSQL, OrclCon2);
    UpdateDB.CommandType = CommandType.Text;
    //add parameters
    UpdateDB.Parameters.Clear();
    UpdateDB.Prepare();
    UpdateDB.Parameters.Add(fieldParamater).Value = field_name;
    UpdateDB.Parameters.Add(diffParameter).Value = mark_diff_oracle;
    UpdateDB.Parameters.Add(wellIdParameter).Value = id;
4

3 に答える 3

2

私の知る限り、パラメーターを使用して更新する列を定義することはできません。私の知る限り、設定したい値に対してのみパラメータを使用できます。

したがって、文字列連結を使用してクエリを作成する必要があります。

string sql = "UPDATE " + tableName + " SET " + fieldName + " = :p_Value  WHERE id = :p_Id";

OracleCommand UpdateDB = new OracleCommand(sql, OrclCon2);

UpdateDB.Parameters.Add ("p_Value", ... ).Value = "foo";
UpdateDB.Parameters.Add ("p_Id", ...).Value = 4;

もちろん、文字列に追加する変数に有害なステートメントが含まれていないことを確認する必要があります。それらに対してサニティチェックを行う必要があります。
おそらく、渡された tableName または fieldName が有効/既存の tableName/columnname であるかどうかを確認することもできます。

于 2013-01-23T21:23:38.293 に答える
2

SQL ステートメントの末尾からセミコロンを削除します。次のコードを変更します

string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where  id = ':id' and :field_name is not null;";

string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where  id = ':id' and :field_name is not null";

詳細については、次のリンクを参照してください。

C# の場合に OracleCommand の CommandText にセミコロンを配置できない理由

それでも問題が解決しない場合は、例外メッセージ全体も投稿すると役立つ場合があります。

于 2013-01-23T21:19:10.610 に答える
1

SQLでは、とは言いませんCOLUMN <> NULL。適切な構文はCOLUMN IS NOT NULL.

于 2013-01-23T20:29:59.167 に答える