使用Where子句C#构建动态SQL INSERT查询

时间:2015-12-13 20:44:07

标签: c# sql-server visual-studio

我正在使用SQL Server 2012& VS 2013.我有这样的表架构

[dbo].[Accounts] ([AccntName], [AccntCrVal], [AccntDrVal])

我想根据条件构建动态sql查询。用户将选择AccoutnName并输入余额,然后选择余额类型Credit或Debit。现在我希望如果用户选择信用值转到信用列,反之亦然。用户只会选择已在帐户表中输入的AccountName。 目前我正在这样做

using (SqlConnection conn = new SqlConnection(conStr))
{
    insrtcmd = new SqlCommand();
    insrtcmd.Connection = conn;
    if (comBoxBalType.Text == "Cr")
    {
        insrtcmd.CommandText = @"INSERT INTO Accoutns(AccntCrVal) VALUES (@bal) Where(AccntName=@acntName)";
        insrtcmd.Connection = conn;
        insrtcmd.Parameters.AddWithValue("@acntName", acntName);
        insrtcmd.Parameters.AddWithValue("@bal", bal);
        conn.Open();
        insrtcmd.ExecuteNonQuery();
    }
    else if (comBoxBalType.Text == "Dr")
    {
        insrtcmd.CommandText = @"INSERT INTO Accoutns(AccntDrVal)  VALUES (@AccntDrVal) Where (AccntName=@prmSlctAcntName)";
        insrtcmd.Connection = conn;
        insrtcmd.Parameters.AddWithValue("@prmSlctAcntName", comBoxSlctAcnt.Text);
        insrtcmd.Parameters.AddWithValue("@AccntDrVal", textBoxBal);
        conn.Open();
        insrtcmd.ExecuteNonQuery();
    }
    else
    {
        MessageBox.Show("Please Enter Values and Select the Balance Type [ Dr | Cr ] ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

但我不想这样做。感谢

1 个答案:

答案 0 :(得分:3)

由于您已经是表中的数据,因此需要Update记录。使用您当前的设置,您可以执行类似这样的操作

using (SqlConnection conn = new SqlConnection(conStr))
{
    var accountName = comBoxSlctAcnt.Text;
    var balance = textBoxBal.Text;
    var balanceType = comBoxBalType.Text;

    if (balanceType == "Cr" || balanceType == "Dr")
    {
        insrtcmd = new SqlCommand();
        insrtcmd.CommandText = string.Format(
                                     @"UPDATE Accoutns SET {0} = @bal Where AccntName = @acntName", 
                                     balanceType == "Cr" ? "AccntCrVal" : "AccntDrVal");
        insrtcmd.Connection = conn;
        insrtcmd.Parameters.AddWithValue("@acntName", accountName);
        insrtcmd.Parameters.AddWithValue("@bal", balance);
        conn.Open();
        insrtcmd.ExecuteNonQuery();
    }
    else
    {
        MessageBox.Show("Please Enter Values and Select the Balance Type [ Dr | Cr ] ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

但是,您应该使用CheckBoxDropDown来选择事务类型,并在使用它们之前验证所有值。如果有的话,抓住例外。或者,您可以编写一个小的存储过程并将条件逻辑从C#移动到SQL