【问题标题】:INSERT INTO method not functioningINSERT INTO 方法不起作用
【发布时间】:2019-05-16 16:45:40
【问题描述】:

我在用一个表单中的信息填充三个表时遇到问题,该表单在相关表单中的 On Click 事件上运行 3 行 INSERT INTO

我有一个填写好的表格并有一个提交按钮。单击提交按钮时,表单中的信息应该填充 3 个不同的表格(下面提供的代码)。

这些表是NetworksRadiosScans

Networks 有一个主键SSID,它与Radios 表中的SSID 字段是一对多的关系。 Radios 表有一个主键BSSID,它与Scans 表中的BSSID 字段是一对多的关系。 Scans 表有一个名为 index 的主键,它只是一个自动编号类型,所有其他字段都需要能够接受重复项。

当关系完好时,只填写networks 表;但如果我删除这些关系,则 networksscans 表将被填写,但 Radios 表仍为空白。

目前我不知道问题是什么;除了推测它与Radios 表有关。

BSSID 的表单字段和Radios 表中的BSSID 字段都有以下掩码:

AA:AA:AA:AA:AA:AA;

主键设置为必需,BISSD 的长度不为零,已编入索引(无重复项)。

三个表都是空的,所以我知道不存在重复问题。

另外,如果我通过 GUI 以规定的顺序填写表格,我没有问题。

这是我正在使用的代码,请记住我上面所说的关系。 (另请注意,如果我删除所有关系,NetworksScans 表将填充,但Radios不会填充)。

CurrentDb.Execute "INSERT INTO Networks (SSID, Network, Authentication, Encryption)" & "VALUES ('" & Me.txt_SSID & "', '" & Me.cmb_NetworkType & "', '" & Me.cmb_AuthenticationType & "', '" & Me.cmb_EncryptionType & "')"

CurrentDb.Execute "INSERT INTO Radios (BSSID, SSID, [Radio Type], Channel, [Base Rate], [Other Rate])" & "VALUES ('" & Me.txt_BSSID & "', '" & Me.txt_SSID & "', '" & Me.cmb_RadioType & "', '" & Me.txt_Channel & "', '" & Me.txt_BaseRate & "', '" & Me.txt_OtherRate & "')"

CurrentDb.Execute "INSERT INTO Scans ([Scan Date], Location, BSSID, [Signal Strength])" & "VALUES ('" & Me.cmb_ScanDate & "', '" & Me.cmb_ScanLocation & "', '" & Me.txt_BSSID & "', '" & Me.txt_SignalStrength & "')"

我的期望是所有三个表都在执行此代码时填充新记录。

【问题讨论】:

  • SSID 看起来也是一个潜在的罪魁祸首。该字段的插入失败将给出与 BSSID 相同的结果。几个问题。 1. Networks and Radios中SSID的数据类型和掩码是否相同,Radios和Scans中BSSID的数据类型和掩码是否相同? 2.您是否在查询设计器/sql 视图中重建了这些查询?您可以使用 Forms!YourForm!YourControl.Value 引用表单控件来模仿“Me.txt”。这样做可以让您利用在 VBA 代码中运行时没有得到的错误提示。
  • 数据类型和掩码在每个表以及表单中都匹配。都是短字符串,只有BSSID被屏蔽,屏蔽是一样的。我没有使用查询编辑器,我是直接构建 VBS 代码。我将查看查询生成器。
  • 实际上,更新您的插入语句以包含 dbFailOnError 选项。 CurrentDb.Execute "YourSQLString", dbFailOnError 这将为您提供与查询生成器失败时相同的提示。让我们知道,什么,如果有什么弹出
  • Mike - 谢谢,帮了大忙,原来我的 Radio Type 组合框是罪魁祸首。组合框由我用作 WiFi 无线电类型(例如 802.11ac、802.11g 等)控件的表填充。为了输入大量数据,选择该选项作为反对选项变得很痛苦,比如自动填充字段。所以我所做的是为那个条目制作一个掩码,802.11L?,所以你只需要输入 1 或 2 个字母,组合框会自动填充其余的。我想是因为带有掩码的组合框显示了正确的文本,显示的内容将被输入....
  • ...进入表字段,但由于我添加了失败错误,我发现情况并非如此。非常感谢!!!!

标签: sql vba ms-access


【解决方案1】:

正如您所解释的,Scans 是基表,Radios 作为其子表,Networks 作为其孙表。因此,由于依赖字段,首先使用 Scans 和最后 Networks 更改操作查询的顺序。此外,考虑使用QueryDefs 进行参数化,以便在 SQL 和应用层 (VBA) 之间实现更清晰、更易于维护和可读的代码:

SQL (将每个保存为存储的 Access 查询)

  1. 扫描追加

    PARAMETERS Scan_date_param TEXT, Scan_loc_param TEXT, BSSID_param TEXT, Signal_param TEXT;
    INSERT INTO Scans ([Scan Date], Location, BSSID, [Signal Strength])
    VALUES (Scan_date_param, Scan_loc_param, BSSID_param, Signal_param);
    
  2. 无线电附加

    PARAMETERS BSSID_param TEXT, SSID_param TEXT, Radio_param TEXT,
               Channel_param TEXT, Base_rate_param TEXT, Other_rate_param TEXT;
    INSERT INTO Radios (BSSID, SSID, [Radio Type], Channel, [Base Rate], [Other Rate]) 
    VALUES (BSSID_param, SSID_param, Radio_param,
            Channel_param, Base_rate_param, Other_rate_param);
    
  3. 网络附加

    PARAMETERS SSID_param TEXT, Network_param TEXT, Auth_param TEXT, Encryp_param TEXT;
    INSERT INTO Networks (SSID, Network, Authentication, Encryption)
    VALUES (SSID_param, Network_param, Auth_param, Encryp_param);
    

VBA (分配每个查询并绑定参数,没有引号或字符串连接)

Dim qdef As QueryDef

Set qdef = CurrentDb.QueryDefs("myScansAppendQ")

qdef!Scan_date_param = Me.cmb_ScanDate
qdef!Scan_loc_param = Me.cmb_ScanLocation
qdef!BSSID_param = Me.txt_BSSID
qdef!Signal_param = Me.txt_SignalStrength

qdef.Execute dbFailOnError
Set qdef = Nothing

Set qdef = CurrentDb.QueryDefs("myRadiosAppendQ")

qdef!BSSID_param = Me.txt_BSSID
qdef!SSID_param = Me.txt_SSID
qdef!Radio_param = Me.cmb_RadioType
qdef!Channel_param = Me.txt_Channel
qdef!Base_rate_param = Me.txt_BaseRate
qdef!Other_rate_param = Me.txt_OtherRate

qdef.Execute dbFailOnError
Set qdef = Nothing

Set qdef = CurrentDb.QueryDefs("myNetworksAppendQ")

qdef!SSID_param = Me.txt_SSID
qdef!Network_param = Me.cmb_NetworkType
qdef!Auth_param = Me.cmb_AuthenticationType
qdef!Encryp_param = Me.cmb_EncryptionType

qdef.Execute dbFailOnError
Set qdef = Nothing

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多