JET OLEDB 参数如何将字符串与 Access DB 中的文本字段进行比较

Posted

技术标签:

【中文标题】JET OLEDB 参数如何将字符串与 Access DB 中的文本字段进行比较【英文标题】:How does JET OLEDB Parameters compare strings with text field in and Access DB 【发布时间】:2013-02-20 17:27:09 【问题描述】:

我在 C# 中有以下更新查询,使用 JET OLEDB 连接,连接到 ms 访问 DB 文件。查询未能更改字段,它运行正确但仅更改了 0 行。

我认为问题在于如何处理参数并与数据库进行比较,但不知道如何解决。

“用户”列设置为文本。我有一个插入语句,它以与参数相同的方式完美设置。

com.CommandText = "UPDATE [ExamMaster] SET [User] =  (DLookup('LName', 'Users', 'ID' = '@correctUser') WHERE [User] = '@user'";

com.Parameters.AddWithValue("@correctUser", correctUser);
com.Parameters.AddWithValue("@user", userName);

如果我不使用 where 子句的参数,而是将其插入到命令字符串中,如下所示:

WHERE [User] = '"+userName+"'";</code>

它会更新数据库就好了。我在这里想念什么? 更新: 带或带单引号没有区别,重新排列参数的顺序也不起作用。

【问题讨论】:

尝试删除引号并使用字符串文字:@"UPDATE [ExamMaster] SET [User] = (DLookup(""LName"", ""Users"", ""ID = @correctUser"") WHERE [User] = @user"; 【参考方案1】:

顺序很重要。由于 DLOOKUP 功能,我在您的查询中“认为”usercorrectUser 之前首先被调用。

com.Parameters.AddWithValue("@user", userName);
com.Parameters.AddWithValue("@correctUser", correctUser);

你不需要单引号参数:

WHERE [User] = @user";

我猜 DLOOKUP 也不需要单引号,如果字段名称有空格或者是保留字(可能是 [User]),则只需要 [brackets]。

【讨论】:

我发现Access不支持命名参数但仍然会接受它们,但你必须确保你添加它们的顺序与查询相同【参考方案2】:

你需要稍微改变一下,试试:

OleDbConnection cn = new OleDbConnection(aconnectionstring);
cn.Open();

//testing
int correctUser = 1;
string userName = "1";

OleDbCommand com = new OleDbCommand();
com.Connection = cn;

//You cannot have a parameter in DLookUp
com.CommandText = "UPDATE [ExamMaster] SET [User] = " +
   "DLookup('LName', 'Users', 'ID = " + correctUser + "') WHERE [User] = @user";

com.Parameters.AddWithValue("@user", userName);

//You must execute the query
com.ExecuteNonQuery();

【讨论】:

以上是关于JET OLEDB 参数如何将字符串与 Access DB 中的文本字段进行比较的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft.Jet.OLEDB.4.0 转换字符

Microsoft.Jet.OLEDB.4.0 与 Microsoft.ACE.OLEDB.12.0,我应该使用哪个?

使用 microsoft.jet.oledb.4.0 从 paradox db 过滤日期字段

Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别

Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别(转)

使用 Jet Oledb 读取文本文件并关闭标题 (HDR=No)