Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Output SQL Query di VBA berbeda dari di SQL Oracle

Masalahnya adalah CopyFromRecordset - itu terpotong di 255 karakter, dan itu bukan satu-satunya metode Excel.Range yang melakukan itu.

Pertanyaannya adalah:apakah saya memiliki metode yang tidak? Dan apakah Anda memiliki driver OLEDB yang melakukannya ke Recordset Anda bahkan sebelum Anda mencapai tahap penulisan ke jangkauan?

Anda harus mengulang recordset Anda, di VBA, dan memeriksa bidang yang menyinggung di VBA untuk nilai yang panjangnya melebihi 255 karakter. Jika bidang sudah terpotong, coba gunakan driver Oracle Client asli di string koneksi Anda, alih-alih penyedia Microsoft Oracle OLEDB - Connections.com akan memiliki informasinya.

Setelah Anda mengetahui bahwa recordset benar-benar berisi data Anda, tanpa pemotongan, coba CopyFromRecordset lagi. Saya sebenarnya tidak mengharapkannya untuk menulis bidang yang panjangnya melebihi 255 karakter, tetapi sudah lama sejak saya menemukan kesalahan, itu mungkin telah diperbaiki, dan selalu menyenangkan untuk memberikan kejutan yang menyenangkan kepada orang yang pesimis.

Selanjutnya:

Pengganti VBA untuk CopyFromRecordset

Ada tiga tugas di sini:

  1. Isi varian larik VBA dengan data menggunakanRecordset.GetRows();
  2. Transpose array, karena GetRows adalah cara yang salah 'untuk Excel;
  3. Mengukur rentang target dan menulis array sebagaiRange.Value = Array , tugas berulang yang harus diotomatisasi dalam rutin ArrayToRange().

...Dan mungkin beberapa pekerjaan tambahan dengan menulis nama bidang, tapi saya mengabaikannya dalam jawaban singkat.

Hasil akhirnya adalah Anda menjalankan kode ini:


    ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)

Mentranspos array itu sepele, tapi ini dia:


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
...Dan ArrayToRange adalah sepele jika Anda tidak menambahkan pemeriksaan untuk dimensi array dan mempertahankan rumus di sel target:poin pentingnya adalah Anda dapat menulis data Anda dalam satu 'hit' jika dimensi rentang sama persis dengan dimensi array:

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

Catatan hati-hati:di versi Excel yang lebih lama (Office 2000, jika saya ingat) array 'tulis' masih terpotong menjadi 255 karakter. Ini bukan lagi masalah; dan jika Anda masih menggunakan XL2000, sel yang berisi string melebihi 255 karakter sudah cukup menjadi masalah sehingga Anda mungkin senang dengan pemotongannya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Karena SQL Server tidak memiliki paket, apa yang dilakukan programmer untuk menyiasatinya?

  2. Cara Menghapus Padding yang Tepat pada Nama Hari di Oracle

  3. Bagaimana cara menghapus Penyedia Data Oracle yang sudah usang?

  4. SQL Oracle Menghitung Cluster

  5. Menghubungkan ke Oracle DB berkemampuan SSL melalui Java (JDBC)