试图插入记录的代码应该更改为使用参数化方法。
这可能是一个例子
private void add_Click(object sender, EventArgs e)
{
string commandText = @"Insert into clients values
(@id, @name, @prn, @datan, @addr, @tel)";
using(SqlConnection cnx = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(commandText, cnx)
{
cmd.Parameters.AddWithValue("@id", Convert.ToInt32(cintxt.Text));
cmd.Parameters.AddWithValue("@name", nomtxt.Text);
cmd.Parameters.AddWithValue("@prn", prntxt.Text);
cmd.Parameters.AddWithValue("@datan", datenaiss.Value);
cmd.Parameters.AddWithValue("@addr", addtxt.Text);
cmd.Parameters.AddWithValue("@tel", teltxt.Text);
cnx.Open();
cmd.ExecuteNonQuery();
}
}
在这段代码中我已经改变了一些东西。首先,连接和命令不再是全局变量,而只是本地的,并且被包含在使用语句中,以确保正确关闭和处置,如果出于任何原因代码抛出异常。
其次,命令文本不再是字符串的串联,而只是带参数占位符的单个字符串。连接字符串以构建命令文本实际上是一种不好的做法。 Sql注入黑客等待以这种方式构建的命令击中你的数据库,正如你已经看到的那样,底层数据表不理解一个表示日期是有效日期的字符串。
最后,命令参数集合中充满了命令文本占位符预期的每个字段的参数。请注意,通过这种方式,您可以构建传递值的数据类型的参数,而不仅仅是数据表字段所不期望的字符串。在您的实际情况当然,这是可能的,这些参数中的应改为完全匹配您的数据表字段(例如我不知道ID的第一个字段是一个整数或没有)
编辑按照要求通过下面的评论我还添加了一些方法AddWithValue
的考虑。
虽然它很方便和富有表现力,但如果您的程序频繁调用此代码或数据库处于大量使用状态,则可能会出现问题。使用首选的方法是
cmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = nomtxt.Text;
.....
See MSDN SqlParameterCollection.Add
和有关说明如下
How Data Access Code Affects Database Performance
这显然是你的列类型之一是日期时间添加和AddWithValue之间的区别的详细信息,并尝试插入它的特点(因为你的所有值都是'.Text',这就是为什么所有的都是字符串)。请使用[paramterized queries](http://codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html)。这种字符串连接对于[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)攻击是开放的。 –
使用带有正确数据类型的参数化查询传递参数 – Steve
sql-server中的日期类型是日期,并且当我将日期类型更改为datetime时,相同的消息会显示我。 – user3002886