2

我通过文本框和按钮在 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();
}

我有'data'数据类型的列'char(4000)'

问题是,当我存储第 1 段(大约 1500 个字)时,它存储成功。但是当我存储另一段(大约 1500 字)时,它显示了错误。

“'s' 附近的语法不正确。字符串 ',22)' 后面的未闭合引号。”

问题是什么 ??

4

5 回答 5

7

使用参数

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 攻击

于 2012-06-15T16:14:13.270 回答
2

String.Format不会转义适合在 SQL 语句中使用的输入字符串,这将导致错误和严重漏洞

您应该使用专门为解决此问题而设计的参数化查询。

于 2012-06-15T16:14:42.817 回答
1

您的文本是否包含'字母?如果是,那么它正在中断INSERT查询。

如果您尝试插入以下文本:

你好呀

然后您的查询将如下所示:

insert into try (data,sno) values ('Hello' there,22)

这导致不正确的查询。

这不是应该进行查询的方式,因为它会导致安全问题(阅读更多:SQL 注入)您应该使用参数化查询

于 2012-06-15T16:13:17.267 回答
1

这听起来像''TextBox1.Text. 您需要将所有单引号替换为双引号。

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();

否则,您可以像其他人提到的那样使用参数。

于 2012-06-15T16:13:29.560 回答
0

“'s'附近的语法不正确-这表明您的sql语句是错误的。我猜您的输入内容可能包含sql server关键字,因此请检查您的第二段是否有任何关键字,例如“'”。
例如:
第二段是:天气怎么样?好酷!!!!!!!
所以sql语句是:插入try(data,sno)值('天气怎么样?好酷!!!!!!',22)
就会出现's' 附近的异常语法不正确

于 2012-06-15T16:22:38.227 回答