2017-08-02 11 views
0

メソッド内でC#でSQL Serverクエリを実行する必要があります。シナリオは次のとおりです。SQL選択入力変数

このメソッドは、string categoryという変数を受け入れています。 category = "Heterogeneous"の値が、私はのように選択するようにしている場合:

SqlCommand myCommand = con.CreateCommand(); 
if (simCategory == "Heterogeneous") 
{ 
    myCommand.CommandText = @"SELECT ProbabilityHeterogeneous FROM Graph 
    WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
} 
else if (simCategory == "Low") 
{ 
    myCommand.CommandText = @"SELECT ProbabilityLow FROM Graph 
    WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
} 
else if (simCategory == "Medium") 
{ 
    myCommand.CommandText = @"SELECT ProbabilityMedium FROM Graph 
    WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
} 
else if (simCategory == "High") 
{ 
    myCommand.CommandText = @"SELECT ProbabilityHigh FROM Graph 
    WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
} 

myCommand.Parameters.AddWithValue("@sourceID", sID); 
myCommand.Parameters.AddWithValue("@destinationID", dID); 

using (SqlDataReader myReader = myCommand.ExecuteReader()) 
{ 
    while (myReader.Read()) 
    { 
     inNeighborActivationProbability = Convert.ToDouble(myReader["Probability"]); 
    } 
    myReader.Close(); 
} 

を今、このトゥーレはありますか?

+0

あなたの 'commandText'文はどこですか?カテゴリパラメータに応じて変更してください。私はそこに何か問題を見ることができません。 –

+0

@JuanCarlosOropezaは、 'Select @Probability ...'は 'SELECT'の後の変数型を意味しますか? 'commandText'を変更することを提案したら、クエリを変更する必要があるたびに、これをすべて単一のクエリに入れようとしていますか? – maliks

+0

パラメータを使用してフィールド名を変更することはできません。カテゴリに基づいてcommandTextを変更し、パラメータを追加してコマンドを実行する必要があります。しかし、クエリを構築するために1つの外部文字列を使用する場合は、SQLインジェクションを取得できるので注意してください。 SQLインジェクションの警告https://xkcd.com/327/ –

答えて

0

コードには(実際には)何も問題はありません。あなたがおそらくそこにいると思う理由は、あなたがたくさんのコードを繰り返しているように見え、それが「正しい」または「効率的」ではないと感じているからです。あなたは、C#コード内で使用するどのような分野についての決定を維持したい場合は 、あなたはもう少し効率的にこのようなことを行うことができます。

 string fieldName; 
     switch (simCategory) 
     { 
      case "Heterogeneous": 
       fieldName = "ProbabilityHeterogeneous"; 
       break; 

      case "Low": 
       fieldName = "ProbabilityLow"; 
       break; 

      case "Medium": 
       fieldName = "ProbabilityMedium"; 
       break; 

      case "High": 
       fieldName = "ProbabilityHigh"; 
       break; 

      default: 
       throw new ArgumentOutOfRangeException(nameof(simCategory), "Unsupported Simulation Category requested."); 
     } 

     SqlCommand myCommand = con.CreateCommand(); 
     myCommand.CommandText = string.Format("SELECT {0} as Probability FROM Graph WHERE SourceID = @sourceID AND DestinationID = @destinationID", fieldName); 
     myCommand.Parameters.AddWithValue("@sourceID", sID); 
     myCommand.Parameters.AddWithValue("@destinationID", dID); 

     using (SqlDataReader myReader = myCommand.ExecuteReader()) 
     { 
      etc... 

これは読んで、あなたが必要とする場合に維持するために簡単なはずフィールドを追加します。

何らかの理由でSQLで意思決定したいのであれば(たとえば、ストアドプロシージャにロジックを置くと、クライアントモデルごとにアップグレードする必要なしにDBモデルと機能を拡張できます)マシン)あなたはこのようになりますSQLコード構築できます。この場合は「間違った」パラメータの値はエラーになりませんが、単に値としてNULLを返すことを

SELECT (CASE @parameter WHEN 'Heterogeneous' THEN ProbabilityHeterogeneous 
         WHEN 'Low'   THEN ProbabilityLow 
         WHEN 'Medium'  THEN ProbabilityMedium 
         WHEN 'High'   THEN ProbabilityHigh 
              ELSE NULL END) as Probability 
    FROM Graph 
    WHERE SourceID = @sourceID 
    AND DestinationID = @destinationID 

マインドを。

0

Switchを使用すると、より明確になります。また、Probabiltyでエイリアスを使用する必要があります。したがって、どちらのユーザーがどちらを選択しても、最後にそれを呼び出すことができます。myReader["Probability"]

最後に、デフォルトのオプションを含めるようにしてください。 simCategoryがある場合も、あなたは扱いする必要があります:私はあなたの列名が「*確率」のようであり、simCategoryで終わるので、私はより明確に

ノートであることを以下のコードを示唆していることがわかり

SqlCommand myCommand = con.CreateCommand(); 

switch (simCategory) 
{ 
    case "Heterogeneous": 
     myCommand.CommandText = @"SELECT ProbabilityHeterogeneous as Probability FROM Graph 
       WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
     break; 

    case "Low": 
     myCommand.CommandText = @"SELECT ProbabilityLow as Probability FROM Graph 
       WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
     break; 

    case "Medium": 
     myCommand.CommandText = @"SELECT ProbabilityMedium as Probability FROM Graph 
       WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
     break; 

    case "High": 
     myCommand.CommandText = @"SELECT ProbabilityHigh as Probability FROM Graph 
       WHERE SourceID = @sourceID AND DestinationID = @destinationID"; 
     break; 

    default: 
      Console.WriteLine("Default case Rise ERROR?"); 
      break; 
} 

myCommand.Parameters.AddWithValue("@sourceID", sID); 
myCommand.Parameters.AddWithValue("@destinationID", dID); 

using (SqlDataReader myReader = myCommand.ExecuteReader()) 
{ 
    while (myReader.Read()) 
    { 
     inNeighborActivationProbability = Convert.ToDouble(myReader["Probability"]); 
    } 
    myReader.Close(); 
} 
0

空または空です。

string sql = ""; 
switch (simCategory) 
{ 
case "Heterogeneous": 
case "Low": 
case "Medium": 
case "High":   
    sql=simCategory; 
    break; 
default: 
     // handle error 
    break; 
} 

SqlCommand myCommand = con.CreateCommand(); 
myCommand.CommandText = string.Format(@"SELECT Probability{0} as Probability FROM Graph WHERE SourceID = 
        @sourceID AND DestinationID = @destinationID", sql); 
myCommand.Parameters.AddWithValue("@sourceID", sID); 
myCommand.Parameters.AddWithValue("@destinationID", dID); 

using (SqlDataReader myReader = myCommand.ExecuteReader()) 
{ 
while (myReader.Read()) 
    { 
    inNeighborActivationProbability = Convert.ToDouble(myReader["Probability"]); 
    } 
    myReader.Close(); 
} 
+0

SQLインジェクション攻撃に対する脆弱性を引き起こすことに注意してください。 –

+0

@JuanCarlosOropezaあなたは正しいです、ありがとう –

+0

私はコードを編集しました –