看起来你已经得到了答案,但是我想指出你示例代码中的一些问题:
sqlQuery = "SELECT [ID] from [users] WHERE CallerName=@CallerName";
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
cmd = new OleDbCommand(sqlQuery, conn);
cmd.CommandText = sqlQuery;
cmd.Parameters.Add("@CallerName", OleDbType.VarChar).Value = labelProblemDate.Text.Trim();
cmd.Parameters["@CallerName"].Value = name;
cmd.ExecuteNonQuery();
conn.Close();
首先,注意到您的SQL查询使用的是Microsoft SQL语法,而Microsoft Access更喜欢稍微不同的语法。不要用方括号包含您的列名,而是使用波浪线:
sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=@CallerName";
接下来,在您的SQL查询中,请注意Microsoft Access不接受命名参数。 您上面使用的
@CallerName
SQL文本将没有问题地执行,但是所有OleDb对象将看到以下内容:
sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";
如果您决定使用存储过程而不是文本SQL,请记得在添加参数并执行命令前,在
OleDbCommand
上调用
Prepare()。
如果您有多个参数,请确保按照SQL文本中调用它们的顺序将这些参数添加到
OleDbCommand
中。OleDb不关心您如何命名它们,但您可以使用它们来帮助自己;它不会在查询中使用。例如,
@CallerName
将不会尝试与SQL文本中的任何内容匹配。
接下来,我想看一下您对
OleDbParameter
项的使用。在下面的两行中,您正在向
OleDbCommand
添加一个(1)值为
labelProblemDate.Text.Trim()的参数,然后在紧接着的下一行中,您正在
重新分配相同参数的值给一个名为
name
的变量(我们不知道该变量是什么)。声明具有一个值的参数然后将其重新分配给其他值没有任何好处。
您可以使用以下修改后的片段并获得相同的结果(请记得添加大小字段,如下所示,并在数据库中指定):
cmd.Parameters.Add("@CallerName", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim()
// cmd.Parameters["@CallerName"].Value = name
同样地,您的
OleDbCommand
正在使用您的
sqlQuery
参数创建,因此指定命令的
CommandText
属性是不必要的:
cmd = new OleDbCommand(sqlQuery, conn);
//cmd.CommandText = sqlQuery;
最后,像其他人说的那样,如果您想查询您的数据,就必须读取数据,而不是调用ExecuteNonQuery()
(注意它被称为非查询)。
总之,我在这里写出来:
sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";
int result = 0;
OleDbConnection conn = new OleDbConnection(connectionString);
try {
conn.Open();
var cmd = new OleDbCommand(sqlQuery, conn);
cmd.Parameters.Add("?", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim();
using (OleDbDataReader reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
reader.Read();
result = reader.GetInt32(0);
}
}
} finally {
conn.Close();
}
return result;
始终将 Close 放在 finally 块中,以防程序因任何原因抛出错误。这可以防止应用程序崩溃并保持文件打开状态。我发现,using 子句不一定在完成后关闭连接(就像它们应该做的那样)。
希望这可以帮助您。我目前正在刷新我对 OleDb 的了解,并想指出一些事情。
@CallerName
参数上有点混淆。变量 "name" 是什么?此外,ExecuteNonQuery
不会执行选择操作。 - SteSELECT TOP 1 ID FROM [users] WHERE CallerName=@CallerName
。然后使用ExecuteScalar
(链接在内)只检索所选ID中的一个(如果有的话)。 - Tim Schmelter