5

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();
4

1 に答える 1

0

私が直面している型キャストの問題を解決する方法を見つけました。どうやら、SQL構文を使用することはできませんが、パラメーターを指定してコマンドを使用することはできません。

それ以外の:

String cmd = @"UPDATE " + table + " SET VALUE= '" + newvalue + "'"
    + " WHERE BINVALUE= '" + ToHexString(binvalue) + "'"
    + ";";

OleDbCommand command = new OleDbCommand(cmd, connection);
int result = command.ExecuteNonQuery();

私は使用しなければなりませんでした:

String cmd = @"UPDATE " + table + " SET VALUE= '" + newvalue + "'"
    + " WHERE BINVALUE= @binval" + ";";

OleDbCommand command = new OleDbCommand(cmd, connection);

OleDbParameter param = new OleDbParameter();
param.OleDbType = OleDbType.Binary;
param.ParameterName = "binval";
param.Value = binvalue;
command.Parameters.Add(param);

int result = command.ExecuteNonQuery();

もちろん、この方法ですべてのパラメーターを追加する方がクリーンです。重要な部分を強調するためにそれを省略しました。

さらに読むために、 C#ヘルパーブログのDBにバイナリデータとして画像を読み書きする方法の例。

于 2012-10-02T10:42:59.887 に答える