- Offizieller Beitrag
Hi,
da SQLite seine Stärken dann ausspielen kann, wenn viele Operationen auf einen Schlag abgearbeitet werden sollen, ist es wenig sinnvoll jeden INSERT- oder UPDATE-Vorgang separat zu coden.
Mit den UDF _SQLite_INSERT() und _SQLite_UPDATE() besteht die Möglichkeit weitestgehend ohne SQL-Syntax zu arbeiten (außer WHERE-Klausel bei UPDATE).
Die Daten können als String (Einzeloperation) oder als Array übergeben werden.
Ich denke, das spart eine ganze Menge Schreibarbeit. ![]()
Edit 11.05.2014
Ich habe mal wieder etwas mit SQLite gearbeitet und dabei sind einige neue Dinge angefallen ![]()
- INSERT kpl. neu
- weitere Funktionen hinzugefügt
Funktionen
_SQLite_TableExists
Prüft eine Tabelle auf Existenz (True/False)
_SQLite_SelectAll
Wählt alle Felder einer Tabelle für eine bestimmte Bedingung aus (2D-Ergebnisarray)
(ohne Bedingung wird die gesamte Tabelle ausgegeben)
_SQLite_CountRows
Ermittelt die Anzahl Datensätze in einer Tabelle
_SQLite_ColumnsInfo
Ermittelt Anzahl Felder einer Tabelle und/oder Feldnamen oder Datentypen
_SQLite_INSERT
Fügt einen oder mehrere DS in die angegebene Tabelle ein.
Es kann ein String oder 1D-Array übergeben werden (einzelner DS) oder ein 2D-Array (mehrere DS)
_SQLite_UPDATE (unverändert)
Führt ein UPDATE für eine oder mehrere Spalten einer angegebenen
Tabelle, mit oder ohne Bedingung (WHERE) aus.
Die UPDATE-Angaben können als String (einzelne Spalte) oder Array
übergeben werden. Es wird erst die Spalte, dann der neue Wert,
getrennt durch $Delim (Standard ',') übergeben.
Wird keine WHERE-Klausel übergeben, wird die Operation in ALLEN DS
ausgeführt! Es braucht nur die reine Klausel (z.B.: ORT = 'Hamburg')
übergeben werden, nicht das Schlüsselwort.
z.B. _SQLite_UPDATE('Kunden', 'ORT,Neu-Grünberg', 'PLZ = 99881')
Local $aUpdate[4] = ['STRASSE,Grundweg 12','PLZ,34366','ORT,Hinterm Berg','TEL,04466-3356']
_SQLite_UPDATE('Kunden', $aUpdate, "NAME = 'Kunze' AND PLZ = 34345")
Alles anzeigen
SQLiteMore.au3 (v0.2)
;===================================================================================================
; Function Name....: _SQLite_TableExists
; Description......: Prüft eine Tabelle auf Existenz
; Parameter(s).....: $_sTable Tabellenname
; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
; .................: #include <SQLite.au3>
; Return Value(s)..: Erfolg: True / False
; .................: Fehler: False, @error = 1, @extended = SQLite-@error
; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
;===================================================================================================
Func _SQLite_TableExists($_sTable)
Local $hQuery, $aQuery, $fRet = False, $sErr
If $SQLITE_OK <> _SQLite_Query(-1, "SELECT name FROM sqlite_master WHERE type='table'", $hQuery) Then
$sErr = _SQLite_ErrCode()
_SQLite_QueryFinalize($hQuery)
Return SetError(1,$sErr,False)
EndIf
While _SQLite_FetchData($hQuery, $aQuery) = $SQLITE_OK
If $aQuery[0] = $_sTable Then
$fRet = True
ExitLoop
EndIf
WEnd
_SQLite_QueryFinalize($hQuery)
Return $fRet
EndFunc ;==>_SQLite_TableExists
;===================================================================================================
; Function Name....: _SQLite_SelectAll
; Description......: Wählt alle Felder einer Tabelle für eine gegebene Bedingung aus
; Parameter(s).....: $_sTable Tabellenname
; .................: $_sWhere WHERE - Bedingung ohne Schlüsselwort (Standard='', gibt gesamte Tabelle aus)
; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
; .................: #include <SQLite.au3>
; Return Value(s)..: Erfolg: Ergebnisarray
; .................: Fehler: 1, @error = 1, @extended = SQLite-@error
; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
;===================================================================================================
Func _SQLite_SelectAll($_sTable, $_sWhere='')
If $_sWhere <> '' Then $_sWhere = " WHERE " & StringRegExpReplace($_sWhere, '([^;]+)([;]*)$', '$1;')
Local $aResult, $iRows, $iColumns
If $SQLITE_OK <> _SQLite_GetTable2d(-1, "SELECT * FROM " & $_sTable & $_sWhere, $aResult, $iRows, $iColumns) Then
Return SetError(1,_SQLite_ErrCode(),1)
Else
Return $aResult
EndIf
EndFunc ;==>_SQLite_SelectAll
;===================================================================================================
; Function Name....: _SQLite_CountRows
; Description......: Ermittelt die Anzahl von Datensätzen für eine Tabelle
; Parameter(s).....: $_sTable Tabellenname
; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
; .................: #include <SQLite.au3>
; Return Value(s)..: Erfolg: Anzahl der Datensätze
; .................: Fehler: -1 @error = 1, @extended = SQLite-@error
; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
;===================================================================================================
Func _SQLite_CountRows($_sTable)
Local $hQuery, $aQuery, $iRet = 0, $iErr
If $SQLITE_OK <>_SQLite_Query(-1, "SELECT count(*) FROM " & $_sTable & ";", $hQuery) Then
$iErr = _SQLite_ErrCode()
_SQLite_QueryFinalize($hQuery)
Return SetError(1,$iErr,-1)
EndIf
While _SQLite_FetchData($hQuery, $aQuery) = $SQLITE_OK
$iRet = $aQuery[0]
WEnd
_SQLite_QueryFinalize($hQuery)
Return $iRet
EndFunc ;==>_SQLite_CountRows
;===================================================================================================
; Function Name....: _SQLite_ColumnsInfo
; Description......: Ermittelt die Anzahl von Spalten für eine Tabelle, optional auch Namen oder Typen der Spalten
; Parameter(s).....: $_sTable Tabellenname
; ....optional.....: $_iNames 0 (Standard) - nur Anzahl
; .................: 1 - gibt Array mit Spaltennamen und Anzahl an Index 0 zurück.
; .................: 2 - gibt Array mit Spaltentypen und Anzahl an Index 0 zurück.
; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
; .................: #include <SQLite.au3>
; Return Value(s)..: Erfolg: Anzahl der Spalten oder Array mit Anzahl und allen Spaltennamen/-Typen
; .................: Fehler: -1 @error = 1, @extended = SQLite-@error
; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
;===================================================================================================
Func _SQLite_ColumnsInfo($_sTable, $_iNames=0)
Local $hQuery, $aQuery, $cid, $sCol = '', $sTypes = '', $iErr
If $SQLITE_OK <> _SQLite_Query(-1, "PRAGMA table_info(" & $_sTable & ");", $hQuery) Then
$iErr = _SQLite_ErrCode()
_SQLite_QueryFinalize($hQuery)
Return SetError(1,$iErr,-1)
EndIf
While _SQLite_FetchData($hQuery, $aQuery) = $SQLITE_OK
$cid = $aQuery[0]
If $sCol <> '' Then $sCol &= ','
If $sTypes <> '' Then $sTypes &= ','
$sCol &= $aQuery[1]
$sTypes &= $aQuery[2]
WEnd
_SQLite_QueryFinalize($hQuery)
Switch $_iNames
Case 0
Return $cid +1
Case 1
Return StringSplit($sCol, ',')
Case 2
Return StringSplit($sTypes, ',')
EndSwitch
EndFunc ;==>_SQLite_ColumnsInfo
;===================================================================================================
; Function Name....: _SQLite_INSERT
; Description......: Fügt Daten aus einem String/1D-Array/2D-Array in eine Tabelle ein. Leere Inhalte werden automatisch mit "NULL" besetzt
; Parameter(s).....: $_sTable Tabellenname
; .................: $_vValues String/Array mit Werten
; ....optional.....: $_iIndexStart Array-Index ab dem Werte übernommen werden. (Standard=0)
; ....optional.....: $_sDelim Trennzeichen, wenn $_vValues ein String ist. (Standard=',')
; Requirement(s)...: Eine mit _SQLite_Open() geöffnete DB
; .................: #include <SQLite.au3>
; .................: _SQLite_ColumnsInfo()
; Return Value(s)..: Erfolg: $SQLITE_OK
; .................: Fehler: 1 @error = 1 übergebene Spaltenzahl falsch
; .................: @error = 2 Insert fehlgeschlagen @extended = Insert-@error
; Author(s)........: BugFix ([email='bugfix@autoit.de'][/email])
;===================================================================================================
Func _SQLite_INSERT($_sTable, $_vValues, $_iIndexStart=0, $_sDelim=',')
If Not IsArray($_vValues) Then $_vValues = StringSplit($_vValues, $_sDelim, 3)
Local $aValues[1][UBound($_vValues-$_iIndexStart)]
If UBound($_vValues,0) = 1 Then
For $i = $_iIndexStart To UBound($_vValues) -1
$aValues[0][$i] = $_vValues[$i]
Next
Else
$aValues = $_vValues
EndIf
Local $sSQL = 'BEGIN TRANSACTION;', $sEdge, $iColTable = -1
Local $iColArray = UBound($aValues,2), $sValue
Local $aTypes = _SQLite_ColumnsInfo($_sTable, 2)
If IsArray($aTypes) Then $iColTable = $aTypes[0]
If $iColTable = -1 Or ($iColTable <> $iColArray) Then Return SetError(1,0,1)
For $i = $_iIndexStart To UBound($aValues) -1
$sSQL &= 'INSERT INTO ' & $_sTable & ' VALUES ('
For $j = 0 To $iColArray -1
$sValue = $aValues[$i][$j]
If $sValue = '' Then
$sValue = 'NULL'
Else
$sEdge = '"'
If $aTypes[$j+1] <> 'TEXT' Then $sEdge = ''
$sValue = $sEdge & $sValue & $sEdge
EndIf
$sSQL &= $sValue & ','
Next
$sSQL = StringTrimRight($sSQL, 1) & ');'
Next
$sSQL &= 'END TRANSACTION;'
If $SQLITE_OK <> _SQLite_Exec(-1, $sSQL) Then
Return SetError(2,_SQLite_ErrCode(),1)
Else
Return $SQLITE_OK
EndIf
EndFunc ;==>_SQLite_INSERT
;===================================================================================================
; Function Name: _SQLite_UPDATE($sTable, $saField_Value, $sWhere=-1, $Delim=',')
; Description:: Updatet Werte in eine existierende Tabelle einer geöffneten SQLite
; DB
; Parameter(s): $sTable String des Tabellennamens
; $saFieldValue String ODER 1D-Array mit den Feld-Wert Paaren
; $sWhere Bedingung für das SQL-Statement, Standard -1
; gültig für alle DS
; $Delim Trennzeichen zwischen Feld und Wert, Standard:','
; Requirement(s): Eine mit _SQLite_Open() geöffnete DB
; #include <SQLite.au3>
; Return Value(s): Erfolg $SQLITE_OK
; Fehler 1 @error = 1, Update fehlgeschlagen
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===================================================================================================
Func _SQLite_UPDATE($sTable, $saField_Value, $sWhere=-1, $Delim=',')
Local $sUpdate = "UPDATE " & $sTable & " SET "
If Not IsArray($saField_Value) Then
Local $aValues[1] = [$saField_Value]
Else
Local $aValues = $saField_Value
EndIf
For $i = 0 To UBound($aValues) -1
Local $splitVal = StringSplit($aValues[$i], $Delim)
$sUpdate &= StringStripWS($splitVal[1], 3) & " = '" & StringStripWS($splitVal[2], 3) & "',"
Next
$sUpdate = StringTrimRight($sUpdate, 1)
If $sWhere <> -1 Then $sUpdate &= " WHERE " & $sWhere
If $SQLITE_OK <> _SQLite_Exec ( -1, $sUpdate ) Then
Return SetError(1,0,1)
Else
Return $SQLITE_OK
EndIf
EndFunc ;==>_SQLite_UPDATE
Beispielskript
#include <SQLite.au3>
_SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1) ; == SQLite.dll liegt im @ScriptDir
_SQLite_Open(@ScriptDir & '\test.db')
$sSQL = _
"CREATE TABLE IF NOT EXISTS [test_tab] (" & _
"[kdnr] INTEGER PRIMARY KEY AUTOINCREMENT," & _
"[titel] TEXT," & _
"[firma] TEXT," & _
"[name] TEXT NOT NULL," & _
"[vorname] TEXT," & _
"[strasse] TEXT," & _
"[nr] TEXT," & _
"[plz] TEXT," & _
"[ort] TEXT," & _
"[telefon] TEXT," & _
"[gebdat] TEXT);" & _
"INSERT INTO sqlite_sequence VALUES ('test_tab', 9999);" ; == Vorbelegung KD-Nr Startwert, gewünscht: 10000 (9999 +1 autoincrement = 10000)
; == Tabelle erstellen, wenn nicht vorhanden und Startwert setzen für AutoIncrement-Wert
If Not _SQLite_TableExists('test_tab') Then
_SQLite_Exec(-1, $sSQL)
ConsoleWrite('Tabelle erstellt' & @LF)
EndIf
; == INSERT einzelner DS als String
$sInsert = ",Dr.,Musterbau AG,Schmidt,Holger,Hauptstrasse,21,06218,Halle,,"
If $SQLITE_OK <> _SQLite_INSERT('test_tab', $sInsert) Then
MsgBox(0, 'Fehler INSERT', 'Fehler-Nr.: ' & _SQLite_ErrCode() & @CRLF & @CRLF & 'Fehler-Text: ' & _SQLite_ErrMsg())
Exit
EndIf
; == INSERT einzelner DS als 1D-Array
Global $aInsert1D[11] = ['','','Hanswurst GmbH','Wurst','Hans','Ledergasse','15','12345','Bratenau','01122-334455','']
If $SQLITE_OK <> _SQLite_INSERT('test_tab', $aInsert1D) Then
MsgBox(0, 'Fehler INSERT', 'Fehler-Nr.: ' & _SQLite_ErrCode() & @CRLF & @CRLF & 'Fehler-Text: ' & _SQLite_ErrMsg())
Exit
EndIf
; == INSERT mehrere DS als 2D-Array
Global $aInsert[8][11] = [ _
['','','Spökenkieker KG','Schluck','Hein','An der Twiete','1a','21023','Hamburg','040-646589',''], _
['','','Ich & Du GmbH','Meyer','Peter und Paul','Randstrasse','114','45678','Amsee','',''], _
['','','Tischlerei Buchenhorst','Buchenhorst','Klaus-Peter','Am Wald','36','87663','Waldershausen','',''], _
['','','Glaserei Bruch','Bruch','Reiner','Industriegasse','17','39864','Dorf in der Altmark','',''], _
['','','KFZ-Reparatur Stotter','Stotter','Ingolf','Amselgrund','8','76542','Schönhausen','',''], _
['','','Blumen & Mehr','Rose','Claudia','Kirschgarten','36','15446','Bei Berlin','010-152637',''], _
['','','Einzelhandel Ton, Steine, Scherben','Krug','Minna','Krügergasse','78','64459','Neudorf','',''], _
['','','Diätwaren','Tella','Nu','Am Süßen See','10','06224','Halle','','']]
If $SQLITE_OK <> _SQLite_INSERT('test_tab', $aInsert) Then
MsgBox(0, 'Fehler INSERT', 'Fehler-Nr.: ' & _SQLite_ErrCode() & @CRLF & @CRLF & 'Fehler-Text: ' & _SQLite_ErrMsg())
Exit
EndIf
; == die gesamte Tabelle mit _SQLite_SelectAll ausgeben
$a = _SQLite_SelectAll('test_tab')
_ArrayDisplay($a, 'alle Datensätze')
; == alle Felder für die DS mit der gegebenen Bedingung ausgeben
$a = _SQLite_SelectAll('test_tab', 'ort="Halle"')
_ArrayDisplay($a, 'Datensätze mit Bedingung')
; == Anzahl DS
$DS = _SQLite_CountRows('test_tab')
ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $DS --> " & $DS & @LF)
; == Anzahl Spalten
$Spaltenzahl = _SQLite_ColumnsInfo('test_tab')
ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $Spaltenzahl --> " & $Spaltenzahl & @LF)
; == Feldnamen
$a = _SQLite_ColumnsInfo('test_tab', 1)
_ArrayDisplay($a, 'Feldnamen')
; == Feldtypen
$a = _SQLite_ColumnsInfo('test_tab', 2)
_ArrayDisplay($a, 'Feldtypen')
DL bisher: 399