我正在尝试插入具有以下列的数据库: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中却没有。
答案 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 如果这也解决了语法错误,请告诉我。