尽管使用了查询字符串,但在使用sql COUNT时,ExecuteNonQuery返回-1
出于某种原因,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
。
基于MSDN :
对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。 当插入或更新的表上存在触发器时,返回值包括插入或更新操作所影响的行数以及受触发器或触发器影响的行数。 对于所有其他类型的语句,返回值为-1。 如果发生回滚,则返回值也为-1。
您希望返回受命令影响的行数并将其保存到int
变量,但由于语句类型为select
因此返回-1
。
解决方案 :如果要获取受SELECT命令影响的行数并将其保存到int变量,则可以使用ExecuteScalar
。
var theCount = (int)cmd.ExecuteScalar();
你可以像这个例子一样使用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(); } }