gpt4 book ai didi

c# - 使用二进制列作为比较标准

转载 作者:太空狗 更新时间:2023-10-29 23:52:07 27 4
gpt4 key购买 nike

我正在尝试使用 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 Query 会产生关于阿拉伯逗号的不同结果:

UPDATE MYTABLE SET VALUE='new' WHERE BINVALUE='01020304'执行,但没有效果。

UPDATE MYTABLE SET VALUE='new' WHERE BINVALUE=01020304导致错误消息“查询表达式‘BINVALUE=01020304’中的数字语法错误。”

我无法重现错误消息“Column BINVALUE can't be used in the criteria”。我在评论中提到的。

使用其他列来标识所需的行是行不通的,因为大多数值都是相同的。奇怪的是BINVALUE作为主键。

最重要的是,我不允许更改数据库模式,因为遗留应用程序正是需要它。

根据 gloomy.penguin 的输入,我假设 WHERE 子句中的类型转换/匹配存在问题。这导致了一个问题,即如何在 OleDB 或 Access 中完成转换/转换,因为 CAST 运算符似乎是已知的,但 CONVERT 不是。我的猜测是,出于某种原因,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();

最佳答案

我找到了解决我一直面临的类型转换问题的方法。显然不可能使用 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# helper blog 上.

关于c# - 使用二进制列作为比较标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com