使用C#中的Windows窗体应用程序在SQL Server 2008 R2数据库中保存数据时遇到问题。我在保存按钮中的代码是正确的,但是当我单击此按钮时,会出现一个消息框
无效的列名“CompanyID”......和其他列
但该列确实存在于数据库表中。
我的代码是
SqlConnection con = new SqlConnection(GetConnection.ConnectionStr);
string sqltext = "insert into MVConsumingMaker ( [CompanyID] , [MakerID] , [Hour] , [Amount] , [Date] ) values(" + Convert.ToString(CmpCompany.ValueMember) + "," + Convert.ToString(CmpMaker.ValueMember) + "," + CmpHour.Text + "," + TxtAmount.Text + ",'" + MaskDate.Text + "')";
SqlCommand cmd = new SqlCommand(sqltext, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
TxtResultSave.Text = "the opiration was completed successfully";
请告诉我我做错了什么!
谢谢..
答案 0 :(得分:0)
好吧,你的第一个 MAJOR 问题是你正在使用字符串连接来构建你的SQL语句 - 这真的很糟糕,因为你打开代码 SQL注入< / strong> - 不要这样做 - 从不!。解决此问题的唯一正确方法是始终使用参数化查询 - 定义您的SQL语句,并且无论您想要“插入”某个值,都有{{1所以你可以从代码中正确安全地设置它的值。
使用参数还可以避免必须处理棘手的问题,例如在SQL语句中使用正确数量的引号和双引号,并且它允许更多的错误控制,因为为参数分配了数据类型,并且如果值你试图设置不匹配,你会收到一个很好的错误信息。
另外:您应该尝试将数据访问逻辑与UI逻辑分开 - 不要在UI事件处理程序的中间编写所有数据库代码。将它们分开 - 更好更清洁的设计,允许您重用代码并提高代码库的整体可维护性。
所以我会写一个类似的方法:
@parameter
然后让我的事件处理程序调用该方法:
public void SaveData(int companyID, int makerID, int hour, decimal amount, DateTime date)
{
// define your SQL statement using *parameters*
string sqltext = "INSERT INTO dbo.MVConsumingMaker([CompanyID], [MakerID], [Hour], [Amount], [Date]) " +
"VALUES(@CompanyID, @MakerID, @Hour, @Amount, @Date)";
// put your disposable ADO.NET objects into "using" blocks to ensure proper disposal
using (SqlConnection con = new SqlConnection(GetConnection.ConnectionStr))
using (SqlCommand cmd = new SqlCommand(sqltext, con))
{
// define parameters and their values
cmd.Parameters.Add("@CompanyID", SqlDbType.Int).Value = companyID;
cmd.Parameters.Add("@MakerID", SqlDbType.Int).Value = makerID;
cmd.Parameters.Add("@Hour", SqlDbType.Int).Value = hour;
cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Value = amount;
cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = date;
// open connection, execute INSERT, close connection
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}