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

C# 使用Where子句C构建动态SQL INSERT查询,c#,sql-server,visual-studio,C#,Sql Server,Visual Studio,我使用的是SQL Server 2012和VS 2013。我有这样的表模式 [dbo].[Accounts] ([AccntName], [AccntCrVal], [AccntDrVal]) using (SqlConnection conn = new SqlConnection(conStr)) { insrtcmd = new SqlCommand(); insrtcmd.Connection = conn; if (comBoxBalType.Text ==

我使用的是SQL Server 2012和VS 2013。我有这样的表模式

[dbo].[Accounts] ([AccntName], [AccntCrVal], [AccntDrVal])
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);
    }
}
我想根据条件构建一个动态sql查询。用户将选择账户名并输入余额,然后选择余额类型贷方或借方。现在我想,如果用户选择信用值,则转到信用列,反之亦然。用户将仅选择已在accounts表中输入的AccountName。 目前我是这样做的

[dbo].[Accounts] ([AccntName], [AccntCrVal], [AccntDrVal])
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);
    }
}

但我不想这样做。谢谢

因为您已经在表中输入了数据,所以需要更新记录。使用当前设置,您可以执行以下操作

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

但是,您应该使用复选框或下拉列表来选择事务类型,并在使用它们之前验证所有值。捕获异常(如果有)。或者,您可以编写一个小的存储过程,并将条件逻辑从C移动到SQL。

由于您已经在表中存储了数据,因此需要更新记录。使用当前设置,您可以执行以下操作

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

但是,您应该使用复选框或下拉列表来选择事务类型,并在使用它们之前验证所有值。捕获异常(如果有)。或者,您可以编写一个小的存储过程,并将条件逻辑从C移到SQL。

Yes。你能提供代码吗@0\uuuuuuuuuuuu0无法定义动态insert语句。有其他方法吗@JackINSERT没有WHERE子句——如果您想插入,那么就执行insert,否则就不要执行它……是的。你能提供代码吗@0\uuuuuuuuuuuu0无法定义动态insert语句。有其他方法吗@JackINSERT没有WHERE子句-如果您想插入-那么执行insert,否则就不要执行它…如果它解决了您的问题。如果它解决了你的问题,你可以把它标记为答案。你可以打标记作为答案。