Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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 VBA ADO更新查询_Sql_Excel_Vba_Ado - Fatal编程技术网

Sql VBA ADO更新查询

Sql VBA ADO更新查询,sql,excel,vba,ado,Sql,Excel,Vba,Ado,我正在尝试创建链接到“服务器”主excel文件的动态客户端excel文件 目标是使每个文件中的所有数据保持更新。基本上,当客户机文件打开时,我从主文件中得到一个更新,然后我想根据客户机文件中的每一个更改来更新主文件 我可以很容易地使用SELECT获取数据,但update查询不起作用。 以下是代码的一部分: Option Explicit Private Type FichierSource 'Objet Fichier source. Path As String S

我正在尝试创建链接到“服务器”主excel文件的动态客户端excel文件

目标是使每个文件中的所有数据保持更新。基本上,当客户机文件打开时,我从主文件中得到一个更新,然后我想根据客户机文件中的每一个更改来更新主文件

我可以很容易地使用SELECT获取数据,但update查询不起作用。 以下是代码的一部分:

Option Explicit


Private Type FichierSource
    'Objet Fichier source.
    Path As String
    SourceSheet As String
    TargetSheet As String
    Columns As String
    Filter As String
    Name As String
End Type

Sub GetFiles()
    'Take !M sheet to create files and their informations
    Dim Base As FichierSource

    '----------------------------
    'Create files object
    '----------------------------

    'Fichier Source
    Base.Path = "U:\Macros\SQL\Base.xlsx"
    Base.SourceSheet = "DATA"
    Base.TargetSheet = "Base2"
    Base.Columns = "*"
    Base.Filter = ""
    Base.Name = "Base.xlsx"


    '---------------------------
    'Launch queries
    '---------------------------

    With Base
        Call UPDATEQUERY(.Path, .SourceSheet, .TargetSheet, .Columns, .Filter)
    End With

End Sub

Sub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _
Columns As String, Filter As String)

    Dim Cn As ADODB.Connection
    Dim QUERY_SQL As String
    Dim CHAINE_HDR As String
    Dim STRCONNECTION As String
    Dim i As Long

    CHAINE_HDR = "[Excel 12.0 Macro;Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='HDR=YES;'] "


    Set Cn = New ADODB.Connection

    QUERY_SQL = _
    "UPDATE [" & TargetSheet & "$] SET [Col] = (SELECT [Col] FROM [" & SourceSheet & "$] " & _
    "IN '" & SourcePath & "' " & CHAINE_HDR & Filter & ")"



    STRCONNECTION = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source='" & ThisWorkbook.FullName & "';" & _
    "Extended Properties=""Excel 12.0 Macro;"";"

'    QUERY_SQL = _
'    "UPDATE [" & TargetSheet & "$] SET " & _
'    "[Col] = '3'"

    'MsgBox (QUERY_SQL)
    Cn.Open STRCONNECTION

    Cn.Execute (QUERY_SQL)


    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing

End Sub
当我执行带注释的Sql查询以便将列“Col”更新为“3”时 '但是,当我试图使用“从主文件中选择”进行更新时,会出现以下错误

操作必须使用可更新的查询

更新:我认为真正的问题在于:

