Excel ADO访问查找字段,返回的字段错误

Excel ADO访问查找字段,返回的字段错误,excel,vba,ms-access,ms-access-2010,dao,Excel,Vba,Ms Access,Ms Access 2010,Dao,我在Excel2010VBA中,使用ADO2.8查询Access 2010数据库。我不拥有数据库,也没有任何权限对其进行任何更改。我已经在ExcelVBA上工作了很多年,但我的访问知识还很粗略 使用与数据库中从Access查询复制并粘贴到Excel VBA的查询相同的SQL,我在某些字段中得到的结果与数据库中的查询不同 对于受影响的字段,我看到在Access中,这些字段被定义为查找。以下是从受影响字段的行源属性之一查找的示例: SELECT [Signers].[SignerID], [Sign

我在Excel2010VBA中,使用ADO2.8查询Access 2010数据库。我不拥有数据库,也没有任何权限对其进行任何更改。我已经在ExcelVBA上工作了很多年,但我的访问知识还很粗略

使用与数据库中从Access查询复制并粘贴到Excel VBA的查询相同的SQL,我在某些字段中得到的结果与数据库中的查询不同

对于受影响的字段,我看到在Access中,这些字段被定义为查找。以下是从受影响字段的行源属性之一查找的示例:

SELECT [Signers].[SignerID], [Signers].[SignerName] FROM Signers ORDER BY [SignerID], [SignerName];
在Access数据库中,SQL语句引用该字段,查询返回SignerName

但在我的ADO代码中,相同的SQL语句引用该字段,查询返回的是SignerID,而不是SignerName

ADO代码是否可以从同一SQL语句中获取SignerName而不是SignerID?或者我需要修改SQL语句吗

谢谢

格雷格

更新:

在访问端,我想我现在明白了为什么只有SignerName出现了。在字段的“查找”选项卡上,“列宽”属性为:

SELECT MasterAccount.*, Bank.BankRating FROM Bank INNER JOIN MasterAccount ON Bank.BankID = MasterAccount.Bank;
0;1.2605

所以我猜SignerID在Access查询结果中,但列宽为0

不幸的是,这对我没有帮助。关于在ADO查询结果中获取SignerName而不是SignerID,有什么建议吗

更新2:

下面是一个示例SQL语句,它根据Access或ADO中的字段返回不同的字段:

SELECT MasterAccount.[SignerKey1] 
FROM MasterAccount ;
根据Preet的请求,以下是Excel VBA中的ADO代码:

strDatabasePath = rgDatabasePathCell.Value 'rgDatabasePathCell is a worksheet cell object.
strPWD = DATABASE_PASSWORD

Set cnn = New ADODB.Connection
cnn.Provider = "Microsoft.ACE.OLEDB.12.0"
cnn.ConnectionString = "Data Source='" & strDatabasePath & "';Jet OLEDB:Database Password='" & strPWD & "';"
cnn.Open

Set cmd = New ADODB.Command
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdText
cmd.CommandText = strSQL
Set rst = New ADODB.Recordset

rst.Open cmd.Execute

shMA.Cells(2, 1).CopyFromRecordset rst 'shMA is a worksheet object.
更新3:

我突然想到,从目前为止我所说的话来看,似乎我可以改变这一点:

SELECT MasterAccount.[SignerKey1] 
FROM MasterAccount ;
为此:

SELECT [Signers].[SignerName] 
FROM MasterAccount ;
但是有13个受影响的查找字段,它们都具有与上面所示完全相同的行源属性文本,并且都为每一行返回不同的SignerName项。我不知道为什么他们每行都返回不同的项目;我没有发现它们的定义方式有任何不同。我的任务是在Excel中获得与Access查询相同的结果

更新4:

VBlades-谢谢,我找到了一个表单,其中13个SignerKey-n字段中的每个字段都有一个带有下拉列表的选项卡。如果右键单击该表单并选择表单属性,则RecordSource属性为:

SELECT MasterAccount.*, Bank.BankRating FROM Bank INNER JOIN MasterAccount ON Bank.BankID = MasterAccount.Bank;
但是,我不明白这将如何为13个SignerKey-n字段中的每个字段选择不同的SignerName项,或者如何处理这些信息以在ADO中获得与Access查询相同的结果。有什么建议吗

更新5:

我可能快找到解决办法了。如果我这样做,我会得到SignerKey1的SignerName字段:

SELECT Signers.SignerName
FROM Signers RIGHT JOIN MasterAccount ON Signers.SignerID = MasterAccount.SignerKey1.Value;
如果我这样做,我会为每行的每个字段获得不同的SignerName项:

SELECT Signers.SignerName, Signers_1.SignerName, Signers_2.SignerName
FROM Signers AS Signers_2 INNER JOIN (Signers AS Signers_1 INNER JOIN (Signers RIGHT JOIN MasterAccount ON Signers.SignerID = MasterAccount.SignerKey1.Value) ON Signers_1.SignerID = MasterAccount.SignerKey2.Value) ON Signers_2.SignerID = MasterAccount.SignerKey3;
这在Access查询和ADO中都有效。下一步,我将尝试将这些连接添加到主SQL语句中

更新6:

当我尝试将这13个连接中的一个添加到主SQL语句时,它在Access查询中运行良好,但在ADO中我得到了错误:

在获得新的行句柄之前,必须释放所有行句柄

所以我被卡住了。有什么建议吗


我已经向数据库所有者提出了这个问题,但他们不知道为什么受影响字段的行源属性包含SignerID,所以我不确定这是否有帮助。

您可以使用以下最简单的方法

从查询中排除[Signers].[SignerID]

SELECT [Signers].[SignerName] FROM Signers ORDER BY [SignerID], [SignerName];
或者,创建同时包含[SignerID]、[SignerName]的复合字段,并使用您熟悉的VBA提取任何零件:

 SELECT ([SignerID] & "_" & [SignerName]) As Composite FROM Signers ORDER BY [SignerID], [SignerName]

关于,

好的,我通过从Signers表中获取SignerID和SignerName字段的单独记录集来解决这个问题

然后,我循环遍历每个受影响字段的所有行,在第二个表中查找SignerID,并在SignerName中交换原始表中的SignerID

我试图在ADO中实现这一点,但出现了一个错误:更新或删除查询不能包含多值字段。因此,我在将记录集复制到Excel工作表后进行了交换


我本想知道如何在ADO中处理这一切,但这是可行的。现在一切都好了。

有没有可能把这两组代码都放在这里?嗨,普里特-你是说SQL语句?我在上面添加了一个示例。嗨,普里特。我已经从ExcelVBA添加了ADO代码。没有DAO代码。在访问端没有代码;这只是Access中的一个查询。谢谢。我想知道。。。如果您尝试以下操作:在vba中编写一些DAO代码,并验证您在每一行/列上获得的数据是否与Ado相同?然后,也许可以从另一个Vba应用程序中重复测试,比如说另一个Access实例?我认为这不是DAO/ADO问题,而是Access如何在内部发出查询的问题。我还看到您添加了另一个查询。你能用一个新的Access数据库重复这个错误并说出示例数据吗?嗨,普里特-谢谢
,但我不明白这和DAO有什么关系。没有DAO代码。Excel VBA中有ADO代码,有Access查询,除SQL语句外没有其他代码;只是Access中的一个查询。与其花时间将ADO代码重写为遗留DAO代码,我将尝试重写SQL语句以避免查找列。Alex-谢谢,但我无法控制Access数据库,因此我无法排除Access数据库中受影响查找字段的行源属性中的[Signers].[SignerID]。我可以从Excel VBA控制ADO代码中使用的SQL语句,但是[Signers].[SignerID]不在那里出现。