[dba-SQLServer] Quotes in delimited data

Jim Lawrence (AccessD) accessd at shaw.ca
Mon Sep 13 23:56:38 CDT 2004


Hi Stuart:

This is part of the reply that I got from 'Notetab' a while when I was doing
some research. Did not get as far as 'CrimsonEditor'.

<comment from support>
Theoretically, NoteTab can open 2GB files; it depends on system
resources. To work correctly it needs twice as much RAM as the
file size, so 4GB RAM in the largest case , but it can use drive
space to work in. I don't believe there is a line limit, but
there is a 32Kb column limit in NoteTab Pro and I think it is 2GB
in Std/Light. Pro works much better with large file files than
Std/Light.
</comment from support>

In John's case it may not be enough. There is a couple of APIs that are
suppose to extend file access to any size and I have a app that using it and
that seems to be the case. Maybe this class can be parled into a search and
replace routine without musch effort... (The code is not mine but I have
added and changed things.)

<code>
Option Explicit

Public Enum W32F_Errors
  W32F_UNKNOWN_ERROR = 45600
  W32F_FILE_ALREADY_OPEN
  W32F_PROBLEM_OPENING_FILE
  W32F_FILE_ALREADY_CLOSED
  W32F_Problem_seeking
End Enum

Private Const W32F_SOURCE = "Win32File Object"

Private Const GENERIC_WRITE = &H40000000
Private Const GENERIC_READ = &H80000000
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const CREATE_ALWAYS = 2
Private Const OPEN_ALWAYS = 4
Private Const INVALID_HANDLE_VALUE = -1

Private Const FILE_BEGIN = 0, FILE_CURRENT = 1, FILE_END = 2

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

Private Declare Function FormatMessage Lib "kernel32" _
        Alias "FormatMessageA" (ByVal dwFlags As Long, _
                                lpSource As Long, _
                                ByVal dwMessageId As Long, _
                                ByVal dwLanguageId As Long, _
                                ByVal lpBuffer As String, _
                                ByVal nSize As Long, _
                                Arguments As Any) As Long

