public int ColumnCountinFailedQueue(long QueueNo)
{
string query = "select count(QueueNo)
from NS_FailedQueue
where queueid = @QueueNo";
QueueNo を取得していません。これは正しくありません。
string query = "select count(QueueNo) "
+ "from NS_FailedQueue "
+ "where queueid = " + QueueNo.ToString();
ここでパラメータ化されたクエリを実行しようとしているようです。あなたの質問にはいくつかの重要な要素が欠けています。生の ADO.NET を使用している場合、パラメーター化されたクエリは次のようになります。
public int ColumnCountinFailedQueue(long QueueNo)
{
string query = "select count(QueueNo)
from NS_FailedQueue
where queueid = @QueueNo";
int queueCount = 0;
using (SqlConnection connection = new SqlConnection("connectionString"))
using (SqlCommand getQueueCountCommand = new SqlCommand(query, connection))
{
getQueueCountCommand.Parameters.AddWithValue("@QueueNo", QueueNo);
connection.Open();
queueCount = (int)getQueueCountCommand.ExecuteScalar();
}
return queueCount;
}
また、1 つの列で 1 つの行しか取得していないため、ExecuteScalar を使用して結果を取得できます。
パラメータを文字列としてクエリの最後に連結する他の回答が機能することに注意してください。この特定のケースでは、メソッド パラメータの long が強制的に数値になるため、SQL インジェクションの脆弱性はありません。問題は、このパラメーターが代わりに文字列に変更されると、SQL インジェクションに対して脆弱になることです。
string query = "select count(QueueNo) "
+ "from NS_FailedQueue "
+ "where queueid = " + QueueNo;
私の観点からすると、キューIDは整数にすることができます...そうでない場合..
QueueNo.tostring() のような queueid
+で文字列を連結するのは嫌いなので、それが私の解決策です
string query = string.Format(@"select count(QueueNo) from NS_FailedQueue where queueid={0}", QueueNo);
次のようになります。
public int ColumnCountinFailedQueue(long QueueNo)
{
string query = "select count(QueueNo) from NS_FailedQueue where queueid = "+QueueNo.ToString();
}