sql >> データベース >  >> RDS >> Oracle

VBAでのSQLクエリ出力はSQLOracleとは異なります

    問題はCopyFromRecordsetです -255文字で切り捨てられており、それを実行するのはExcel.Rangeメソッドだけではありません。

    問題は、そうでない方法はありますか?また、範囲への書き込みの段階に入る前に、Recordsetに対してそれを実行するOLEDBドライバーがありますか?

    VBAでレコードセットをループし、VBAで問題のあるフィールドを確認する必要があります 長さが255文字を超える値の場合。フィールドがすでに切り捨てられている場合は、MicrosoftOracleOLEDBプロバイダーの代わりにネイティブのOracleClientドライバーを接続文字列で使用してみてください。Connections.comに情報があります。

    レコードセットに切り捨てなしで実際にデータが含まれていることがわかったら、CopyFromRecordsetを再試行してください。実際には、255文字を超える長さのフィールドを書き込むことは期待していませんが、エラーが発生してからしばらく経ちましたが、修正された可能性があり、悲観論者に嬉しい驚きを与えるのはいつでもいいことです。

    次は:

    CopyFromRecordsetのVBA代替

    ここには3つのタスクがあります:

    1. Recordset.GetRows()を使用して、VBA配列バリアントにデータを入力します;
    2. GetRowsはExcelのラウンドの間違った方法であるため、配列を転置します。
    3. ターゲット範囲のサイズを大きくし、配列をRange.Value = Arrayとして記述します。 、ArrayToRange()ルーチンで自動化する必要がある反復タスク。

    ...そして、フィールド名を書くための補助的な作業かもしれませんが、短い答えではそれを無視しています。

    最終結果は、次のコードを実行することです。

    
        ArrayToRange rngTarget, ArrayTranspose(rst.GetRows)

    配列の転置は簡単ですが、とにかくここにあります:

    
    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
    ...そして、配列の次元のチェックを追加せず、ターゲットセルに数式を保持しない場合、ArrayToRangeは簡単です。重要な点は、範囲の次元が完全に一致する場合、単一の「ヒット」でデータを書き込むことができるということです。配列の寸法:

    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

    注意事項:古いバージョンのExcel(Office 2000、思い出すと)では、配列'write'はまだ255文字に切り捨てられています。これはもはや問題ではありません。また、XL2000をまだ使用している場合は、255文字を超える文字列を含むセルで十分な問題が発生するため、切り捨てが喜ばれる可能性があります。



    1. Hibernateマッピング-2つのテーブルを関連付けテーブルで結合する-しかしひねりを加えて

    2. Javaを使用してWE8ISO8859P1でエンコードされたOracleデータベースからアラビア語のテキストを読み取る

    3. mysqlまたはpostgresで、IN(1,2、n)ステートメントのサイズに制限はありますか?

    4. Mysql_install_dbがファイルを見つけることができません