如何编辑'bit'数据类型?

时间:2009-10-22 15:43:58

标签: .net asp.net database vb.net

我在Visual Basic中编码。我正在使用复选框控件。现在,根据其检查的属性,我需要在SQL Server数据库中设置/取消设置一个位列。这是代码:

Try
    conSQL.Open()

    Dim cmd As New SqlCommand("update Student set send_mail = " + _
        sendemailCheckBox.Checked.ToString + " where student_id = '" _
        + sidnolabel.Text + "'", conSQL)

    cmd.ExecuteNonQuery()
Finally
    conSQL.Close()
End Try

send_mail属性是位数据类型。此代码无效。 我该怎么做呢?

5 个答案:

答案 0 :(得分:52)

我儿子就读于你的学校。他的名字是:

  

罗伯特'); DROP TABLE学生; -

我们称他为小鲍比表。


好的,我被告知这将被删除为not an answer并且我需要落剑或清理我自己的烂摊子。虽然我会保留
我的代表,如果它被删除我认为重要的是指出OP的代码中的漏洞(可能他的帐户安息吧)。所以详细说明......

让我们实际上将XKCD漫画中的上述名称修改为对连接查询实际起作用的内容(假设OP的布尔问题已修复):

  

123; DROP TABLE学生; -

如果我们在sidnolabel文本框中添加它(或者它是什么;如果它在视图状态中你可以用一个简单的工具改变它),那么生成的连接查询是

update Student   
set send_mail = 1  
where student_id = 123; DROP TABLE STUDENT; --'

将运行伪查询,然后删除Student表。

这是“不好”的定义。

OP应该做的是使用参数化查询。这可以防止像这样的注入攻击。更新OP的代码......

Try
    conSQL.Open()
    Dim cmd As New SqlCommand(
        "update Student " + _ 
        "set send_mail = @sendMail " + _
        "where student_id = @studentId", conSQL)
    cmd.Parameters.Add( _
        "@sendMail", SqlDbType.Bit).Value = _
            sendemailCheckBox.Checked
    cmd.Parameters.Add( _
        "@studentId", SqlDbType.NChar, 25).Value = _
             sidnolabel.Text ' better to keep track of this in the Session!
    cmd.ExecuteNonQuery()
Finally
    conSQL.Close()
End Try

哪个应该解决OP的问题防止sql注入攻击。那不是吗?

*请注意,我没有VB,这是未经测试的。任何想要编辑和修复错误的VB.NET开发者我都乐意接受你的帮助。

答案 1 :(得分:6)

尝试:

Convert.ToInt16(sendemailCheckBox.Checked)

一般情况下,我使用SqlParameters进行此操作,您可以指定SqlDbType.TinyInt

Here是使用sqlparameter的一个例子,它更好,因为它避免了SQL注入。

编辑:我刚刚注意到您使用的是bit,而不是tinyint。不确定这是否有效。

答案 2 :(得分:6)

要回答您的问题,只需将一个布尔值(即sendemailCheckBox.Checked)分配给数据库中的位列。

为了帮助解决SQL注入问题 - 不要直接将用户输入写入SQL字符串。您必须使用参数来确保用户不会弄乱您的数据库。您的代码应该是这样写的:

Using conSQL As New SqlConnection("SomeConnectionString")
   conSQL.Open()
   Using cm as SqlCommand = conSQL.CreateCommand()
      cm.CommandType = CommandType.Text
      cm.CommandText = "UDPATE Student SET send_mail = @send_mail WHERE student_id = @student_id"
      cm.Parameters.AddWithValue("@send_mail", sendemailCheckBox.Checked)
      cm.Parameters.AddWithValue("@student_id", sidnolabel.Text)

      cm.ExecuteNonQuery()
   End Using
End Using

答案 3 :(得分:5)

首先,以一切神圣的名义,至少PARAMETERIZE你的SQL代码。否则,您要求进行SQL注入攻击。

其次,“bit”数据类型使用1表示True,0表示False。这就是SQL在分配值时想要看到的内容。

答案 4 :(得分:1)

井位数据类型相当于C#或Visual Basic中的布尔值,因此您可以简单地为这些类型指定true或false值,然后可以更新数据库中的记录。