2012-04-28 6 views
3

私はC#MSVS 2008を使用してSpecializationtblというテーブルからSpecialization IDを取得しようとしていますが、テーブルには他の行のSpecializationNameとSpecializationIDが含まれています。コマンドは、のように怒鳴る行く:SqlDataReader実行エラー

SqlCommand READSpecID = new SqlCommand("SELECT * FROM Specializationtbl WHERE SpecializationName='" + comboBox1.Text + "'" , DBcnction); 
DBcnction.Open(); 

SqlDataReader ReadSpecID_ = READSpecID.ExecuteReader(); 
ReadSpecID_.Read(); 
int SpecID_ = Convert.ToInt16(ReadSpecID_["SpecID"].ToString()); 

DBcnction.Close(); 

iはまた、全ての行の代わりに「SpecID」を選択しようとしたが、カントが正常にクエリを封印し、「データなし存在」エラーを受信し続けるように見える、私はすべてのアイデア場所間違いを作っている?

答えて

1

1)SSMSにおけるコマンド実行)READSPecID

DBcnction.Open(); 
SqlCommand READSpecID = new SqlCommand("SELECT * FROM Specializationtbl WHERE  SpecializationName='" + comboBox1.Text + "'" , DBcnction); 

2値を割り当てる前DBcnctionを開いてみてください:

SELECT * FROM Specializationtbl WHERE SpecializationName ='yourvalue' 

を、任意の結果を

3に戻されるかどうかを確認) Check comboBox1.Textに値があります

4) comboBox1.Text(またはparemetrisedクエリまたはストアドプロシージャを使用してください)あなたはSQLインジェクションの被害者になっていないことを確認する:http://en.wikipedia.org/wiki/SQL_injection

1

リファクタリングあなたの二つの問題解決するために:あなたを構築するとき

  1. あなたのSQLインジェクションの問題をSQLステートメント。
  2. 値が1つのみ必要な場合は、ExecuteScalarを使用します。
  3. usingブロックを実装します。
string retVal;   
using (var conn = new SqlConnection(SomeConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = "SELECT SpecID FROM Specializationtbl WHERE SpecializationName= @Name"; 
    cmd.Parameters.AddWithValue("@Name", comboBox1.Text); 
    conn.Open(); 
    retVal = cmd.ExecuteScalar().ToString(); 
} 
int specID = int.Parse(retVal); 

あなたが本当にあなたの文から複数の値必要な場合は、次のいずれかの行がある場合は、最初のテストする必要が

using (var conn = new SqlConnection(SomeConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = "SELECT SpecID, Value2 FROM Specializationtbl WHERE SpecializationName= @Name"; 
    cmd.Parameters.AddWithValue("@Name", comboBox1.Text); 
    conn.Open(); 
    var dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     Customer c = new Customer { 
      ID = dr["SpecID"].ToString(), 
      Value = dr["Value2"].ToString(), 
     }; 
    } 
} 
1

を。私はクエリがゼロ行を返すと思われる。

if(ReadSpecID_.HasRows) { ReadSpecID_.Read(); }