【问题标题】:SQLCe Database in VB.NET Throws Exception while inserting data in tableVB.NET 中的 SQLCe 数据库在表中插入数据时引发异常
【发布时间】:2013-10-14 18:58:20
【问题描述】:

我正在使用数据库,今天在尝试使用 SQLCompactEdition 数据库时,我创建了一个名为 UserDB 的本地数据库,并在其中有一个名为 User 的表。

我已经使用我的应用程序(这是另一个数据库)登录到管理员,并通过管理员创建了一个用户。

我用于此目的的代码是:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim connStr As New SqlCeConnection("Data Source=c:\users\babi\documents\visual studio 2012\Projects\ShopManagement\ShopManagement\" & "User\UserDB.sdf; Password =")
        Dim name, pass, repass As String
        name = TextBox1.Text
        If (name.Length = 0) Then
            MessageBox.Show("Enter user-name!!")
            Exit Sub
        End If
        pass = TextBox2.Text
        If (pass.Length = 0) Then
            MessageBox.Show("Enter password!!")
            Exit Sub
        End If
        repass = TextBox3.Text
        If (repass.Length = 0) Then
            MessageBox.Show("Re-enter password!!")
            Exit Sub
        End If
        If (getMD5Hash(pass) = getMD5Hash(repass)) Then
            Dim cmd As New SqlCeCommand("INSERT INTO User(uname, upass)VALUES(" & name & "," & getMD5Hash(pass) & ");", connStr)
            connStr.Open()
            cmd.ExecuteNonQuery()
            connStr.Close()
            MessageBox.Show("User Created!")
            Exit Sub
        Else
            MessageBox.Show("Passwords donot match!!")
            Exit Sub
        End If
    End Sub

当我调试时,我发现查询字符串是:

"INSERT INTO User(uname, upass)VALUES(abcd,827ccb0eea8a706c4c34a16891f84e7b);"

发生的异常是:

An unhandled exception of type 'System.Data.SqlServerCe.SqlCeException' occurred in System.Data.SqlServerCe.dll

我无法理解导致此错误的原因。 如果需要更多信息,请询问。

编辑

固定代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim connStr As New SqlCeConnection("Data Source=c:\users\babi\documents\visual studio 2012\Projects\ShopManager\ShopManager\" & "ManagementDB.sdf; Password =")
        Dim name, pass, repass As String
        name = TextBox1.Text
        If (name.Length = 0) Then
            MessageBox.Show("Enter user-name!!")
            Exit Sub
        End If
        pass = TextBox2.Text
        If (pass.Length = 0) Then
            MessageBox.Show("Enter password!!")
            Exit Sub
        End If
        repass = TextBox3.Text
        If (repass.Length = 0) Then
            MessageBox.Show("Re-enter password!!")
            Exit Sub
        End If
        If (getMD5Hash(pass) = getMD5Hash(repass)) Then
            Dim cmd As New SqlCeCommand("INSERT INTO [User](uname, upass) VALUES('" & name & "','" & getMD5Hash(pass) & "');", connStr)
            connStr.Open()
            cmd.ExecuteNonQuery()
            connStr.Close()
            MessageBox.Show("User Created!")
            Exit Sub
        Else
            MessageBox.Show("Passwords donot match!!")
            Exit Sub
        End If
    End Sub

问题的解决方案是由两个解决方案的组合给出的! 所以谢谢你们两个:)

问候 普利亚布拉塔

【问题讨论】:

    标签: vb.net exception sql-server-ce sql-insert


    【解决方案1】:

    查询中的大问题

    首先,USER 是reserved keyword。如果你想使用它,你需要用方括号将它封装起来。然后,当您尝试连接字符串以构建 Sql 命令时会遇到问题。相反,您应该使用参数化查询。最后,打开Using statement 中的连接。通过这种方式,您可以确保在出现异常的情况下连接也会被关闭和 DISPOSED(这对 SqlCeCommand 也有好处)。

    所以,我会改写

    Dim pwd = getMD5Hash(pass)
    Dim cmdText = "INSERT INTO [User] (uname, upass) VALUES (@name, @pwd)"
    Using connStr As New SqlCeConnection(......)
    Using cmd As New SqlCeCommand(cmdText, connStr)
        cmd.Parameters.AddWithValue("@name", name)
        cmd.Parameters.AddWithValue("@pwd", pwd)
        connStr.Open()
        cmd.ExecuteNonQuery()
    End Using
    End Using
    

    【讨论】:

    • @Priyabrata 我看到您选择了不同的答案,没问题,但请记住字符串连接是通往地狱的道路(Sql Injection)。如果我在用户名字段中写 x'; DELETE FROM [user]-- 会发生什么? (请不要尝试,look at this
    • 我明白了!感谢您指出。这是我第一次与 DB 出游,所以我不知道。非常感谢史蒂夫 :)
    【解决方案2】:

    如果 uname, upass 列是 string/varchar 尝试在插入操作期间在值周围添加引号字符 ('):

    Dim cmd As New SqlCeCommand("INSERT INTO User(uname, upass) VALUES('" & name & "','" & getMD5Hash(pass) & "');", connStr)
    

    所以你的查询应该变成:

    INSERT INTO User(uname, upass) VALUES('abcd','827ccb0eea8a706c4c34a16891f84e7b');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2015-03-21
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      相关资源
      最近更新 更多