SQL查询不会仅返回一个字段的完整结果

时间:2012-04-19 12:42:19

标签: sql excel vba

我在使用VBA执行SQL查询并将结果复制到Excel工作表时遇到问题。

当sub excecutes时,它只复制256的倍数的行(因此行256,512,768等是唯一填充到Excel中的行)。从数据库复制任何其他字段我没有问题。此外,当我在MySQL中运行相同的查询时,它工作正常。对于SQL和VBA都相当新,我看不出为什么这个特定字段应该引起麻烦的任何原因。我唯一能想到的是它的内容是一个总是以下划线开头的字符串(我只提到它,因为它是它和其他一些字段之间的唯一区别)。

有没有人想知道为什么会这样?

干杯,

利安

编辑: 这是有问题代码的片段。说实话,我不确定看到代码是否有所作为,因为它适用于其他情况,但再次,这就是为什么我是新手:)

        Dim con As ADODB.Connection
        Dim rst As ADODB.Recordset

        Set con = New ADODB.Connection
        Set rst = New ADODB.Recordset

        con.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=ipaddress;UID=userID;PWD=password;DATABASE=jiradb;OPTION=16427;"
        con.Open

        sql = "SELECT TEMPO_DATA FROM gssd_worklog WHERE WORK_DATE BETWEEN '2012-01-01' AND '2012-03-31'"

        'Open Recordset'
        rst.Open sql, con

        'Copy Data to Excel'
        Set ws = ActiveSheet

        ws.Range("A2").CopyFromRecordset rst

5 个答案:

答案 0 :(得分:7)

我昨天遇到了一个非常类似的问题,在研究过程中发现了这个问题,所以想要添加我的“解决方案”,以防其它人帮助。

为了优化问题描述,我发现它应用于我的数据集中的一个特定字段,有趣的是,如果我重新排序查询,则应用于每个后续字段。添加尾随或删除早期字段对我的问题列没有任何影响。

检查类型显示它与某些其他字段的工作类型相同,因此也没有任何线索。

但是,由于它是一个特定的字段(在本例中是一个文本字段),我决定尝试将我的SQL查询更改为CAST问题字段,更改:

SELECT Col1, Col2, Col3 FROM TableName

...到...

SELECT Col1, Col2, CAST(Col3 AS VARCHAR(8)) AS Col3 FROM TableName

...突然显示所有数据(包括任何尾随列)。

答案 1 :(得分:3)

当您尝试复制工作表上的记录时,我认为您的问题出在最后一行。尝试这样的事情(代码从http://msdn.microsoft.com/en-us/library/aa223845(v=office.11).aspx修改):

For iCols = 0 to rs.Fields.Count - 1
    ws.Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
Next
ws.Range("A2").CopyFromRecordset rst

答案 2 :(得分:2)

感谢Lamak的帮助,我认为我找到了解决方案:

rst.Open sql, con

Dim iRows As Integer
For iCols = 0 To rst.Fields.Count - 1
    ws.Cells(1, iCols + 1).Select
    With Selection
        .Value = rst.Fields(iCols).Name
        .Font.Bold = True
        .EntireColumn.AutoFit
    End With
Next iCols

iRows = 2

While Not rst.EOF
    For iCols = 0 To rst.Fields.Count - 1
        ws.Cells(iRows, iCols + 1).Value = rst.Fields(iCols).Value
    Next iCols
    rst.MoveNext
    iRows = iRows + 1
Wend

问题似乎是尝试立即从记录集中复制所有字段,按字段逐行复制记录字段并逐行解决问题。

答案 3 :(得分:1)

我使用记录集时遇到了类似的问题。它会在SQL查询中返回一组客户结果,但不会将结果粘贴到某些客户的工作表中。

按照提示投射我的数据后,我在查询中深入挖掘并注意到结果集中隐藏了空值。从记录集中null的外观开始,我的工作表上不会粘贴超出该null值的结果(由该特定列排序)。

或伪代码:

SELECT DISTINCT a,b,e
FROM DATASET

其中列c将包含空值。

所以我的解决方案:在Excel中使用它之前,在SQL中删除结果集中的重复项和空值。

答案 4 :(得分:0)

我敢打赌,您的问题是(内存中的)记录集没有完全用数据源中的数据填充。这是ADO记录集的已知行为。

最简单的解决方法是在调用“ .CopyFromRceordset rst”方法之前,先执行“ rst.movelast”,并且此方法将确保使用数据源中的数据完全加载记录集。

您的RBAR(行合并行)替代过程通过使用.movenext方法顺序移动记录集中的记录来实现相同的结果(这导致ADO代码在记录指针移动时不断加载新数据)通过内存中加载的数据页)。