获取插入语句错误,我不知道什么是错
我试图插入一个数据库与具有以下列: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它没有。
它是语法错误意味着您的语句(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#)"
我怀疑问题是日期转换为字符串的方式。你可以发布查询输出(替换后),所以我们可以看到真正的问题?
我已经重写你的代码使用使用声明和参数。
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。
请让我知道这是否也解决了语法错误。
我这样做,没有错别字,这不起作用。发生同样的错误。 – 2010-02-23 19:18:32
使用Access/Jet数据库引擎时,日期使用#
符号而不是'
符号分隔。尝试更改您的语句为:
str = String.Format("Insert into Session ([BonderIdentifier], [Username], [Login]) values ('{0}', '{1}', #{2}#)" _
, sessionData.bonderIdentifier, sessionData.username, sessionData.login)
答案!!!就是这个!!!!谢谢! – 2010-02-23 19:20:00
@Sean:记住,用String.Format编写查询总是一个不好的做法(即使它是5分钟的解决方案)。 – Zyphrax 2010-02-23 19:22:04
Zyphrax是对的,使用参数化查询或类似的东西会更好。 – 2010-02-23 19:39:30
实际的错误是“语法错误” – 2010-02-23 18:54:14
的错误意味着有什么不对您的发言('str')。当你得到错误时,'str'的确切值是什么? – 2010-02-23 19:01:02