我正在尝试运行一个SQL命令,将列中的所有项目保存回数据库表。用户输入此信息,当他们关闭窗口时,新输入的信息应保存回数据库。我试图使用SQL连接和SQL命令执行此操作。问题是,当我输入信息并关闭窗口时,我在comm.ExecuteNonQuery()
处收到错误,上面写着“语法不正确”,“。”考虑到我在一个在线SQL语法检查器中输入了我的语法并且一切都很顺利,我不确定我的命令在哪里确实存在问题。以下是我在Window_Closing
事件的代码:
public void Window_Closing(object sender, CancelEventArgs e)
{
var checkNoValue = ((DataProperties)gridView.SelectedItem).Check_No;
var checkDateValue = ((DataProperties)gridView.SelectedItem).Check_Date;
SqlConnection conn;
SqlCommand comm;
string connstring = "server = testserver; database = test; user = someusername; password = somepassword";
conn = new SqlConnection(connstring);
conn.Open();
comm = new SqlCommand("insert into DeductionInfo (" + gridView.Columns["checkNo"] + ", " + gridView.Columns["checkDate"] + ") values (" + checkNoValue + ", " + checkDateValue + ")", conn);
comm.ExecuteNonQuery();
MessageBox.Show("Saved");
}
我正在尝试将新数据插入位于我的数据库中的DeductionInfo数据表中。我想我可以猜测问题是什么,因为我将checkNoValue
和checkDateValue
设置为我的gridView.SelectedItem
属性,但我不确定如何将其设置为这些属性中的每个值特定列(我顺便使用Telerik的RadGridView)。请注意,Check_No
是一个整数,Check_Date
是一个日期时间。我是在解决这个问题,还是我在正确的轨道上?这是我第一次在WPF和C#中处理SQL查询,所以我对此很新。任何帮助将不胜感激:)
答案 0 :(得分:2)
执行动态SQL查询时应始终使用参数,并且在使用完毕后应始终处置IDisposables
。
此外,数据库中表的列名不是动态的。您需要知道这些的实际名称才能将一些数据插入其中。
试试这个:
public void Window_Closing(object sender, CancelEventArgs e)
{
var checkNoValue = ((DataProperties)gridView.SelectedItem).Check_No;
var checkDateValue = ((DataProperties)gridView.SelectedItem).Check_Date;
SqlConnection conn;
SqlCommand comm;
string connstring = "Server = testserver; Database = test; User Id = test; Password = somepassword;"
conn = new SqlConnection(connstring);
conn.Open();
comm = new SqlCommand("insert into DeductionInfo (checkNo, checkDate) values (@checkNoValue, @checkDateValue)", conn);
comm.Parameters.AddWithValue("@checkNoValue", checkNoValue);
comm.Parameters.AddWithValue("@checkDateValue", checkDateValue);
comm.ExecuteNonQuery();
comm.Dispose();
conn.Dispose();
MessageBox.Show("Saved");
}
答案 1 :(得分:1)
这是在您的连接结束时处理连接的正确方法,以及如何将参数传递给SQL查询。这样可以避免您现在遇到的错误,并保护您免受SQL注入
string sql = "SELECT empSalary from employee where salary = @salary";
using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
var salaryParam = new SqlParameter("salary", SqlDbType.Money);
salaryParam.Value = txtMoney.Text;
command.Parameters.Add(salaryParam);
var results = command.ExecuteReader();
}
来源:Why do we always prefer using parameters in SQL statements?