C#でOleDBを使用して、MS Access DB(* .mdb)の値を更新しようとしています。バイナリ値で行を選択する必要があることを除いて、特別なことは何もありませんVARBINARY(4)
。
素朴に私はうまくいくと思いUPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE=01020304;
ました。しかし、そうではありません。別の試みは次のとおりです。
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE='01020304';
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE='0x01020304';
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE=0x01020304;
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE=CAST('01020304' as VARBINARY);
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE=CAST(01020304 as VARBINARY);
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE=CAST('01020304' as VARBINARY(4));
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE=CAST(01020304 as VARBINARY(4));
UPDATE MYTABLE SET VALUE= 'new' WHERE BINVALUE=CONVERT(varbinary(4),'01020304');
UPDATE MYTABLE SET VALUE= 'new' WHERE CAST(BINVALUE as VARCHAR(MAX)) = CAST('01020304' as VARCHAR(MAX));
UPDATE MYTABLE SET VALUE= 'new' WHERE CAST(BINVALUE as VARCHAR(MAX)) = CAST(01020304 as VARCHAR(MAX));
UPDATE MYTABLE SET VALUE= 'new' WHERE CONVERT(VARCHAR(MAX), BINVALUE) = CONVERT(VARCHAR(MAX), '01020304');
CAST
結果をで使用しますsyntax error exception: missing operator
。
CONVERT
例外で結果を使用する:Undefined function 'CONVERT' in expression.
の影響を受ける行の数int result
は常にゼロです。作品を使用しUPDATE MYTABLE SET VALUE= 'new' WHERE VALUE= old;
ていますが、複数の行にヒットする場合があります。
チェックを回避する方法を見つけようとして失敗したときBINVALUE
に、WHERE句の値の前後にアラビア語のコンマ(')を使用してはならないことに気付きました。UPDATE MYTABLE SET VALUE= 'new' WHERE VALUE='old';
動作中は動作しませんUPDATE MYTABLE SET VALUE= 'new' WHERE VALUE=old;
。
MSクエリを使用すると、アラビア語のコンマに関して異なる結果が得られます。
UPDATE MYTABLE SET VALUE='new' WHERE BINVALUE='01020304'
実行されますが、効果はありません。
UPDATE MYTABLE SET VALUE='new' WHERE BINVALUE=01020304
「クエリ式'BINVALUE=01020304'の数値の構文エラー」というエラーメッセージが表示されます。
「列BINVALUEを条件に使用できません」というエラーメッセージを再現できません。コメントで触れました。
ほとんどの値は同じであるため、他の列を使用して目的の行を識別することはできません。不思議なことBINVALUE
に、主キーとして機能します。
その上、レガシーアプリケーションがまさにそのようにそれを必要とするので、私はDBスキーマを変更することを許可されていません。
gloomy.penguinの入力に基づいて、WHERE句の型キャスト/マッチングに問題があると思います。これにより、CAST演算子は既知であるように見えますが、CONVERTは既知ではないため、OleDBまたはAccessでキャスト/変換がどのように行われるかという疑問が生じます。私の推測では、CASTには、何らかの理由で標準SQLとは別の構文があります。
何か提案はありますか、この更新クエリをどのように機能させることができますか?
これは私の簡略化されたサンプルコードです:
static String ToHexString(Byte[] buffer)
{
String str;
str = BitConverter.ToString(buffer).Replace("-", string.Empty);
return (str);
}
...
String table = "MYTABLE";
String newvalue = "new";
Byte[] binvalue = { 1, 2, 3, 4 };
String providerStr= @"Provider=Microsoft.JET.OLEDB.4.0;" + @"data source=C:\myDB.mdb";
connection = new OleDbConnection(providerStr);
connection.Open();
String cmd = @"UPDATE " + table + " SET VALUE= '" + newvalue + "'"
+ " WHERE BINVALUE= '" + ToHexString(binvalue) + "'"
+ ";";
OleDbCommand command = new OleDbCommand(cmd, connection);
int result = command.ExecuteNonQuery();
connection.Close();