通过文本框在sql server 2005中存储数据时获取错误
我通过文本框和按钮在SQL Server 2005中存储数据(大约1500字)。 我正在使用此代码。
protected void Button1_Click(object sender, EventArgs e) { conn.Open(); String query = String.Format("insert into try (data,sno) values ('{0}',22)",TextBox1.Text); SqlCommand cmd = new SqlCommand(query, conn); cmd.ExecuteNonQuery(); Label1.Text = "submitted"; conn.Close(); }
我有数据类型'char(4000)'
列'data'
'char(4000)'
。
问题是,当我存储第1段(约1500字)时,它成功存储。 但是当我存储另一个段落(大约1500字)时,它会显示错误。
“’s’附近的语法不正确。字符串后面的未闭合引号’,22)’。”
问题是什么 ??
使用参数
String query = "insert into try (data,sno) values (@data,22)"; SqlCommand cmd = new SqlCommand(query, conn); cmd.Parameters.AddWithValue("@data", TextBox1.text); cmd.ExecuteNonQuery();
通过这种方式,您无需担心文本中是否存在单引号,最重要的是,您可以避免SqlInjection攻击
String.Format
不会适当地转义输入字符串以用于SQL语句,这将导致错误和严重漏洞 。
您应该使用专门为解决此问题而设计的参数化查询 。
听起来你在TextBox1.Text
有一个'
或多个'
。 您需要将所有单引号替换为double。
String query = String.Format("insert into try (data,sno) values ('{0}',22)",Replace(TextBox1.Text,"'","''"));
但是,这种方法将为您打开SQL注入攻击。 我建议使用存储过程,如下所示:
SqlCommand cmd = new SqlCommand(query, conn); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "spInsertDataIntoTry"; cmd.Parameters.AddWithValue("@data", TextBox.Text); cmd.ExecuteNonQuery();
否则,您可以像其他人提到的那样使用参数 。
你的文字是否包含'
信件? 如果是,那么它正在破坏INSERT
查询。
如果您尝试插入以下文字:
你好
然后您的查询将如下所示:
insert into try (data,sno) values ('Hello' there,22)
这导致查询不正确。
这不是查询应该完成的方式,因为它会导致安全问题(更多信息: SQL注入 ),您应该使用参数化查询 。
“’s’附近的语法不正确 – 这表明你的sql语句是错误的。我猜你的输入内容可能包含sql server关键字,所以检查你的第2段是否有任何关键字,如”’“。
例如:
第2段是:天气怎么样? 这很酷!!!!!!!
所以sql语句是:插入try(data,sno)值(’天气怎么样?很酷!!!!!!!’,22)
它会在’s’附近出现exception错误的语法