我正在尝试在C#代码中运行SQL Select查询。但我总是在
上得到-1输出int result = command.ExecuteNonQuery();
但是,如果我使用delete
或insert
,那么相同的表格
ConnectString
也没关系。
请检查以下代码
SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password=");
conn.Open();
SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn);
//command.Parameters.AddWithValue("@zip","india");
int result = command.ExecuteNonQuery();
// result gives the -1 output.. but on insert its 1
using (SqlDataReader reader = command.ExecuteReader())
{
// iterate your results here
Console.WriteLine(String.Format("{0}",reader["id"]));
}
conn.Close();
查询在SQL Server上运行正常,但我不明白为什么只有select查询不起作用。
所有其他查询都有效。
答案 0 :(得分:33)
SqlCommand.ExecuteNonQuery方法
您可以使用ExecuteNonQuery执行目录操作(例如,查询数据库的结构或创建数据库对象,例如表),或者通过执行UPDATE,INSERT或更改数据库而不使用DataSet来更改数据DELETE语句。 虽然ExecuteNonQuery不返回任何行,但是映射到参数的任何输出参数或返回值都会填充数据。 对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。
SqlCommand.ExecuteScalar方法 对连接执行Transact-SQL语句并返回受影响的行数。
所以没有。 SELECT语句返回的语句必须使用ExecuteScalar方法。
请尝试以下代码:
SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password=");
conn.Open();
SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn);
command.Parameters.AddWithValue("@zip","india");
// int result = command.ExecuteNonQuery();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
Console.WriteLine(String.Format("{0}",reader["id"]));
}
}
conn.Close();
答案 1 :(得分:8)
根据MSDN
结果 受影响的行数 ,并且由于您的查询为select
,因此不会影响行(即插入,删除或更新)无论如何。
如果您想要返回查询的单行,请使用ExecuteScalar()
代替ExecuteNonQuery()
:
int result = (int) (command.ExecuteScalar());
但是,如果您希望返回多行,则ExecuteReader()
是唯一的选择:
using (SqlDataReader reader = command.ExecuteReader()) {
while (reader.Read()) {
int result = reader.GetInt32(0);
...
}
}
答案 2 :(得分:4)
您可以使用ExecuteScalar()
代替ExecuteNonQuery()
来获得单个结果
像这样使用它
Int32 result= (Int32) command.ExecuteScalar();
Console.WriteLine(String.Format("{0}", result));
它将执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。
由于您只需要返回一行,请从代码中删除SqlDataReader
的使用
using (SqlDataReader reader = command.ExecuteReader())
{
// iterate your results here
Console.WriteLine(String.Format("{0}",reader["id"]));
}
因为它会再次执行您的命令并影响您的页面效果。
答案 3 :(得分:3)
这是设计上的。
对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。
答案 4 :(得分:3)
你必须添加参数@zip
SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password=");
conn.Open();
SqlCommand command = new SqlCommand("Select id from [table1] where name=@zip", conn);
//
// Add new SqlParameter to the command.
//
command.Parameters.AddWithValue("@zip","india");
int result = (Int32) (command.ExecuteScalar());
using (SqlDataReader reader = command.ExecuteReader())
{
// iterate your results here
Console.WriteLine(String.Format("{0}",reader["id"]));
}
conn.Close();
答案 5 :(得分:3)
您应该使用ExecuteScalar()
(返回第一行的第一列)而不是ExecuteNonQuery()
(返回受影响的行数)。
您应该参考differences between executescalar and executenonquery了解更多详情。
希望它有所帮助!