从OleDbCommand返回值

Coc*_*Dev 5 c# sql oledb parameters sqlparameter

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();
Run Code Online (Sandbox Code Playgroud)

我被告知这是如何使用参数从SELECT查询中读取数据,但它不起作用.我想我做错了什么.

我正在使用WinForms和Microsoft Access 2007

jp2*_*ode 7

看起来你有答案,但我想从你的示例代码中指出一些内容:

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();
Run Code Online (Sandbox Code Playgroud)

首先,请注意您的SQL查询使用Microsoft SQL语法,并且Microsoft Access更喜欢稍微不同的语法.不要将列名包装在方括号中,而是使用波浪号标记:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=@CallerName";
Run Code Online (Sandbox Code Playgroud)

接下来,在SQL查询中,请注意Microsoft Access不接受命名参数.上面使用的SQL文本@CallerName将执行没有问题,但所有OleDb对象都会看到:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";
Run Code Online (Sandbox Code Playgroud)

如果在某一点以后,你决定去与存储过程而不是文字SQL,记得打电话准备()在您OleDbCommand将您的参数后执行命令前.

如果您有多个参数,请确保OleDbCommand按照在SQL文本中调用它们的顺序将这些参数添加到您的参数中.OleDb并不关心你的名字,但是你可以自己使用它们来帮助你; 它不在查询中使用.@CallerName将不会尝试与SQL文本中的任何内容匹配.

接下来,我想看一下你对这个OleDbParameter项目的用法.在下面的两行中,您将OleDbCommand使用值labelProblemDate.Text.Trim()向您添加一(1)个参数,并在下一行中将相同参数的值重新分配给变量(我们不知道) )叫name.使用一个值声明参数然后将其重新分配给其他值对您没有任何好处.

您可以使用下面的修改后的片段并获得相同的结果(请记住添加大小字段,如下所示并在数据库中指定):

cmd.Parameters.Add("@CallerName", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim();
// cmd.Parameters["@CallerName"].Value = name;
Run Code Online (Sandbox Code Playgroud)

同样,您OleDbCommandsqlQuery参数是使用参数创建的,因此CommandText不需要指定命令的属性:

cmd = new OleDbCommand(sqlQuery, conn);
//cmd.CommandText = sqlQuery;
Run Code Online (Sandbox Code Playgroud)

最后,正如其他人所说,如果你想查询你的SQL语句建议的数据,你必须读取数据而不是调用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.CommandText = sqlQuery; This command was specified by your initializer
  cmd.Parameters.Add("?", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim();
  //cmd.Parameters["@CallerName"].Value = name; Possible bug here
  using (OleDbDataReader reader = cmd.ExecuteReader())
  {
    if(reader.HasRows)
    {
      reader.Read();
      result = reader.GetInt32(0);
    }
  }
} finally {
  conn.Close();
}
return result;
Run Code Online (Sandbox Code Playgroud)

始终将Close放在一个finally块中,以防程序因任何原因抛出错误.这可以防止应用程序崩溃并使文件保持打开状态.using我发现,一个子句在完成连接时不一定会关闭连接(就像它们应该这样做).

我希望这有帮助.我现在正在刷新我的知识OleDb,并想指出一些事情.


Ste*_*eve 6

ExecuteNonQuery不返回数据,只返回受命令影响的行
您需要将ExecuteReader与OleDbDataReader一起使用

OleDbDataReader reader = cmd.ExecuteReader();           
if(reader.HasRows)
{
    reader.Read();
    var result = reader.GetInt32(0);
}
Run Code Online (Sandbox Code Playgroud)