2010-02-23 109 views
0

我试图插入一个数据库与具有以下列: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 

就像我说的,我得到一个INSERT INTO错误,我不知道为什么。数据库中还没有任何东西可以创建表格。

编辑 我跑在访问内置的字符串作为这样的:

INSERT INTO会议([BonderIdentifier],[用户名],[登录])VALUES( '莫克', '肖恩',“2/23/2010 11:12:42 AM')

它的工作原理....但在VS它没有。

+0

实际的错误是“语法错误” – 2010-02-23 18:54:14

+0

的错误意味着有什么不对您的发言('str')。当你得到错误时,'str'的确切值是什么? – 2010-02-23 19:01:02

回答

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#)" 
0

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

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。
请让我知道这是否也解决了语法错误。

+0

我这样做,没有错别字,这不起作用。发生同样的错误。 – 2010-02-23 19:18:32

4

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

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

答案!!!就是这个!!!!谢谢! – 2010-02-23 19:20:00

+3

@Sean:记住,用String.Format编写查询总是一个不好的做法(即使它是5分钟的解决方案)。 – Zyphrax 2010-02-23 19:22:04

+1

Zyphrax是对的,使用参数化查询或类似的东西会更好。 – 2010-02-23 19:39:30