-1

私は複数のデータを持っているので、それらを別のに追加databaseする必要があります。ここに私のコードがありますtextBoxes

private void Search_button1_Click(object sender, EventArgs e)
{
    string query = string.Empty;
    if (ID_textBox1.Text.Trim().Length > 0)
    {
        try
        {
            query = "SELECT ProductName,ProductDescription,SellPrice FROM Table2 WHERE ProductID='" + ID_textBox1.Text + "'";
            SqlConnection Conn = CreateConnection.create_connection();
            SqlCommand cd = new SqlCommand(query, Conn);
            SqlDataReader reader = cd.ExecuteReader();

            while (reader.Read())
            {
                Name_textBox2.Text = reader["ProductName"].ToString();
                Description_textBox3.Text = reader["ProductDescription"].ToString();
                Unit_Price_textBox5.Text = reader["SellPrice"].ToString();
            }
            reader.Close();
            Name_textBox2.Text = Name_textBox2.Text;
            Description_textBox3.Text = Description_textBox3.Text;
            QTY_textBox4.Text = 1.ToString();
            Unit_Price_textBox5.Text = Unit_Price_textBox5.Text;
            Price_textBox6.Text = (decimal.Parse(QTY_textBox4.Text) * decimal.Parse(Unit_Price_textBox5.Text)).ToString();

        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}
4

1 に答える 1

1

あなたはあなたの問題が何であるかを述べていませんでしたが、私が提案したいことがいくつかあります.

  1. パラメータ化されたクエリを使用します。これにより、SQL インジェクション攻撃を防ぐことができます。

  2. ステートメントを使用して、using物が適切に処分されていることを確認してください。

  3. 次のような行Name_textBox2.Text = Name_textBox2.Text;は不要です。単に値をそれ自体に代入しているだけです。

  4. 1.ToString()意味がありません。 1は有効な変数名ではありません。値 1 をテキスト ボックスに割り当てたい場合は、単純にQTY_textBox4.Text = "1";.

コードを次のように書き直します。

if (ID_textBox1.Text.Trim().Length > 0)
{
    try
    {
        query = "SELECT ProductName,ProductDescription,SellPrice FROM Table2 WHERE ProductID=@ProductID";

        using (SqlConnection Conn = CreateConnection.create_connection())
        {

            // NOTE: If CreateConnection.create_connection() does not return
            // an opened connection, you will need to open it like this:
            // Conn.Open();
            SqlCommand cd = new SqlCommand(query, Conn);
            cd.Parameters.AddWithValue("@ProductID", ID_textBox1.Text);

            using (SqlDataReader reader = cd.ExecuteReader())
            {

                while (reader.Read())
                {
                    Name_textBox2.Text = reader["ProductName"].ToString();
                    Description_textBox3.Text = reader["ProductDescription"].ToString();
                    Unit_Price_textBox5.Text = reader["SellPrice"].ToString();
                }
            }
        }

        decimal quantity;
        decimal unitPrice;

        QTY_textBox4.Text = "1";

        decimal.TryParse(QTY_textBox4.Text, out quantity);
        decimal.TryParse(Unit_Price_textBox5.Text, unitPrice);
        Price_textBox6.Text = (quantity * unitPrice).ToString();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

上記のコードでは、パラメーター化されたクエリ - を使用しています"SELECT ProductName,ProductDescription,SellPrice FROM Table2 WHERE ProductID=@ProductID"。は@ProductIDパラメーターのプレースホルダーです。

そのパラメーターは、cd.Parameters.AddWithValue("@ProductID", ID_textBox1.Text);行によって入力されます。

usingステートメントはSqlConnectionおよび に使用されSqlDataReader、例外が発生した場合でも、オブジェクトが適切に閉じられ、破棄されることを保証します。

上記のループで行われたように、TextBox に現在の値が割り当てられている不要な行を削除しました。

最後に、 を使用することをお勧めしTryParseます。これは、解析が失敗してもエラーをスローしないためです。TryParse実際、解析が成功しなかった場合にメッセージを表示するために使用できます(TryParseブール値を返します)。

クエリに基づいて、1 行のデータのみを期待していると思いますが、複数行のデータを取得した場合、最後の行のみが TextBox の最終的な値になります。

これ以上の情報がなくても、これ以上のことをお伝えできます。お役に立てば幸いです。

于 2013-08-24T06:54:33.543 に答える