3

C#MSVS 2008を使用してSpecializationtblというテーブルからSpecializationIDを取得しようとすると、テーブルには他の行の横にSpecializationNameとSpecializationIDが含まれ、私の質問はエラー「データがありません」に関連しています。コマンドは次のようになります。

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

また、すべての行の代わりに「SpecID」を選択しようとしましたが、クエリを正しく封印できず、「データがありません」というエラーが表示され続けるようです。どこで間違いを犯しているのでしょうか。

4

3 に答える 3

1

1)READSPecIDに値を割り当てる前に、DBcnctionを開いてみてください

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

2)SSMSでコマンドを実行します。

 SELECT * FROM Specializationtbl WHERE SpecializationName ='yourvalue'

結果が返されるかどうかを確認します

3)comboBox1.Textに値が含まれていることを確認します

4)comboBox1.Textの内容を検証して(または、パラメータ化されたクエリまたはストアドプロシージャを使用して)、SQLインジェクションの犠牲にならないようにします:http://en.wikipedia.org/wiki/SQL_injection

于 2012-04-28T13:20:55.503 に答える
1

2つの問題を解決するためのリファクタリング:

  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(),
       };
   }
}
于 2012-04-28T13:25:02.553 に答える
1

最初に行があるかどうかをテストする必要があります。クエリがゼロ行を返していると思われます。

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

于 2012-04-28T23:20:13.577 に答える