sql >> Databasteknik >  >> RDS >> Oracle

SQL Query-utdata i VBA är annorlunda än i SQL Oracle

Problemet är CopyFromRecordset - den trunkeras till 255 tecken, och det är inte den enda Excel.Range-metoden som gör det.

Frågan är:har jag en metod som inte har det? Och har du en OLEDB-drivrutin som gör det till ditt Recordset innan du ens kommer till fasen för att skriva till serien?

Du bör gå igenom din postuppsättning, i VBA, och kontrollera det stötande fältet i VBA för ett värde som överstiger 255 tecken. Om fälten redan är trunkerade, försök att använda de inbyggda Oracle Client-drivrutinerna i din anslutningssträng, istället för Microsoft Oracle OLEDB-leverantören - Connections.com kommer att ha informationen.

När du vet att postuppsättningen faktiskt innehåller dina data, utan trunkering, försök CopyFromRecordset igen. Jag förväntar mig faktiskt inte att det ska skriva ett fält som överstiger 255 tecken, men det var ett tag sedan jag stötte på felet, det kan ha åtgärdats, och det är alltid trevligt att ge en pessimist en trevlig överraskning.

Nästa:

En VBA-ersättning för CopyFromRecordset

Det finns tre uppgifter här:

  1. Fylla en VBA-arrayvariant med data med Recordset.GetRows();
  2. Transponera arrayen, eftersom GetRows är på fel håll för Excel;
  3. Storlek på ett målintervall och skriv arrayen somRange.Value = Array , en repetitiv uppgift som bör automatiseras i en ArrayToRange()-rutin.

...Och kanske en del underarbete med att skriva fältnamnen, men jag ignorerar det i ett kort svar.

Slutresultatet är att du kör den här koden:


    ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)

Att transponera arrayen är trivialt, men här är det i alla fall:


Public Function ArrayTranspose(InputArray As Variant) As Variant
Application.Volatile False
Dim arrOutput As Variant
Dim i As Long Dim j As Long Dim iMin As Long Dim iMax As Long Dim jMin As Long Dim jMax As Long
iMin = LBound(InputArray, 1) iMax = UBound(InputArray, 1) jMin = LBound(InputArray, 2) jMax = UBound(InputArray, 2)
ReDim arrOutput(jMin To jMax, iMin To iMax)
For i = iMin To iMax For j = jMin To jMax arrOutput(j, i) = InputArray(i, j) Next j Next i
ArrayTranspose = arrOutput
End Function
...Och ArrayToRange är trivialt om du inte lägger till kontroller för matrisdimensioner och bevarar formler i målcellerna:det väsentliga är att du kan skriva dina data i en enda "träff" om dimensionerna för området exakt matchar mått på arrayen:

Public Sub ArrayToRange(rngTarget As Excel.Range, InputArray As Variant)
' Write an array to an Excel range in a single 'hit' to the sheet
' InputArray should be a 2-Dimensional structure of the form Variant(Rows, Columns)
' The target range is resized automatically to the dimensions of the array, with ' the top left cell used as the start point.
' This subroutine saves repetitive coding for a common VBA and Excel task.
' Author: Nigel Heffernan http://Excellerando.blogspot.com

On Error Resume Next
Dim rngOutput As Excel.Range
Dim iRowCount As Long Dim iColCount As Long
iRowCount = UBound(InputArray, 1) - LBound(InputArray, 1) iColCount = UBound(InputArray, 2) - LBound(InputArray, 2)
With rngTarget.Worksheet
Set rngOutput = .Range(rngTarget.Cells(1, 1), _ rngTarget.Cells(iRowCount + 1, iColCount + 1))
Application.EnableEvents = False

rngOutput.Value2 = InputArray
Application.EnableEvents = True
Set rngTarget = rngOutput ' resizes the range This is useful, most of the time
End With ' rngTarget.Worksheet
End Sub

Varning:i äldre versioner av Excel (Office 2000, om jag minns) är arrayen "write" fortfarande trunkerad till 255 tecken. Detta är inte längre ett problem; och om du fortfarande använder XL2000 är celler som innehåller en sträng som överstiger 255 tecken ett tillräckligt problem för att du kan vara glad över trunkeringen.



  1. Lägg till en ny kolumn till en befintlig tabell i MySql med PHP med PDO

  2. Konstigt beteende hos SUM och CONCAT i MySql

  3. MySQL, bättre att infoga NULL eller tom sträng?

  4. Delta-import samlar in data men uppdatera inte solr-indexet