尽管使用了查询字符串,但在使用sql COUNT时,ExecuteNonQuery返回-1

时间:2016-06-27 18:10:08

标签: c# sql sql-server ado.net executenonquery

出于某种原因,C#中的ExecuteNonQuery()会返回-1,但是当我单独运行查询时,该值会返回所需的实际值。

例如:

try
{

    var connString ="Data Source=ServerName;InitialCatalog=DatabaseName;Integrated Security=true;"
    SqlConnection conn = new SqlConnection(connString);

    SqlCommand someCmd = new SqlCommand("SELECT COUNT(*) FROM SomeTable");

    someCmd.Connection = conn;

    conn.Open();

    var theCount = cmd.ExecuteNonQuery();

    conn.Close();
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}

执行命令时,返回-1。虽然如果单独运行查询,

SELECT COUNT(*) FROM SomeTable;

如果要查询的表具有4行,则列将返回一行,其计数为4

2 个答案:

答案 0 :(得分:9)

基于MSDN

  

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。

您希望返回受命令影响的行数,并将其保存到int变量,但由于语句类型为select所以它返回-1

解决方案:如果要获取受SELECT命令影响的行数并将其保存到int变量,可以使用ExecuteScalar

var theCount = (int)cmd.ExecuteScalar();

答案 1 :(得分:0)

您可以将Ef核心与Ado.net一起使用,例如

var context = new SampleDbContext();
using (var connection = context.Database.GetDbConnection())
{
    connection.Open();

    using (var command = connection.CreateCommand())
    {
        command.CommandText = "SELECT COUNT(*) FROM SomeTable";
        var result = command.ExecuteScalar().ToString();
    }
}