我正在开发一个项目,我希望能够向SQL Server发送命令并运行查询。我已成功使用Joel的非常好的教程将查询返回到列表框: creating a database query METHOD
我现在正在尝试调整它来执行一些命令,然后运行查询以检查命令是否有效。我的查询失败了,因为我认为命令不起作用。
目前我发送的是:
MySqlCommand("CREATE TABLE #CSVTest_Data" +
"(FirstTimeTaken DATETIME," +
"LatestTimeTaken DATETIME," +
"Market VARCHAR(50)," +
"Outcome VARCHAR(50),"+
"Odds DECIMAL(18,2)," +
"NumberOfBets INT," +
"VolumeMatched DECIMAL(18,2),"+
"InPlay TINYINT)");
进入这个:
private void MySqlCommand(string sql)
{
int numberOfRecords;
//string result;
using (var connection = GetConnection())
using (var command = new SqlCommand(sql, connection))
{
connection.Open();
numberOfRecords = command.ExecuteNonQuery();
}
MessageBox.Show(numberOfRecords.ToString());
}
我的理解是ExecuteNonQuery返回受影响的行数的整数。我的消息框显示值-1。在SQL Server中运行相同的命令将返回“命令已成功完成”。如果有人能告诉我我的MySqlCommand方法是否正常以及如何通过运行该函数返回输出的SQL Server消息,我将不胜感激。
答案 0 :(得分:5)
为了获取输出到SQL Server Management Studio中“消息”选项卡的消息,“控制台”在SQL Server上执行SQL语句时,必须挂钩InfoMessage event on the SqlConnection class:
using (var connection = GetConnection())
using (var command = new SqlCommand(sql, connection))
{
connection.InfoMessage += (s, e) =>
{
Debug.WriteLine(e.Message);
};
connection.Open();
numberOfRecords = command.ExecuteNonQuery();
}
显然,您需要以与上面显示的内容不同的方式处理事件,此处e
参数还有其他属性,有关详细信息,请参阅SqlInfoMessageEventArgs。
NOW 已经说过了,请记住,输出到SQL Server Management Studio中的消息选项卡的一些消息是由该程序生成的,并且不会发起从服务器本身来看,所以你询问的特定信息是否会通过该事件显示出来,我无法肯定地说。
此外,在这种特定类型的SQL语句中,ExecuteNonQuery
的正确返回值实际上是-1,as is documented:
对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数。 对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。
(我的重点)
答案 1 :(得分:3)
更改
var numberOfRecords = command.ExecuteNonQuery();
到
var numberOfRecords = command.ExecuteScalar();
另外,请查看SqlCommand Methods
答案 2 :(得分:2)
您应该使用 ExecuteScalar 。
当您的查询返回一个值时,通常会使用ExecuteScalar 。
ExecuteNonQuery 用于更新,插入,创建等SQL语句。
所以将其改为
numberOfRecords = (int)command.ExecuteNonQuery();
答案 3 :(得分:1)
以下是MSDN对ExecuteNonQuery
的评论:
对于UPDATE,INSERT和DELETE语句,返回值为 受命令影响的行数。 ... 对于所有其他类型的 语句,返回值为-1。
由于您既不执行UPDATE
也不执行INSERT
也不执行DELETE
- 即使操作成功,您也会收到-1。基本上你可以假设如果没有抛出SqlException
- 你的CREATE
语句有效。
答案 4 :(得分:0)
numberOfRecords=(int) command.ExecuteScalar();