2013-10-24 2 views
0

Получил глупую проблему, это швы простые, но я просто не понимаю.
Есть очень простой код VBA для листе Excel:Ошибка при анализе набора записей в VBA

Private Sub GET_MDW_DATA() 
    On Error GoTo ErrorHandler 
    Dim cn As ADODB.Connection 
    Set cn = New ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Set rs = New ADODB.Recordset 
    Dim cmdSQLData As ADODB.Command 
    Set cmdSQLData = New ADODB.Command 

    Dim cnstr As String 

    Dim usr 
    Set usr = Nothing 
    usr = Sheet1.Cells(1, 4).Value 

    Dim pwd 
    Set pwd = Nothing 
    pwd = Sheet1.Cells(2, 4).Value 

    Dim odbcname 
    Set odbcname = Nothing 
    odbcname = Sheet1.Cells(1, 8).Value 

    Dim Category As String 
    Category = Sheet1.Cells(1, 6).Value 

    Dim Store As String 
    Store = Sheet1.Cells(2, 6).Value 

    cnstr = "Data Source=" & odbcname & "; Database=belccp_msi_d; Persist Security Info=True; User ID=" & usr & "; Password=" & pwd & "; Session Mode=ANSI;" 
    cn.Open cnstr 

    Set cmdSQLData.ActiveConnection = cn 
    Sheet1.Range("A6 : H1000000").Clear 

    Query = "SELECT SOMETHING FROM SOME DATABASE" 


    cmdSQLData.CommandText = Query 
    cmdSQLData.CommandType = adCmdText 
    cmdSQLData.CommandTimeout = 0 
    Set rs = cmdSQLData.Execute() 
    rs.MoveFirst 

    x = 6 
    Do While (rs.BOF = False or rs.EOF = False) 
     p = rs.GetRows(-1) 
     Sheet1.Range("A" & x).Value = p(0, 8) 
     Sheet1.Range("B" & x).Value = p(1, 8) 
     Sheet1.Range("C" & x).Value = p(2, 8) 
     Sheet1.Range("D" & x).Value = p(3, 8) 
     Sheet1.Range("E" & x).Value = p(4, 8) 
     Sheet1.Range("F" & x).Value = p(5, 8) 
     Sheet1.Range("G" & x).Value = p(6, 8) 
     Sheet1.Range("H" & x).Value = p(7, 8) 

     x = x + 1 

    Loop 

    cn.Close 
    Set cn = Nothing 
    Set rs = Nothing 
    Set cmdSQLData = Nothing 

Если я «печать» мой выбор, скопируйте его и выполнить его в запросе, она возвращает 30 строк из моей базы данных, но когда я исполню ее из моего excel «code» он возвращает только 1 строку, только одну строку из 30 строк.

Я проверил его и перед x=x+1rs.EOF is True. Это означает, что мой набор записей имеет только одно значение (если это так, потому что мой выбор возвращает 30 строк) или что я не разбираю его правильно. Любые намеки?

Большое спасибо заранее,

+0

Я не совсем уверен, , но по какой-либо причине вы используете 'rs.GetRows (-1)'? Потому что согласно [это] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms675120 (v = vs.85) .aspx) и [это] (http://msdn.microsoft .com/en-us/library/windows/desktop/ms677558 (v = vs.85) .aspx), который будет сразу извлекать _ALL_ записи в ваш 'p' (таким образом, двумерный массив). Обычно 'rs (0)', 'rs (1)' и т. Д., С 'rs.MoveNext' достаточно. – Passerby

ответ

1

Странная вещь, которую я заметил в своем коде, что вы используете функцию GetRows в цикле.

GetRows загружает набор записей в массив.
Либо вы пройдете через массив, возвращаемый GetRows, либо пропустите цикл записей. Нет причин, по которым вы будете делать оба одновременно.

В случае, если цикл через записи, вы бы что-то вроде:

x = 6 'As you prefer 
rs.MoveFirst 
Do Until rs.EOF 

    Sheet1.Range("A" & x).Value = rs![field_name_1] 
    Sheet1.Range("B" & x).Value = rs![field_name_2] 
    Sheet1.Range("C" & x).Value = rs![field_name_3] 
    Sheet1.Range("D" & x).Value = rs![field_name_4] 
    Sheet1.Range("E" & x).Value = rs![field_name_5] 
    Sheet1.Range("F" & x).Value = rs![field_name_6] 
    Sheet1.Range("G" & x).Value = rs![field_name_7] 
    Sheet1.Range("H" & x).Value = rs![field_name_8] 

    rs.MoveNext 

Loop 

Чтобы проверить, сколько записей есть в вашем, использовании набора записей:

rs.MoveLast 
iRecordCount = rs.RecordCount 
+0

при использовании rs! [Field_name_1] это дает мне некоторую ошибку. Должен ли я использовать вместо rs! [Field_name_1] имя фактического поля, как оно есть из моего выбора? – BogdanM

+1

Да, что вы считаете правильным. – Trace

+1

Спасибо вам большое! – BogdanM

Смежные вопросы