This is a VB6 procedure (in an ActiveX dll) that handles this.
Obviously there are a lot of secondary routines that you don't have,
but I think you will
get the general idea of what is going on here.

Public Sub vArray2SQLiteTable(strDB As String, _
                              vArray As Variant, _
                              strTable As String, _
                              Optional strFields As String, _
                              Optional strIndexFields As String, _
                              Optional lIntegerPrimaryKeyColumn As Long = -1, _
                              Optional bISO8601Dates As Boolean = True, _
                              Optional strDataTypes As String, _
                              Optional bTempTable As Boolean)

        Dim i As Long
        Dim r As Long
        Dim c As Long
        Dim n As Long
        Dim strSQL As String
        Dim strCreateTable As String
        Dim lArrayDims As Long
        Dim LB1 As Long
        Dim UB1 As Long
        Dim LB2 As Long
        Dim UB2 As Long
        Dim btLBAdd As Byte
        Dim lFields As Long
        Dim bHasText As Boolean
        Dim bHasNumber As Boolean
        Dim bHasNonIntegerNumber As Boolean
        Dim bHasDate As Boolean
        Dim bSkipFirstRow As Boolean
        Dim btSkipFirstRow As Byte
        Dim arrDataTypes
        Dim arrDataTypes2() As Byte
        Dim arrDates() As Boolean
        Dim cmddhSQLite As cCommand
        Dim vTemp

10      On Error GoTo ERROROUT

20      LB1 = LBound(vArray)
30      UB1 = UBound(vArray)


        'presume if fields are supplied then array doesn't have fields
in first row
        
'--------------------------------------------------------------------------
80      bSkipFirstRow = Len(strFields) = 0

90      If bSkipFirstRow Then
          'as we skip the first row with fields
          '------------------------------------
100       btSkipFirstRow = 1
110     End If

120     lArrayDims = GetArrayDims(vArray)

        'get the table fields
        '--------------------
160     If lArrayDims = 1 Then
170       If LCase(strFields) = "auto fields" Then
180         strFields = "Field1"
190       End If
200       If Len(strFields) = 0 Then
210         strFields = MakeValidSQLiteFieldName(vArray(LB1))
220       End If
230       lFields = 1
240     Else
250       LB2 = LBound(vArray, 2)
260       UB2 = UBound(vArray, 2)

270       If LCase(strFields) = "auto fields" Then
280         For i = LB2 To UB2
290           If i = LB2 Then
300             strFields = "Field1"
310           Else
320             strFields = strFields & ",Field" & i + (1 - LB2)
330           End If
340         Next i
350       End If

390       btLBAdd = 1 - LB2

430       lFields = (UB2 - LB2) + 1

470       If Len(strFields) = 0 Then
480         For c = LB2 To UB2
490           If c = LB2 Then
500             strFields = MakeValidSQLiteFieldName(vArray(LB1, LB2))
510           Else
520             strFields = strFields & "," &
MakeValidSQLiteFieldName(vArray(LB1, c))
530           End If
570         Next c
580       End If
590     End If

        'to avoid duplicate fields
        '-------------------------
630     strFields = AddNumbersToDuplicateFields(strFields)

        'get the data types
        '------------------
670     If Len(strDataTypes) = 0 Then
680       strDataTypes = GetDataTypesFromVArray(vArray, bSkipFirstRow)
690     End If

        'make the array of datatypes shown as Bytes
        '------------------------------------------
730     arrDataTypes = Split(strDataTypes, ",")

        'to make ISO8601 dates if the array column is dates or blanks only
        '-----------------------------------------------------------------
740     If bISO8601Dates Then
750       If lArrayDims = 1 Then
760         If arrDataTypes(0) = "DATE" Then
770           For r = LB1 To UB1
780             If Not IsEmpty(vArray(r)) Then
790               vArray(r) = Format(vArray(r), "yyyy-mm-dd")
800             End If
810           Next r
820         End If
830       Else
840         For c = 0 To UBound(arrDataTypes)
850           If arrDataTypes(c) = "DATE" Then
860             For r = LB1 To UB1
870               If Not IsEmpty(vArray(r, c + LB2)) Then
880                 vArray(r, c + LB2) = Format(vArray(r, c + LB2),
"yyyy-mm-dd")
890               End If
900             Next r
910           End If
920         Next c
930       End If

1070    End If

        'to keep track of date columns
        '-----------------------------
1080    ReDim arrDates(1 To UBound(arrDataTypes) + 1) As Boolean

        'treat the date columns as text
        '------------------------------
1090    If lArrayDims = 1 Then
1100      If arrDataTypes(0) = "DATE" Then
1110        arrDataTypes(0) = "TEXT"
1120      End If
1130    Else
1140      For c = 0 To UBound(arrDataTypes)
1150        If arrDataTypes(c) = "DATE" Then
1160          arrDataTypes(c) = "TEXT"
1170          arrDates(c + 1) = True
1180        End If
1190      Next c
1200    End If

1210    strDataTypes = Replace(strDataTypes, "DATE", "TEXT", , ,
vbBinaryCompare)

        'drop table if it exists
        '-----------------------
1220    DropSQLiteTable strDB, strTable, , True

        'create the CREATE TABLE SQL
        '---------------------------
