DOBON.NETプログラミング道掲示板

■34484 / 親記事)  Access OLEでExecuteNonQuery
  
□投稿者/ み 一般人(1回)-(2020/06/16(Tue) 02:06:47)
  • アイコン環境/言語:[VS2019 NET4.5] 
    分類:[.NET] 

    こんにちは「み」ともうします。
    下記C#2019 AccessDBに対してデータ登録(update)するコードです。
    
    StrSQL = "UPDATE TABLE1 SET DATA1 = @D1 WHERE D2 = @WKEY"
    ExecuteNonQueryの実行後で処理件数は0が返ります。
    ちなみに(insert)はうまくいきます。
    現在updateのみ失敗します(いろんなテーブルにためにましたが0件でした。
    元ソースのSQL-SERVERからAccessのOLE接続にしたためなにか
    不都合な箇所がありますでしょうか
    よろしくお願い致します。
    
    using (OleDbConnection conn = new OleDbConnection(ConnectionString))
    {
        try
        {
            conn.Open();
            using (OleDbCommand cmd = new OleDbCommand(StrSQL, conn))
            {
                cmd.Parameters.Clear();
                cmd.Connection = conn;
    
                para = "@WKEY";
                cmd.Parameters.Add(new OleDbParameter(para, OleDbType.VarChar));
                cmd.Parameters[para].Direction = ParameterDirection.Input;
                cmd.Parameters[para].Value = "TEST";
    
                para = "@D1";
                cmd.Parameters.Add(new OleDbParameter(para, OleDbType.Integer));
                cmd.Parameters[para].Direction = ParameterDirection.Input;
                cmd.Parameters[para].Value = 1;
                int s =  cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
        }
    }

マルチポストを報告
違反を報告
引用返信 削除キー/
■34485 / ResNo.1)  Re[1]: Access OLEでExecuteNonQuery
□投稿者/ Hongliang 大御所(580回)-(2020/06/16(Tue) 09:27:04)
  • アイコン2020/06/16(Tue) 14:59:34 編集(投稿者)

    > StrSQL = "UPDATE TABLE1 SET DATA1 = @D1 WHERE D2 = @WKEY"

    > para = "@WKEY";
    > cmd.Parameters.Add(new OleDbParameter(para, OleDbType.VarChar));
    > cmd.Parameters[para].Direction = ParameterDirection.Input;
    > cmd.Parameters[para].Value = "TEST";
    >
    > para = "@D1";
    > cmd.Parameters.Add(new OleDbParameter(para, OleDbType.Integer));
    > cmd.Parameters[para].Direction = ParameterDirection.Input;
    > cmd.Parameters[para].Value = 1;

    OLEDBの仕様からくるものだったかと思いますが、OleDbCommandのパラメータは、名前を無視して、単純にAddされた順に、クエリのパラメータ部分に当てはめていく仕様のはずです。
    なのでこの場合、クエリに最初に出現するパラメータ DATA = @D1 のところに、最初にAddされたパラメータ Name:="@WKEY", Type:=OleDbType.VarChar, Value:="TEST" が当てはめられることになります。

    // OleDbを使う場合はクエリ内のパラメータ指示子は基本的に ? を使うので、@xxx が使えるのは知りませんでした。
    // でもどうせ名前は使われないので却ってややこしい部分もありますね。
違反を報告
引用返信 削除キー/
■34486 / ResNo.2)  Re[2]: Access OLEでExecuteNonQuery
□投稿者/ み 一般人(2回)-(2020/06/16(Tue) 21:54:16)
  • アイコンHongliangさん 返信ありがとうございます。
    順番を変えてたところ正常に処理されました。
    そうかOLEは順番どうりにしないとだめなんですね・・
    AddしないでSQL文からReplaceで文字列変換した方が保守しやすいかも。
    ありがとうございました。


    No34485に返信(Hongliangさんの記事)
    >
    > OLEDBの仕様からくるものだったかと思いますが、OleDbCommandのパラメータは、名前を無視して、単純にAddされた順に、クエリのパラメータ部分に当てはめていく仕様のはずです。
    > なのでこの場合、クエリに最初に出現するパラメータ DATA = @D1 のところに、最初にAddされたパラメータ Name:="@WKEY", Type:=OleDbType.VarChar, Value:="TEST" が当てはめられることになります。

解決み!
違反を報告
引用返信 削除キー/
■34487 / ResNo.3)  Re[3]: Access OLEでExecuteNonQuery
□投稿者/ Hongliang 大御所(581回)-(2020/06/17(Wed) 09:14:19)
  • アイコン> AddしないでSQL文からReplaceで文字列変換した方が保守しやすいかも。

    静的な文字列ならともかく、外部から入力される文字列を直接クエリに混ぜ込むのはNGです。
    SQLインジェクションを起こす典型的なパターンです。
    必ずパラメータを使いましょう。
解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -