Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将下拉表代码更改为追加/插入_Sql Server_Ms Access_Vba - Fatal编程技术网

Sql server 将下拉表代码更改为追加/插入

Sql server 将下拉表代码更改为追加/插入,sql-server,ms-access,vba,Sql Server,Ms Access,Vba,这段代码目前正在使用一个DROP表将数据从Access传输到sqlserver,也就是说,它原本是供一个人使用的。现在它将被多人使用,所以我需要修改代码以附加。我试图找出如何让它检查目标表,看看记录是否已经存在,如果存在,它将跳过它,如果不存在,它将把员工数据写入表中。SQL表是预构建的,它具有access表没有的行ID列和时间戳列,以便跟踪输入的记录 代码当前看起来像: Public Function Update() Dim cdb As DAO.Database, qdf As DAO.Q

这段代码目前正在使用一个DROP表将数据从Access传输到sqlserver,也就是说,它原本是供一个人使用的。现在它将被多人使用,所以我需要修改代码以附加。我试图找出如何让它检查目标表,看看记录是否已经存在,如果存在,它将跳过它,如果不存在,它将把员工数据写入表中。SQL表是预构建的,它具有access表没有的行ID列和时间戳列,以便跟踪输入的记录

代码当前看起来像:

Public Function Update()
Dim cdb As DAO.Database, qdf As DAO.QueryDef
Dim err As DAO.Error
Const DestinationTableName = "AC_CDData"
Const ConnectionString = _
    "ODBC;" & _
        "Driver={SQL Server Native Client 10.0};" & _
        "Server=SERVER;" & _
        "Database=DB;" & _
        "UID=ID;" & _
        "PWD=PW;"
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = ConnectionString
qdf.SQL = _
    "IF EXISTS " & _
        "(" & _
            "SELECT * FROM INFORMATION_SCHEMA.TABLES " & _
            "WHERE TABLE_NAME='" & DestinationTableName & " '" & _
        ") " & _
    "DROP TABLE [" & DestinationTableName & "]"
qdf.ReturnsRecords = False
On Error GoTo Update_qdfError
qdf.Execute dbFailOnError
On Error GoTo 0
Set qdf = Nothing
Set cdb = Nothing
DoCmd.TransferDatabase _
    acExport, _
    "ODBC Database", _
    ConnectionString, _
    acTable, _
    "CDData", _
    DestinationTableName, _
    False
Exit Function

Update_qdfError:
For Each err In DAO.Errors
MsgBox err.Description, vbCritical, "Error " & err.Number
Next
End Function

DoCmd.TransferDatabase
将数据从Access表完全传输到SQL Server数据库。此函数无法基于现有记录执行部分插入

但是,您可以做的是将数据导出到临时新表中(而不删除现有表),然后执行SQL
MERGE
语句,将临时表的新记录与现有表合并


您需要知道如何从VBA对SQL数据库执行SQL查询,并且需要知道如何使用SQL
MERGE
语句。谷歌搜索将很快为您提供这两个问题的答案。

只需在Access中设置一个到SQL server的简单标准链接表即可

由于现有记录的列是一个主键(或者简单地说是一个index set=unique),因此您只需要一行代码来附加数据

这将有助于:

CurrentDb.Execute "INSERT INTO AC_CDData SELECT * FROM CDData;"
由于键(或索引)冲突,已存在的任何行都将被忽略。因此,只有新的不存在的记录才会附加上述一行代码

编辑: 至于目标表是SQL链接表?启动时的应用程序并不关心是否有一些链接表。除非您使用这些链接表,否则您的应用程序既不使用也不关心这些链接表

这里假设您有一个本地数据表。链接表仅在您要进行导出时起作用。如上所述,除非连接到SQL server,否则无法导出。本问题不涉及“代码”或测试(如果您已连接),但即使在这两种情况下它都是问题的一部分,您仍必须测试连接,并且在您最终确定您已连接并决定导出时,再次按照上述方法导出链接表

因此,我实在想不出为什么只有在附加到SQL表的过程中才使用链接表会有任何问题


如上所述,一行VBA代码在这里就足够了。

如果同时使用,则需要更改流程:

  • DestinationTableName
    每个会话(线程)必须是唯一的,并且需要更改(从常量更改为变量)

  • 带有
    DestinationTableName
    neame和neame的选项卡需要在导出数据之前删除(与当前解决方案中的情况相同)

  • DoCmd.TransferDatabase
    不会更改-数据将导出到唯一的临时表中

  • 为了简化
    合并
    过程,可以在SQL Server端使用源表名作为参数编写存储过程(包括所有需要的APSERT逻辑)。需要在
    DoCmd.TransferDatabase
    完成后调用此SP

  • 在这种情况下,流量如下所示:

    • DestinationTableName
      唯一名称生成
    • 正在SQL Server端删除此表(
      qdf.Execute…
    • 将数据导出到临时表(
      DoCmd.TransferDatabase…
    • 在SQL Server端合并数据(使用所需的更新/插入逻辑调用已创建的SP)

    这是我应该做的,但不会总是连接到sql server。因此,ACCESS DB中有一个本地表,数据保存到该表中。我需要这段代码在数据运行时也将其上传到sql server表中。不清楚“不总是连接的”是什么意思。如果要进行导出,则必须具有到sql server的有效连接,否则如何导出?链接表的事实在您实际使用它之前并不重要。所以,在应用程序启动时,对于您是否实际连接,不必担心。因此,这意味着链接表的“存在”在您实际使用它之前没有任何意义。我修改了响应以解释链接表问题。我试图不断得到错误:运行时错误3024:找不到文件c:\Users……此代码的目的是仅在存在连接时才将数据写入sql server,如果没有,则只需将数据存储在本地表中,直到下次打开数据库并建立连接为止