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で正常に機能しますが、選択クエリのみが機能しない理由がわかりません。
他のすべてのクエリは機能しています。
SqlCommand.ExecuteNonQueryメソッド
ExecuteNonQueryを使用して、カタログ操作(データベースの構造のクエリやテーブルなどのデータベースオブジェクトの作成など)を実行したり、UPDATE、INSERT、またはDELETEステートメントを実行してDataSetを使用せずにデータベース内のデータを変更したりできます。 ExecuteNonQueryは行を返しませんが、出力パラメーターまたはパラメーターにマップされた戻り値にはデータが入力されます。 UPDATE、INSERT、およびDELETEステートメントの場合、戻り値はコマンドの影響を受ける行の数です。挿入または更新されているテーブルにトリガーが存在する場合、戻り値には、挿入または更新操作の影響を受ける行の数と、1つまたは複数のトリガーの影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は-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();
MSDNによると
結果は影響を受ける行数であり、クエリは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));
クエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。
戻り値として1行のみが必要なため、このSqlDataReader
の使用をコードから削除します
using (SqlDataReader reader = command.ExecuteReader())
{
// iterate your results here
Console.WriteLine(String.Format("{0}",reader["id"]));
}
再びコマンドを実行し、ページのパフォーマンスに影響を与えるからです。
@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の違い を参照してください。
それが役に立てば幸い!
それは仕様によるものです。
UPDATE、INSERT、およびDELETEステートメントの場合、戻り値はコマンドの影響を受ける行の数です。挿入または更新されているテーブルにトリガーが存在する場合、戻り値には、挿入または更新操作の影響を受ける行の数と、1つまたは複数のトリガーの影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は-1です。ロールバックが発生した場合、戻り値も-1です。