-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语句用于 theSqlConnectionSqlDataReader, 并确保对象被正确关闭和处理,即使发生异常也是如此。

我删除了 TextBox 被分配其当前值的不必要的行,就像在上面的循环中所做的那样。

最后,我建议使用TryParse,因为如果解析不成功,它不会抛出错误。事实上,TryParse如果解析不成功,您可以使用它来显示一条消息(TryParse返回一个布尔值)。

根据查询,我猜您只期望一行数据,但如果您获得多行数据,则只有最后一行将是 TextBoxes 中的最终值。

如果没有更多信息,我们可以告诉您的远不止这些。我希望它有所帮助。

于 2013-08-24T06:54:33.543 回答