尽管有查询字符串,但在使用 sql COUNT 时 ExecuteNonQuery 返回 -1
Posted
技术标签:
【中文标题】尽管有查询字符串,但在使用 sql COUNT 时 ExecuteNonQuery 返回 -1【英文标题】:ExecuteNonQuery returning -1 when using sql COUNT despite the query string 【发布时间】: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
的一行。
【问题讨论】:
ExecuteNonQuery for SELECT sql statement returning no rows的可能重复 【参考方案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 的细节,来自 MSDNExecutes 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 会引发异常。以上是关于尽管有查询字符串,但在使用 sql COUNT 时 ExecuteNonQuery 返回 -1的主要内容,如果未能解决你的问题,请参考以下文章
Redshift Python UDF 自行运行,但在部分使用 count 或作为另一个查询的一部分时会引发错误