【问题标题】:Getting Insert statement Error, I cant figure out whats wrong though获取插入语句错误,但我不知道出了什么问题
【发布时间】:2010-02-23 18:52:55
【问题描述】:

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

BonderIdentifier、Username、Login就是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]、[Username]、[Login])值('Mork'、'sean'、'2/23/2010 11:12:42 AM')

它可以工作....但在 VS 中却不行。

【问题讨论】:

  • 实际错误是“语法错误”
  • 这个错误意味着你的陈述有问题(str)。当您收到错误消息时,str 的确切值是多少?

标签: .net sql vb.net insert


【解决方案1】:

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

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

【讨论】:

  • @Sean:请记住,使用 String.Format 编写查询总是一种不好的做法(即使是 5 分钟的解决方案)。
  • Zyphrax 是对的,使用参数化查询或类似的东西会更好。
【解决方案2】:

这是一个语法错误意味着你的语句(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#)"

【讨论】:

    【解决方案3】:

    我怀疑问题出在日期转换为字符串的方式上。您能否发布查询输出(替换后),以便我们看到真正的问题?

    【讨论】:

      【解决方案4】:

      我已重写您的代码以使用 Using 语句Parameters

      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。
      如果这也解决了语法错误,请告诉我。

      【讨论】:

      • 我这样做了,没有错别字,这不起作用。发生同样的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多