获取插入语句错误,我无法弄清楚什么是错误的

时间:2010-02-23 18:52:55

标签: .net sql vb.net insert

我正在尝试插入具有以下列的数据库:ID(自动编号),BonderIdentifier(文本),用户名(文本),登录(日期),注销(日期)。

BonderIdentifier,用户名,登录是PK。

以下是我的工作:

 Public Function submitNewToDB(ByVal sessionData As BonderSession) As Boolean
    Dim cn As OleDbConnection
    Dim cmd As OleDbCommand
    Dim str As String

    Try
        cn = New OleDbConnection("Provider=microsoft.Jet.OLEDB.4.0;Data Source=G:\Sean\BMSBonder3_0.mdb;")
        cn.Open()
        str = String.Format("Insert into Session ([BonderIdentifier], [Username], [Login]) values ('{0}', '{1}', '{2}')", sessionData.bonderIdentifier _
                 , sessionData.username, sessionData.login)
        cmd = New OleDbCommand(str, cn)
        cmd.ExecuteNonQuery()
        cn.Close()

    Catch ex As Exception
        Return False

    End Try

    Return True

End Function

就像我说的那样,插入错误,我不知道为什么。数据库中没有任何内容,表格已创建。

修改 我在Access中运行构建的字符串:

插入会话([BonderIdentifier],[用户名],[登录])值('Mork','sean','2/23/2010 11:12:42 AM')

它的确有效......但在VS中却没有。

4 个答案:

答案 0 :(得分:4)

使用Access / Jet数据库引擎时,日期用#符号分隔,而不是'符号。尝试将您的陈述更改为:

str = String.Format("Insert into Session ([BonderIdentifier], [Username], [Login]) values ('{0}', '{1}', #{2}#)" _
             , sessionData.bonderIdentifier, sessionData.username, sessionData.login)

答案 1 :(得分:1)

这是一个语法错误意味着你的语句(str)有问题。

错误发生时str的确切值是多少?我猜它是这样的:

Insert into Session ([BonderIdentifier], [Username], [Login]) values ('Bill O'Brien', 'some text', 'some other text')"

'中的Bill O'Brien是我的示例中的问题。解析器认为'关闭了文本值,然后看到更多文本而不是逗号或)

也可能是错误的数据格式化,Access不理解为日期。我希望看到字符串来识别问题。

编辑:

访问需要传递日期值,#围绕值,而不是'

像这样:

Insert into Session ([BonderIdentifier], [Username], [Login]) values ('Bill OBrien', 'some text', #yourdatevalue#)"

答案 2 :(得分:0)

我怀疑问题在于日期转换为字符串的方式。你可以发布查询输出(替换后),所以我们可以看到真正的问题吗?

答案 3 :(得分:0)

我已重写您的代码以使用使用语句参数

Public Sub SubmitSessionToDB(ByVal sessionData As BonderSession)
    Using conn AS New OleDbConnection("Provider=microsoft.Jet.OLEDB.4.0;Data Source=G:\Sean\BMSBonder3_0.mdb;")
        Using cmd AS New OleDbCommand("Insert into Session ([BonderIdentifier], [Username], [Login]) values (@BonderId, @Username, @Login)", conn)
                cmd.CommandType = CommandType.Text
                cmd.Parameters.AddWithValue("@BonderId", sessionData.bonderIdentifier)
                cmd.Parameters.AddWithValue("@Username", sessionData.username)
                cmd.Parameters.AddWithValue("@Login", sessionData.login)

                conn.Open()
                cmd.ExecuteNonQuery()                
        End Using
    End Using
End Sub

我是在没有Visual Studio的情况下编写的,因此可能会出现一些小错误。

using语句确保连接始终关闭(即使发生异常) 这些参数可以防止SQL注入,增加可读性并使错误更易于检测。

如果您仍然需要返回值,则可以添加您拥有的try catch 如果这也解决了语法错误,请告诉我。