Private Declare Function ReadFile Lib "kernel32" _
                        (ByVal hFile As Long, _
                         lpBuffer As Any, _
                         ByVal nNumberOfBytesToRead As Long, _
                         lpNumberOfBytesRead As Long, _
                         ByVal lpOverlapped As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" _
                        (ByVal hObject As Long) As Long

Private Declare Function WriteFile Lib "kernel32" _
                        (ByVal hFile As Long, _
                         lpBuffer As Any, _
                         ByVal nNumberOfBytesToWrite As Long, _
                         lpNumberOfBytesWritten As Long, _
                         ByVal lpOverlapped As Long) As Long

Private Declare Function CreateFile Lib "kernel32" _
        Alias "CreateFileA" (ByVal lpFileName As String, _
                             ByVal dwDesiredAccess As Long, _
                             ByVal dwShareMode As Long, _
                             ByVal lpSecurityAttributes As Long, _
                             ByVal dwCreationDisposition As Long, _
                             ByVal dwFlagsAndAttributes As Long, _
                             ByVal hTemplateFile As Long) As Long

Private Declare Function SetFilePointer Lib "kernel32" _
                        (ByVal hFile As Long, _
                         ByVal lDistanceToMove As Long, _
                         lpDistanceToMoveHigh As Long, _
                         ByVal dwMoveMethod As Long) As Long

Private Declare Function FlushFileBuffers Lib "kernel32" _
                        (ByVal hFile As Long) As Long

Private hFile As Long, sFName As String, fAutoFlush As Boolean
Private FileHandle1 As Long

Public Property Get FileHandle() As Long

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    FileHandle = hFile

End Property

Public Property Get FileName() As String

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    FileName = sFName

End Property

Public Property Get IsOpen() As Boolean

    IsOpen = hFile <> INVALID_HANDLE_VALUE

End Property

Public Property Get AutoFlush() As Boolean

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    AutoFlush = fAutoFlush

End Property

Public Property Let AutoFlush(ByVal NewVal As Boolean)

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    fAutoFlush = NewVal

End Property

Public Sub OpenFile(ByVal sFileName As String)

    If hFile <> INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_OPEN, sFName
    Else
        FileHandle1 = hFile
    End If

    hFile = CreateFile(sFileName, GENERIC_WRITE Or GENERIC_READ, 0, _
                       0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_PROBLEM_OPENING_FILE, sFileName
    End If

    sFName = sFileName

End Sub

Public Sub CloseFile()

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    End If

    CloseHandle hFile
    sFName = ""
    fAutoFlush = False
    hFile = INVALID_HANDLE_VALUE

End Sub

Public Function ReadBytes(ByVal ByteCount As Long) As Variant

    Dim BytesRead As Long, Bytes() As Byte

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    ReDim Bytes(0 To ByteCount - 1) As Byte
    ReadFile hFile, Bytes(0), ByteCount, BytesRead, 0
    ReadBytes = Bytes

End Function

Public Sub WriteBytes(DataBytes() As Byte)

    Dim fSuccess As Long, BytesToWrite As Long, BytesWritten As Long

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    BytesToWrite = UBound(DataBytes) - LBound(DataBytes) + 1
    fSuccess = WriteFile(hFile, DataBytes(LBound(DataBytes)), _
                    BytesToWrite, BytesWritten, 0)

    If fAutoFlush Then Flush

End Sub

Public Sub Flush()

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    FlushFileBuffers hFile

End Sub

Public Sub SeekAbsolute(ByVal HighPos As Long, ByVal LowPos As Long)

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    LowPos = SetFilePointer(hFile, LowPos, HighPos, FILE_BEGIN)

End Sub

Public Sub SeekRelative(ByVal Offset As Long)

    Dim TempLow As Long, TempErr As Long

    If hFile = INVALID_HANDLE_VALUE Then
        RaiseError W32F_FILE_ALREADY_CLOSED
    Else
        FileHandle1 = hFile
    End If

    TempLow = SetFilePointer(hFile, Offset, ByVal 0&, FILE_CURRENT)

    If TempLow = -1 Then
        TempErr = Err.LastDllError
        If TempErr Then
            RaiseError W32F_Problem_seeking, "Error " & TempErr & "." & _
                                       vbCrLf & CStr(TempErr)
        End If
    End If

End Sub

Private Sub Class_Initialize()

    hFile = INVALID_HANDLE_VALUE

End Sub

Private Sub Class_Terminate()

    If hFile <> INVALID_HANDLE_VALUE Then CloseHandle hFile

End Sub

Private Sub RaiseError(ByVal ErrorCode As W32F_Errors, _
                       Optional sExtra)

    Dim Win32Err As Long, Win32Text As String
    Dim lbStatus As Boolean

    Win32Err = Err.LastDllError
    lbStatus = True

    If Win32Err Then
        Win32Text = vbCrLf & "Error " & Win32Err & vbCrLf & _
                    DecodeAPIErrors(Win32Err)
    End If

    Select Case ErrorCode
        Case W32F_FILE_ALREADY_OPEN
            Err.Raise W32F_FILE_ALREADY_OPEN, W32F_SOURCE,
            lbStatus = False
        Case W32F_PROBLEM_OPENING_FILE
            Err.Raise W32F_PROBLEM_OPENING_FILE, W32F_SOURCE,
            lbStatus = False
        Case W32F_FILE_ALREADY_CLOSED
            Err.Raise W32F_FILE_ALREADY_CLOSED, W32F_SOURCE,
            lbStatus = False
        Case W32F_Problem_seeking
            Err.Raise W32F_Problem_seeking, W32F_SOURCE,
            lbStatus = False
        Case Else
            Err.Raise W32F_UNKNOWN_ERROR, W32F_SOURCE,
            lbStatus = False
  End Select

    If lbStatus = False Then CloseHandle FileHandle1

End Sub

Private Function DecodeAPIErrors(ByVal ErrorCode As Long) As String

    Dim sMessage As String, MessageLength As Long

    sMessage = Space$(256)
    MessageLength = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, _
                                ErrorCode, 0&, sMessage, 256&, 0&)

    If MessageLength > 0 Then
        DecodeAPIErrors = Left(sMessage, MessageLength)
    Else
        DecodeAPIErrors = "Unknown Error."
    End If

End Function
</code>

HTH
Jim

-----Original Message-----
From: dba-sqlserver-bounces at databaseadvisors.com
[mailto:dba-sqlserver-bounces at databaseadvisors.com]On Behalf Of Stuart
McLachlan
Sent: Monday, September 13, 2004 4:01 PM
To: dba-sqlserver at databaseadvisors.com
Subject: RE: [dba-SQLServer] Quotes in delimited data


On 13 Sep 2004 at 11:18, John W. Colby wrote:

> OK, now for a 660 field table?
>

1. Get a good text editor with macro/block copy etc capablities such as
Notetab Light, Crimson Editor etc.

http://www.notetab.com/
http://www.crimsoneditor.com/

2. Get a large pot of coffee.......





--
Stuart


_______________________________________________
dba-SQLServer mailing list
dba-SQLServer at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
http://www.databaseadvisors.com




More information about the dba-SQLServer mailing list