我读过关于这个主题的问题,但任何一个都对我有用。实际上如果我在连接字符串中设置'ReadOnly=False',我会得到以下错误'Pilote ISAM introvable'('ISAM Driver not found)。

更新2:只要连接字符串不正确,就会弹出ISAM驱动程序错误。(例如:错误的excel版本号)。 ReadOnly=False(或Mode='Share Deny Write')是必需的,内部联接也是必需的

我已经通过在excel connection中添加到主文件的连接手动实现了所有这些,所以我知道这应该是可能的


谢谢

我在您的问题中添加了SQL标记,这样也许SQL专家可以更好地帮助您。但是,查看UPDATE语法,不带WHERE子句的UPDATE查询将使用相同的值更新表中每一行的指定列。查看查询的SELECT部分,看起来它将检索多个值

如果要使用另一个表中匹配列的值更新该表的列,则必须使用WHERE子句联接这些表。我认为以下是一个正确的例子:

UPDATE table1 SET col = (SELECT col FROM table2 WHERE table1.key=table2.key)


我在你的问题中添加了SQL标记,所以也许SQL专家可以更好地帮助你。但是,查看UPDATE语法,不带WHERE子句的UPDATE查询将使用相同的值更新表中每一行的指定列。查看查询的SELECT部分,看起来它将检索多个值

如果要使用另一个表中匹配列的值更新该表的列,则必须使用WHERE子句联接这些表。我认为以下是一个正确的例子:

UPDATE table1 SET col = (SELECT col FROM table2 WHERE table1.key=table2.key)


我用
更新
加入
做了一个类似的测试,只是为了好玩,而且效果非常好。这是我的密码:

Sub SQLUpdateExample()
    Dim con As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set con = New ADODB.Connection
    con.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
           "DriverId=790;" & _
           "Dbq=" & ThisWorkbook.FullName & ";" & _
           "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;"
    Set rs = New ADODB.Recordset
    Set rs = con.Execute("UPDATE [Sheet1$]  inner join [Sheet2$] on [Sheet1$].test1 = [Sheet2$].test1  SET [Sheet1$].test3 = [Sheet2$].test3 ")

    Set rs = Nothing
    Set con = Nothing
End Sub
也许你所需要的就是这个
;只读=假在连接字符串中?

请注意,尽管我使用了驱动程序的名称,但它在.XLSM文件中工作。

我使用
更新和
加入进行了类似的测试,只是为了好玩,它工作得非常好。这是我的密码:

Sub SQLUpdateExample()
    Dim con As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set con = New ADODB.Connection
    con.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
           "DriverId=790;" & _
           "Dbq=" & ThisWorkbook.FullName & ";" & _
           "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;"
    Set rs = New ADODB.Recordset
    Set rs = con.Execute("UPDATE [Sheet1$]  inner join [Sheet2$] on [Sheet1$].test1 = [Sheet2$].test1  SET [Sheet1$].test3 = [Sheet2$].test3 ")

    Set rs = Nothing
    Set con = Nothing
End Sub
也许你所需要的就是这个
;只读=假在连接字符串中?

请注意,尽管我使用了驱动程序的名称,但它在.XLSM文件中仍然有效。

如我所说,如果在连接字符串中添加“readonly=false”,则会引发错误。我要尝试加入表尝试连接字符串?问题是Sheet2在另一个工作簿中。因此程序说它找不到它。如何在更新语法中添加“FROM”?并且“ReadOnly=False”会引发相同的错误消息:“Pilote ISAM introvable”原因未知(虽然复制了连接字符串,但可能是我错放了连接字符串)。ReadOnly=False现在可以工作了,我可以从同一工作簿中的另一个表更新表。上面的问题(不同的wb)仍然相关。这是由于我使用的提供商。使用您的连接字符串查询工作。我还必须将源文件放入.xls(Excel 8.0)中格式化。否则我会出现ISAM错误。我可能会在该特定点上打开一个新问题。谢谢你的帮助!正如我所说的,如果我在连接字符串中添加“readonly=false”,则会引发错误。我将尝试加入表尝试连接字符串?问题是Sheet2在另一个工作簿中。因此程序说它找不到它。如何在更新语法中添加“FROM”和“ReadOnly=False”会引发相同的错误消息:“Pilote ISAM introvable”原因未知(虽然复制了连接字符串,但可能是我错放了连接字符串)。ReadOnly=False现在起作用,我可以从同一工作簿中的另一个表更新一个表。以上问题(不同的wb)还做了一些相关的研究。这是由于我使用的提供商。使用您的连接字符串,查询工作。我还必须将源文件放入.xls(Excel8.0)格式。否则我会得到ISAM错误。我可以就这一点提出一个新问题。谢谢你的帮助!键必须是列名吗?我尝试了,但得到了相同的错误消息。
WHERE
子句可以接受带有AND和OR的表达式,但本质上,是的,它必须是列名,否则不能加入表。key必须是列名吗?我尝试了,但得到了相同的错误消息。
WHERE
子句可以接受一个带有AND的表达式,但本质上,是的,它必须是列名,否则不能加入表。