【问题标题】:SQL query doesn't return full results for only one fieldSQL 查询不会仅返回一个字段的完整结果
【发布时间】:2012-04-30 23:34:41
【问题描述】:

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

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

有人知道为什么会发生这种情况吗?

干杯,

利亚姆

编辑: 这是有问题的代码的sn-p。老实说,我不确定看到代码是否会有所作为,因为它在其他情况下工作得很好,但话又说回来,这就是我是新手的原因:)

        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

【问题讨论】:

  • 您应该发布您的子代码以便我们尝试回答这个问题
  • 你在哪里定义rst
  • 对不起,声明现在在原帖中

标签: sql excel vba adodb


【解决方案1】:

我昨天遇到了一个非常相似的问题,并在研究时发现了这个线程,所以想添加我的“解决方案”以防它对其他人有所帮助。

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

检查类型发现它与其他一些确实有效的字段的类型相同,因此也没有任何线索。

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

SELECT Col1, Col2, Col3 FROM TableName

...到...

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

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

【讨论】:

  • 这似乎是一个 ADODB 问题,我在使用 ADODB 连接到 SQL 服务器的 ASP Classic 应用程序中遇到了完全相同的问题。
【解决方案2】:

当您尝试复制工作表上的记录时,我认为您的问题出在最后一行。试试这样的(代码从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

【讨论】:

  • 恐怕这行不通。它确实在列的头部打印了字段名称,但我仍然有丢失数据的相同问题。不过还是谢谢!
  • @LiamBarrett - 您在该子上尝试的每个查询都有这个问题?
  • 不,只有在这个特定的查询上,我已经尝试过其他查询,它们都可以正常工作。这很奇怪。我唯一能想到的是,一定是数据库字段的实际内容以某种方式导致了问题。
  • @LiamBarrett - 这一定是问题所在,您能否将直接查询数据库的结果与您的子粘贴的数据进行比较?
  • 根据您给我的代码,我实际上已经弄清楚了。谢谢一百万,没有你的帮助是做不到的!我还是一个新用户,所以我无法在 6 小时前回答我自己的问题,但如果你有兴趣看到它,我可以稍后将我的解决方案放在这里
【解决方案3】:

我想我已经找到了解决方案,感谢 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

问题似乎一直试图一次将所有字段从记录集中复制出来,逐字段逐行复制记录似乎可以解决问题。

【讨论】:

    【解决方案4】:

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

    按照转换数据的提示,我深入研究了查询,发现结果集中隐藏了空值。从记录集中出现空值的情况来看,超出该空值(按该特定列排序)的任何结果都不会粘贴到我的工作表上。

    或者在伪代码中:

    SELECT DISTINCT a,b,e
    FROM DATASET
    

    其中 c 列将包含空值。

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多