1230    On Error GoTo 0
1240    strCreateTable = GetSQLiteCreateTableString(strTable, _
                                                    strSQL, _
                                                    lIntegerPrimaryKeyColumn, _
                                                    strFields, _
                                                    strDataTypes, _
                                                    False, _
                                                    bTempTable, _
                                                    False, _
                                                    strDB)
1250    On Error GoTo ERROROUT

        'create the receiving SQLite table
        '---------------------------------
1290    AlterDB strCreateTable, strDB, False

1300    ReDim arrDataTypes2(1 To UBound(arrDataTypes) + 1) As Byte

        'note that if arrDataTypes(c) is empty then arrDataTypes2 will
be 0, so setting TEXT
        
'-----------------------------------------------------------------------------------
1310    For c = 0 To UBound(arrDataTypes)
1320      Select Case arrDataTypes(c)
            Case "TEXT"
1330          arrDataTypes2(c + 1) = 0
1340        Case "INTEGER"
1350          arrDataTypes2(c + 1) = 1
1360        Case "REAL"
1370          arrDataTypes2(c + 1) = 2
1380        Case "BLOB"
1390          arrDataTypes2(c + 1) = 3
1400        Case Else
1410          arrDataTypes2(c + 1) = 0
1420      End Select
1430    Next c

1440    If m_bInsertOrIgnore Then
1450      Set cmddhSQLite = _
          CreateSQLiteCommand(strDB, "INSERT OR IGNORE INTO " & strTable & _
                                     " VALUES(" &
MakeParameterString(lFields) & ")")
1460    Else
1470      If m_bInsertOrReplace Then
1480        Set cmddhSQLite = _
            CreateSQLiteCommand(strDB, "INSERT OR REPLACE INTO " & strTable & _
                                       " VALUES(" &
MakeParameterString(lFields) & ")")
1490      Else
1500        Set cmddhSQLite = _
            CreateSQLiteCommand(strDB, "INSERT INTO " & strTable & _
                                       " VALUES(" &
MakeParameterString(lFields) & ")")
1510      End If
1520    End If

1600    BeginTransaction strDB

        'write the data to the SQLite table
        '----------------------------------
1610    With cmddhSQLite
1620      If lArrayDims = 1 Then
1630        For r = LB1 + btSkipFirstRow To UB1
1640          If Not IsEmpty(vArray(r)) Then
1650            If arrDataTypes2(1) = 0 Then
1660              .SetText 1, CStr(vArray(r))
1670            Else
1680              If arrDataTypes2(1) = 1 Then
1690                .SetInt32 1, CLng(vArray(r))
1700              Else
1710                If arrDataTypes2(1) = 2 Then
1720                  .SetDouble 1, CDbl(vArray(r))
1730                Else
1740                  .SetText 1, CStr(vArray(r))
1750                End If
1760              End If
1770            End If
1780          Else  'If Not IsEmpty(vArray(r))
1790            If arrDates(1) Then
1800              .SetText 1, Chr(32)  'this is to prevent date
formatting in the Excel sheet
1810            Else
1820              .SetNull 1
1830            End If
1840          End If
1850          .Execute

1900        Next r
1910      Else  'If lArrayDims = 1
1920        For r = LB1 + btSkipFirstRow To UB1
1930          For c = LB2 To UB2
1940            If Not IsEmpty(vArray(r, c)) Then
1950              If arrDataTypes2(c + btLBAdd) = 0 Then
1960                .SetText c + btLBAdd, CStr(vArray(r, c))
1970              Else
1980                If arrDataTypes2(c + btLBAdd) = 1 Then
1990                  .SetInt32 c + btLBAdd, CLng(vArray(r, c))
2000                Else
2010                  If arrDataTypes2(c + btLBAdd) = 2 Then
2020                    .SetDouble c + btLBAdd, CDbl(vArray(r, c))
2030                  Else
2040                    .SetText c + btLBAdd, CStr(vArray(r, c))
2050                  End If
2060                End If
2070              End If
2080            Else  'If Not IsEmpty(vArray(r))
2090              If arrDates(c + btLBAdd) Then
2100                .SetText c + btLBAdd, Chr(32)  'this is to prevent
date formatting in the Excel sheet
2110              Else
2120                .SetNull c + btLBAdd
2130              End If
2140            End If
2150          Next c

2160          .Execute

2210        Next r
2220      End If  'If lArrayDims = 1
2230    End With

2280    If Len(strIndexFields) > 0 Then
2290      CreateSQLiteIndexes strDB, "SELECT " & strFields & " FROM "
& strTable, _
                              strTable, strIndexFields,
lIntegerPrimaryKeyColumn, _
                              True, True
2300    End If

2310    CommitTransaction strDB

2330    Exit Sub
ERROROUT:

End Sub


RBS


On Tue, May 18, 2010 at 3:29 PM, Gilles Ganault <gilles.gana...@free.fr> wrote:
> On Tue, 18 May 2010 13:18:49 +0100, Bart Smissaert
> <bart.smissa...@gmail.com> wrote:
>>Quite simple that. Basically: range > variant array > loop through
>>array and write to SQLite.
>>Let me know and I will post some example code.
>
> If you have some basic code to go through Excel or OO sheets to gather
> data and somehow stick them into SQLite, that'd be useful to study.
>
> Thank you.
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to