我正在使用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);
}
}
但我不想这样做。感谢
答案 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);
}
}
但是,您应该使用CheckBox
或DropDown
来选择事务类型,并在使用它们之前验证所有值。如果有的话,抓住例外。或者,您可以编写一个小的存储过程并将条件逻辑从C#
移动到SQL
。