0

我正在尝试在数据库中插入一个问题,表中的字段为 nvarchar(max) (sql server 2008 r2)

代码如下:

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
    gc.ExecuteCommand("insert into QuestionMaster values('" & txtQuestion.Text & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')")
    Response.Write("<script type='text/javascript' language='javascript'>alert('Question Added Sucessfully!!!')</script>")
    BindGrid()
End Sub

当我插入任何字符串时:

what's your name? 

然后它给了我错误:

's' 附近的语法不正确。字符串 ')' 后面的非闭合引号。

如果我只是将字符串提供为:

What is your name?

然后它不会给我错误。

请帮我。

4

6 回答 6

9

如果可能,您应该使用参数化查询,因为如您所见,将简单的字符串直接插入查询可能会破坏查询。

换句话说,如果文本框包含Paddy O'Rourke,您的查询将变为:

                                 open   close   what the ?
                                  |       |      |
insert into QuestionMaster values('Paddy O'Rourke') ...

您可以看到嵌入式'正在破坏查询的事实。

正如您尚未意识到的那样,它还将允许人们对您的数据库执行 SQL 注入攻击,因为您没有清理输入。

如果由于某种原因,您的商店不允许参数化查询(从您的一条评论中可以看出),请寻找另一个工作场所。不,开个玩笑,但是在这种愚蠢的政策面前,您需要自己清理输入。

但这充满了危险,我会首先尝试改变这样的政策,毫不含糊地列出所涉及的风险。

于 2013-07-24T06:20:41.480 回答
4

好吧,您应该使用参数化查询

这也将避免SQL 注入

于 2013-07-24T06:20:48.910 回答
3

您的数据可能包含一些特殊字符,例如单引号,这会使您的语句失败。

所以最好使用参数化查询参数化查询在运行 SQL 查询之前会正确替换参数。

SqlCommand insertNewAreaPath = new SqlCommand(
    "insert into QuestionMaster (Question, ClientID, KioskID) VALUES(@Question, @ClientID, @KioskID)", con);
insertNewAreaPath.Parameters.Add("@Question", txtQuestion.Text);
insertNewAreaPath.Parameters.Add("@ClientID", ViewState("ClientID"));
insertNewAreaPath.Parameters.Add("@KioskID", ViewState("KioskID"));
insertNewAreaPath.ExecuteNonQuery();

其他:使用.Replace("'", "''")

gc.ExecuteCommand("insert into QuestionMaster values('" & txtQuestion.Text.Replace("'", "''") & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')")
于 2013-07-24T06:22:41.153 回答
2

您可以通过将txtQuestion.Text 中的单引号 (') 替换为两个单引号 ('') 来转义单引号。

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
    gc.ExecuteCommand("insert into QuestionMaster values('" & txtQuestion.Text.Replace("'", "''") & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')")
    Response.Write("<script type='text/javascript' language='javascript'>alert('Question Added Sucessfully!!!')</script>")
    BindGrid()
End Sub
于 2013-07-24T06:24:22.363 回答
0

将 ' 替换为 '' 就可以了。

试试这个 你叫什么名字?

于 2013-07-24T06:21:10.773 回答
0
//declare this variable

String sql="insert into QuestionMaster values('" & txtQuestion.Text & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')";

调试它,你会发现它出现问题的地方。

于 2013-07-24T06:23:50.240 回答