【问题标题】:Syntax error in my SQL statement "INSERT INTO"我的 SQL 语句“INSERT INTO”中的语法错误
【发布时间】:2014-07-28 07:31:13
【问题描述】:

我有一个包含两个不同表的数据库。

**call_code**                      activity
call_id                            activity_id
maintCall_plan                     activity_desc
maintCall_unplanned                contact_person
creditCalls                        day
newBussCalls                       activity_date
phoneCalls                         revenue
                                   time

我无法调试我的代码。问题是insert into 语句中的语法错误,并且突出显示了conConnection.Execute。这是我的代码 sn-p:

Private Sub Command1_Click()
Dim conConnection As ADODB.Connection
Dim cmdCommand As New ADODB.Command
Dim strSql As String

Set conConnection = New ADODB.Connection

conConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
  App.Path & "\" & "db_weekActRep.mdb;Mode=Read|Write"
conConnection.CursorLocation = adUseClient
conConnection.Open

sqlStr = "INSERT INTO activity(activity_desc, contact_person, day, activity_date, revenue, time) VALUES ("
sqlStr = sqlStr & "'" & txtAct8am.Text & "',"
sqlStr = sqlStr & "'" & txtComp8am.Text & "',"
sqlStr = sqlStr & "'" & Label31.Caption & "',"
sqlStr = sqlStr & "'" & Label20.Caption & "',"
sqlStr = sqlStr & "'" & txtRev8am.Text & "',"
sqlStr = sqlStr & "'" & Label9.Caption & "')"
    conConnection.Execute sqlStr

 Select Case Combo1.ListIndex
    Case 0

        sqlStr = "INSERT INTO call_code(maintCall_plan) VALUES ("
        sqlStr = sqlStr & "'" & "1" & "')"
        conConnection.Execute sqlStr

    Case 1
        sqlStr = "INSERT INTO call_code(maintCall_unplanned) VALUES ("
        sqlStr = sqlStr & "'" & "2" & "')"
        conConnection.Execute sqlStr

    Case 2
        sqlStr = "INSERT INTO call_code(creditCalls) VALUES ("
        sqlStr = sqlStr & "'" & "3" & "')"
        conConnection.Execute sqlStr

    Case 3
        sqlStr = "INSERT INTO call_code(newBussCalls) VALUES ("
        sqlStr = sqlStr & "'" & "4" & "')"
        conConnection.Execute sqlStr

    Case 4
        sqlStr = "INSERT INTO call_code(phoneCalls) VALUES ("
        sqlStr = sqlStr & "'" & "5" & "')"
        conConnection.Execute sqlStr

End Select
End Sub

另外,我想知道是否可以使用一个点击事件或按钮将数据插入到两个不同的表中?如果是,我做对了吗?

顺便说一句,我没有为活动表添加activity_id,因为它是自动递增的。与 call_code 表的 call_id 相同。任何帮助将不胜感激。

【问题讨论】:

  • 请不要转发问题。如果您有更改或新信息,您可以对现有问题进行修改。
  • 不要像这样连接你的 SQL。您正在向SQL Injection 敞开心扉。请改用参数。
  • @Oded 先生的“不连接”是什么意思?是否可以在一个点击事件中有多个插入语句?

标签: sql ms-access vb6


【解决方案1】:

您的第一个INSERT 声明以这种错误的方式声明:

您有两个字段activity_desc, contact_person,但您尝试插入两个以上的字段(六个用于精确)。所以你必须添加其他 4 个缺失的字段

sqlStr = "INSERT INTO activity(activity_desc, contact_person) VALUES ("
sqlStr = sqlStr & "'" & txtAct8am.Text & "',"
sqlStr = sqlStr & "'" & txtComp8am.Text & "',"
sqlStr = sqlStr & "'" & Label31.Caption & "',"
sqlStr = sqlStr & "'" & Label20.Caption & "',"
sqlStr = sqlStr & "'" & txtRev8am.Text & "',"
sqlStr = sqlStr & "'" & Label9.Caption & "')"

在 INSERT INTO 语句中添加 4 个缺失字段。

两秒INSERT(在CASE 语句中)不填充主键。如果你使用自动增量字段没关系,否则它是错误的,因为主键不能为 NULL

