web-dev-qa-db-ja.com

SQL Serverからデータを取得するクエリを選択します

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で正常に機能しますが、選択クエリのみが機能しない理由がわかりません。

他のすべてのクエリは機能しています。

11
user3226440

SqlCommand.ExecuteNonQueryメソッド

ExecuteNonQueryを使用して、カタログ操作(データベースの構造のクエリやテーブルなどのデータベースオブジェクトの作成など)を実行したり、UPDATE、INSERT、またはDELETEステートメントを実行してDataSetを使用せずにデータベース内のデータを変更したりできます。 ExecuteNonQueryは行を返しませんが、出力パラメーターまたはパラメーターにマップされた戻り値にはデータが入力されます。 UPDATE、INSERT、およびDELETEステートメントの場合、戻り値はコマンドの影響を受ける行の数です。挿入または更新されているテーブルにトリガーが存在する場合、戻り値には、挿入または更新操作の影響を受ける行の数と、1つまたは複数のトリガーの影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は-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();
34
Dhwani

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

      ...
    }
  }
_
8
Dmitry Bychenko

ExecuteScalar()の代わりにExecuteNonQuery()を使用して、単一の結果を取得することができます

Int32 result= (Int32) command.ExecuteScalar();
Console.WriteLine(String.Format("{0}", result));

クエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。

戻り値として1行のみが必要なため、このSqlDataReaderの使用をコードから削除します

using (SqlDataReader reader = command.ExecuteReader())
{
    // iterate your results here
    Console.WriteLine(String.Format("{0}",reader["id"]));
}

再びコマンドを実行し、ページのパフォーマンスに影響を与えるからです。

4
Vikas Rana

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

ExecuteScalar()(影響を受ける行数を返す)の代わりにExecuteNonQuery()(最初の行の最初の列を返す)を使用する必要があります。

詳細については、 executescalarとexecutenonqueryの違い を参照してください。

それが役に立てば幸い!

3
Mayank Modi

それは仕様によるものです。

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

UPDATE、INSERT、およびDELETEステートメントの場合、戻り値はコマンドの影響を受ける行の数です。挿入または更新されているテーブルにトリガーが存在する場合、戻り値には、挿入または更新操作の影響を受ける行の数と、1つまたは複数のトリガーの影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は-1です。ロールバックが発生した場合、戻り値も-1です。

3
aliensurfer