2017-12-20 72 views
0

「抽出条件式でのデータ型の不一致」を与える私は、次のコードを持っている:cmd_operの第2の変形(コードの先頭にコメントしていない1)で更新コマンドは

/* 
// it works 
cmd_oper = "UPDATE [Model Elements] SET [Record Status] = \"Disabled\" WHERE [Index] = @db_idx"; 
/*/ 
// it doesn't work 
cmd_oper = "UPDATE [Model Elements] SET [Record Status] = @stat WHERE [Index] = @db_idx"; 
//*/ 
using(OleDbCommand cmd = new OleDbCommand(cmd_oper, svr_conn)) 
{ 
    cmd.Parameters.Add("@db_idx", OleDbType.Integer).Value = 2; 
    //cmd.Parameters.Add("@stat", OleDbType.VarChar).Value = "Disabled"; 
    cmd.Parameters.AddWithValue("@stat", "Disabled"); 
    cmd.ExecuteNonQuery(); 
} 

を私は "取得「条件式のデータ型の不一致」。もう1つは動作します。レコード状態列のタイプは、データベース内で「ショートテキスト」として設定されます。私はStackOverflowにこのエラーに関連する多くの投稿があることを知っていますが、私は正確なフィットを見つけることができませんでした。ありがとう。

+1

oledbを使用すると、SQLステートメントに表示される順序でパラメータを提供する必要があります。 –

+0

パラメータにvarcharの長さを追加する必要があります:cmd.Parameters.Add( "@stat"、OleDbType.VarChar、100)。値= "無効"; –

+0

@mh__いいえ、それは必要ではありませんが、より良いが必要ではありません – Steve

答えて

1

細かいマニュアル、https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspxはパラメータ

についてOLE DB .NETプロバイダは、SQL文または のOleDbCommandによって呼び出されたストアドプロシージャに パラメータを渡すための名前付きパラメータをサポートしていないと言って、次のいCommandTypeがTextに設定されている場合。この場合、疑問符(?)のプレースホルダーを使用する必要があります( )。例:

SELECT * FROM Customers WHERE CustomerID =?

したがって、OleDbParameterオブジェクトは OleDbParameterCollectionに添加される順序は、直接コマンド・テキスト内のパラメータのための 疑問符プレースホルダの位置に対応しなければなりません。

エルゴ、私はあなたのようであるためにあなたのコードが必要だと思う:それは価値がある何のため

cmd_oper = "UPDATE [Model Elements] SET [Record Status] = ? WHERE [Index] = ?"; 
using(OleDbCommand cmd = new OleDbCommand(cmd_oper, svr_conn)) 
{ 
    cmd.Parameters.AddWithValue("anything-name-doesnt-matter", "Disabled"); 
    cmd.Parameters.Add("its-position-that-matters", OleDbType.Integer).Value = 2; 
    cmd.ExecuteNonQuery(); 
} 

、あなたはおそらく名前が無関係であることを実証するために、私は上記の彼らが愚かという名前(賢明にあなたのパラメータに名前を付ける必要がありますちょうど茶で、

ここ
cmd.Parameters["its-position-that-matters"].Value = 3; 
    cmd.ExecuteNonQuery(); 
    cmd.Parameters["its-position-that-matters"].Value = 4; 
    cmd.ExecuteNonQuery(); 
    cmd.Parameters["its-position-that-matters"].Value = 5; 
    cmd.ExecuteNonQuery(); 
    cmd.Parameters["its-position-that-matters"].Value = 6; 
    cmd.ExecuteNonQuery(); 

は、私があまりにもindex値3、4、5と6のアップデートを実行しました:アイデアが一度準備されていることをので)、あなたは多くの時間がちょうどパラメータを変更する文を実行することができますパラメータ値を変更して再実行します。したがって、コードをより読みやすくするために、「インデックス」パラメータの賢明な名前を選択することが良いと思います。しかし、名前は無視されます(本質的には?のマークとして扱われます)ので、プレースホルダが表示されるのと同じ順序でパラメータ値を追加する必要があります。クエリでプレースホルダを繰り返した場合は、それを繰り返してパラメータコレクションに追加する必要があります。私はsteveのアサーションの正確さについてコメントはしていません。私はいつも、これは本当にあなたがEntity Frameworkのようなデータアクセスライブラリを使用するように学習に入ると、あなたのボタンのクリックイベントハンドラにSQL文字列を書き込みを停止する必要があり、すべての良い証拠で、最終的に

?を使用しました - そうではありませんコードを書くための良い方法です最初からEFを使用していた場合、この問題に遭遇したことはありません。しかし、あなたはパラメータ化されたクエリを使用して良いです。今すぐEFをチェックして、この90年代のロバートな方法でデータアクセスをやめてください。

関連する問題