【讨论】:

  • ohhh.. 我的错.. 即使我添加了缺少的字段,它仍然给我同样的错误.. 顺便说一下,我没有包含活动表的 activity_id,因为它是自动增量的.与 call_code 表的 call_id 相同。我将编辑我的问题。
【解决方案2】:

首先,在 INSERT INTO activity(activity_desc, contact_person) 中,您有两列但有 6 个值。输入 2 个值或添加 4 列。 IE。 INSERT INTO activity(activity_desc, contact_person,day, activity_date,income, time) VALUES 如果这些是您要添加的列,或者 sqlStr = "插入活动(activity_desc,contact_person) VALUES (" sqlStr = sqlStr & "'" & txtAct8am.Text & "'," sqlStr = sqlStr & "'" & txtComp8am.Text & "',";

【讨论】:

  • 在你调用 conConnection.Execute sqlStr 之前你能告诉我们 sqlStr 的值是多少
  • 我只是将 sql 语句分配给一个字符串变量,即 sqlStr。这就是 sqlStr 的用途。
  • 我的意思是告诉我们实际值,来自调试
  • 先生,我不明白你的意思。在我自己的理解中,sqlStr 的值将是用户输入的值或标签的标题是什么......
  • sqlStr 的值取决于你的输入,正确。只需在文本框、标签的标题等上输入一些值,然后告诉我 sqlStr 的值,看看为什么会出现语法错误
【解决方案3】:

我可以在这里看到三个潜在的问题:

  1. 您将看起来像是日期字段的内容作为字符串传递。您可能需要格式化该日期以便 MS-Access 识别它,例如转换为“YYYYMMDD”或“DD/MM/YYYY”格式。我不记得 Access 是如何喜欢日期的,但我似乎记得它可能很挑剔。

  2. 您的文本字段中可能包含单引号,因此您可能需要将单引号替换为 2 x 单引号,即“can't”变为“can''t”。

    李>
  3. 您还将看似数字的内容作为带引号的字符串传递。如果它不能解析为数字,那么这将引发错误。

调试启动你的程序,然后在执行语句之前中断它。检查 sqlStr 的内容,然后将其复制/粘贴到您的数据库中。当您直接从 MS-Access 执行 INSERT 时,它可能会给您一个更有帮助的错误?

【讨论】:

  • sir @Hansell 在插入日期之前如何格式化?我知道在标签或文本框中显示日期时格式化日期的语法,但我不知道如何在插入语句中格式化它。这是语法对吗? Label2.Caption = Format(Label2.Caption, "d-mmm")如果我错了请纠正我
  • tbh 这取决于你在哪里,有时 MS-Access 喜欢非常奇怪的日期,例如'#2014-12-13#' 用于 INSERT 语句,有时在 WHERE 子句中使用日期时只需要那些奇怪的哈希值。最好的办法是在 Access 中编写 SQL,直到它完成您想要的操作,然后将该格式复制到您的代码中。
  • 另外,您不需要格式化标题的内容,您可以在构建字符串时应用格式,例如sqlStr = sqlStr & "'#" & Format(Label20.Caption, "yyyy-mm-dd") & "#'"。
  • 这篇文章更详细地解释了 MS-Access 中的日期问题。 stackoverflow.com/questions/771861/…
  • 先生,我也试过做第二个,但有一个问题。它插入的是文本框的名称而不是它的值。
【解决方案4】:

我现在明白了,伙计们。我只是在我的某些领域缺少一个括号。这是代码 sn-p..

sqlStr = "INSERT INTO activity(activity_desc, contact_person, revenue, [day], activity_date, [time]) VALUES ("
sqlStr = sqlStr & "'" & txtAct8am.Text & "',"
sqlStr = sqlStr & "'" & txtComp8am.Text & "',"
sqlStr = sqlStr & "'" & txtRev8am.Text & "',"
sqlStr = sqlStr & "'" & Label31.Caption & "',"
sqlStr = sqlStr & "'" & Label20.Caption & "',"
sqlStr = sqlStr & "'" & Label9.Caption & "')"
conConnection.Execute sqlStr

我只需要将日期和时间字段括在括号中。感谢您的回复,我真的很感激。我的程序现在正在运行。再次感谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多