选择查询以从SQL Server获取数据

我试图在我的C#代码中运行SQL Select查询。 但我总是得到-1输出

int result = command.ExecuteNonQuery(); 

但是,如果我用于deleteinsert工作相同的表…

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上工作正常,但我不明白为什么只有选择查询不起作用。

所有其他查询都有效。

SqlCommand.ExecuteNonQuery方法

您可以使用ExecuteNonQuery执行目录操作(例如,查询数据库的结构或创建数据库对象,例如表),或者通过执行UPDATE,INSERT或DELETE语句来更改数据库中的数据而不使用DataSet。 虽然ExecuteNonQuery不返回任何行,但是映射到参数的任何输出参数或返回值都会填充数据。 对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数。 当插入或更新的表上存在触发器时,返回值包括插入或更新操作所影响的行数以及受触发器或触发器影响的行数。 对于所有其他类型的语句,返回值为-1。 如果发生回滚,则返回值也为-1。

SqlCommand.ExecuteScalar方法对连接执行Transact-SQL语句并返回受影响的行数。

所以没有。 SELECT语句返回的语句必须使用ExecuteScalar方法。

参考: http : //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

所以尝试下面的代码:

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

根据MSDN

http://msdn.microsoft.com/ru-ru/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

结果是受影响的行数 ,并且由于您的查询被select ,因此无论如何都不会影响 (即插入,删除或更新)行。

如果要返回查询的单行 ,请使用ExecuteScalar()而不是ExecuteNonQuery()

  int result = (int) (command.ExecuteScalar()); 

但是,如果您希望返回许多行 ,则ExecuteReader()是唯一的选项:

  using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { int result = reader.GetInt32(0); ... } } 

您可以使用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"])); } 

因为它会再次执行您的命令并影响您的页面性能。

那是设计上的。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

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

您应该使用ExecuteScalar() (返回第一行第一列)而不是ExecuteNonQuery() (它返回受影响的行数)。

您应该参考executioncalar和executenonquery之间的差异以获取更多详细信息。

希望能帮助到你!

你还要添加参数@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();