【问题标题】:ExecuteNonQuery returning -1 when using sql COUNT despite the query string尽管有查询字符串,但在使用 sql COUNT 时 ExecuteNonQuery 返回 -1
【发布时间】:2016-10-29 20:28:22
【问题描述】:

由于某种原因,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 的一行。

【问题讨论】:

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


【解决方案1】:

你可以像这个例子一样在 Ado.net 中使用 Ef 核心

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();
    }
}

【讨论】:

    【解决方案2】:

    基于MSDN:

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

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

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

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

    【讨论】:

    • 好答案,值得一提的是 ExecuteScaler 的细节,来自 MSDN Executes the query, and returns the first column of the first row in the result set returned by the query. Additional columns or rows are ignored.
    • 谢谢!效果很好!我将不得不在 MSDN 中查找ExecuteScaler,因为我不熟悉cmd.ExecuteScalar() 之前的(int) 语法;
    • 这可以稍作修改:我得到的结果是long 而不是int,尝试强制转换为 int 会引发异常。
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多