0
private void txtItems_TextChanged(object sender, EventArgs e)
{
   try
   {
      MySqlCommand com = new MySqlCommand();
      MySqlDataReader read;
      com.CommandText = "SELECT * FROM Inventory where ProductID ='" + txtbCode.Text + "'";
      com.Connection = MySQLConnection.con;
      MySQLConnection.con.Open();
      read = com.ExecuteReader();
      while (read.Read())
      {
         txtCatogery.Text = read["Catogery"].ToString();
         txtDiscriptions.Text = read["Description"].ToString();
         txtQTY.Text = read["QTY"].ToString();
         txtPrice.Text = read["Price"].ToString();
      }
    //Rest of code
   }
}

TextBoxes にバーコードを入力txtbCodeすると、db から値が取得されますが、バーコード付きの製品がある場合は123456 を入力し続けます (123456) そのバーコード付きの製品はありませんが、テキストボックスの値は更新されず、保持されます1234 について読み取られる値。

どうすればそれを達成できますか?

4

4 に答える 4

3

このコードには複数の問題がありますが、主な質問に答えるには、それはあなたのwhile (read.Read())行のせいです。クエリが0行を返す場合、while statementは実行されません。

単一の行を期待している場合は、if (read.Read())代わりにそれを作成し、else条件を追加してテキストボックスをクリアする必要があります。

調べたいと思うかもしれない他の問題は、それが終わったときにリーダーを確実に破棄することと、ユーザー入力をクエリに直接埋め込む代わりにパラメーターを使用することです。

于 2013-01-26T19:42:21.277 に答える
0

まず、クエリをパラメータ化する必要があります。SQLインジェクションを参照してください。

あなたの質問に関しては、DBをクエリする前に以前の値をクリアする必要があります。現在のコードでは、Read()が成功した場合にのみテキストボックスが更新されます(たとえば、DBに行がある場合)...しかし、行は更新されず、前のエントリが残ります。

 private void txtbCode_TextChanged(object sender, EventArgs e)
 {
     txtCatogery.Text = String.Empty;
     txtDiscriptions.Text = String.Empty;
     ...

     try
     {
        MySqlCommand com = new MySqlCommand();
        MySqlDataReader read;
        .....
于 2013-01-26T19:40:13.520 に答える
0

クエリから返される値を確認する必要があります。値が返されない場合は、Textboxes

        MySQLConnection.con.Open();
        read = com.ExecuteReader();
    if(read != null)
    {
        while (read.Read())
        {
        txtCatogery.Text = read["Catogery"].ToString();
        txtDiscriptions.Text = read["Description"].ToString();
        txtQTY.Text = read["QTY"].ToString();
        txtPrice.Text = read["Price"].ToString();
        }
    }
    else
    {
        txtCatogery.Text = "";
        txtDiscriptions.Text =  "";
        txtQTY.Text =  "";
        txtPrice.Text =  "";
    }

たとえば、データベースから複数のレコードが返された場合TextBoxes、最後のレコード データのみが表示されます。いずれかのレコードに null フィールドがある場合、.ToString(). 最後SQL injectionに、学習のためにこのコードを書いていない限り、大きな脅威です。

于 2013-01-26T19:50:08.407 に答える
0

出発.HasRows前にご利用いただけます.Read()

...
MySqlDataReader read = cmd.ExecuteReader(); 
if (read.HasRows) 
{ 
  while (read.Read())
  {
      //Do Stuff
  }
}
else
{
   //Do Stuff
   txtPrice.Clear();
}
于 2013-01-26T19:50:56.963 に答える