Benutzer mit den meisten Antworten
sqlite: Reader-fehler bei Zugriff auf Datenbank verstehe ich nicht

Frage
-
Also, ich hab eine riesige db mit Städteinformationen weltweit im db3-Format.
Ich suche nun (zu Testzwecken) den string "'in", also Apostroph+"in" mit
"Select RowID,nameUTF8,NameASCII,nameAlternativ,breite,lenge,countrycode,countrycodeother,timezone " _ & " from cities where (nameUTF8 Like '" & tx & "' or NameASCII LIKE '" & _ tx & "' or nameAlternativ LIKE '" & tx & "')"
tx ist der Suchstring, in dem wurde ' durch '' (2x Apostroph) ersetzt und vorne und hinten ein % drangesetzt. Bis hierhin funzt auch alles, mit anderen Suchstrings klappte es auch immer.
Speziell bei dieser Suche aber gibts einen Aussetzter wenn ich im Reader rdr (as SQLiteDataReader) die 3. Reihe abfrage. 0,1,2,4,5,6,7,8 sind korrekt gefüllt. Die Fehlermeldung kopier ich mal wegen der Länge zum Schluss rein.Der Inhalt des Feldes von rdr(3) wäre übrigens:
Bo-de,Clear River,Light River,Lo River,Lung Chiang,Pan-lung Chiang,Panlong Jiang,P”an-lung Chiang,Riviere Claire,Rivière Claire,Song Ca,Song Ka,Song Lo,Song Thanh Long,Sông Lô
wobei dieses Zeichen an 2. Stelle P”an-lung den asc-code 148 hat, weiß nicht ob das daran liegt.
Und das ist der ausgegebene Fehler im Direktfenster, dessen Ursache ich nicht verstehe:
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unbehandelte Ausnahme</Description><AppDomain>AstroDaten.vshost.exe</AppDomain><Exception><ExceptionType>System.OutOfMemoryException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Eine Ausnahme vom Typ "System.OutOfMemoryException" wurde ausgelöst.</Message><StackTrace> bei System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encoding)
bei System.Text.UTF8Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)
bei System.Data.SQLite.SQLiteConvert.UTF8ToString(IntPtr nativestring, Int32 nativestringlen)
bei System.Data.SQLite.SQLite3.GetText(SQLiteStatement stmt, Int32 index)
bei System.Data.SQLite.SQLite3.GetValue(SQLiteStatement stmt, Int32 index, SQLiteType typ)
bei System.Data.SQLite.SQLiteDataReader.GetValue(Int32 i)
bei System.Data.SQLite.SQLiteDataReader.get_Item(Int32 i)
bei WindowsApplication1.sq.DBCode.getCities(String searchstring) in D:\Thomas\VS10\AstroDaten\AstroDaten\modSQLIte.vb:Zeile 96.
bei WindowsApplication1.Form1.btJetzt_Click(Object sender, EventArgs e) in D:\Thomas\VS10\AstroDaten\AstroDaten\Form1.vb:Zeile 401.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message&amp; m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message&amp; m)
bei System.Windows.Forms.ButtonBase.WndProc(Message&amp; m)
bei System.Windows.Forms.Button.WndProc(Message&amp; m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp; msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(ApplicationContext context)
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
bei WindowsApplication1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()</StackTrace><ExceptionString>System.OutOfMemoryException: Eine Ausnahme vom Typ "System.OutOfMemoryException" wurde ausgelöst.
bei System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encoding)
bei System.Text.UTF8Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)
bei System.Data.SQLite.SQLiteConvert.UTF8ToString(IntPtr nativestring, Int32 nativestringlen)
bei System.Data.SQLite.SQLite3.GetText(SQLiteStatement stmt, Int32 index)
bei System.Data.SQLite.SQLite3.GetValue(SQLiteStatement stmt, Int32 index, SQLiteType typ)
bei System.Data.SQLite.SQLiteDataReader.GetValue(Int32 i)
bei System.Data.SQLite.SQLiteDataReader.get_Item(Int32 i)
bei WindowsApplication1.sq.DBCode.getCities(String searchstring) in D:\Thomas\VS10\AstroDaten\AstroDaten\modSQLIte.vb:Zeile 96.
bei WindowsApplication1.Form1.btJetzt_Click(Object sender, EventArgs e) in D:\Thomas\VS10\AstroDaten\AstroDaten\Form1.vb:Zeile 401.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message&amp; m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message&amp; m)
bei System.Windows.Forms.ButtonBase.WndProc(Message&amp; m)
bei System.Windows.Forms.Button.WndProc(Message&amp; m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp; msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(ApplicationContext context)
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
bei WindowsApplication1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()</ExceptionString></Exception></TraceRecord>
Antworten
-
Hallo,
wirklich viel weiter helfen kann ich dir vermutlich nicht, habe aber ein paar Anregungen:
- Verwende bitte Parameter! Wenn du das nicht tust, ist SQL Injection ein leichtes und es könnte erhebliche Probleme verursachen. Das hat auch den positiven Nebeneffekt, dass du die ' nicht mehr selbst escapen musst.
- Das es an dem 148er ASCII Zeichen in den Daten liegt bezweifle ich, aber entferne es doch mal testweise und gucke ob es dann funktioniert.
Als was ist die Spalte mit dem Zeichen deklariert? Vielleicht gibt es dort ein Problem.
Alternativ kannst du auch nur mal das einzelne Feld versuchen abzufragen und gucken was dann passiert.
Die Exception scheint ja etwas mit dem Encoding zutun zu haben. Aber eine OutOfMemoryException finde ich an dieser Stelle etwas ungewöhnlich.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort markiert Migration Sucks Montag, 20. März 2017 08:46
-
Hallo,
ich würde Du hast einfach keinen freien Speicher mehr.
Achte auf den Speicherverbrauch deines Programms und starte es erneut.
Schreibe etwas über die Anzahl der Zeilen. Wie groß ist denn groß genau?
Schau das hier bitte an:
https://social.msdn.microsoft.com/Forums/en-US/90ae61dd-b01e-46ea-a5ac-bcd2eeae6983/systemoutofmemoryexception-exception?forum=adodotnetdataprovidersWie Tom es schreibt: Du solltest Parameter nutzen.
Grüße Alexander
- Als Antwort markiert Migration Sucks Montag, 20. März 2017 08:46
-
Hallo,
zum Parameter ein kurzes Beispiel wie es in etwa geht:
command.CommandText = "Select RowID,nameUTF8,NameASCII,nameAlternativ,breite,lenge,countrycode,countrycodeother,timezone " _ & " from cities where (nameUTF8 Like @tx or NameASCII LIKE " _ & "@tx or nameAlternativ LIKE @tx)" command.CommandType = CommandType.Text command.Parameters.Add(New SQLiteParameter("@tx", tx))data.ByteIndex))
In der Dokumentation sollte mehr dazu drin stehen.
Die @Parametername werden bei der Ausführung durch die Werte aus Patameters ersetzt. Dabei wird auch drauf geachtet das ' etc. zu '' usw. werden und das SQL Injection nicht möglich ist.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort markiert Migration Sucks Montag, 20. März 2017 08:46
Alle Antworten
-
Hallo,
wirklich viel weiter helfen kann ich dir vermutlich nicht, habe aber ein paar Anregungen:
- Verwende bitte Parameter! Wenn du das nicht tust, ist SQL Injection ein leichtes und es könnte erhebliche Probleme verursachen. Das hat auch den positiven Nebeneffekt, dass du die ' nicht mehr selbst escapen musst.
- Das es an dem 148er ASCII Zeichen in den Daten liegt bezweifle ich, aber entferne es doch mal testweise und gucke ob es dann funktioniert.
Als was ist die Spalte mit dem Zeichen deklariert? Vielleicht gibt es dort ein Problem.
Alternativ kannst du auch nur mal das einzelne Feld versuchen abzufragen und gucken was dann passiert.
Die Exception scheint ja etwas mit dem Encoding zutun zu haben. Aber eine OutOfMemoryException finde ich an dieser Stelle etwas ungewöhnlich.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort markiert Migration Sucks Montag, 20. März 2017 08:46
-
Hallo,
ich würde Du hast einfach keinen freien Speicher mehr.
Achte auf den Speicherverbrauch deines Programms und starte es erneut.
Schreibe etwas über die Anzahl der Zeilen. Wie groß ist denn groß genau?
Schau das hier bitte an:
https://social.msdn.microsoft.com/Forums/en-US/90ae61dd-b01e-46ea-a5ac-bcd2eeae6983/systemoutofmemoryexception-exception?forum=adodotnetdataprovidersWie Tom es schreibt: Du solltest Parameter nutzen.
Grüße Alexander
- Als Antwort markiert Migration Sucks Montag, 20. März 2017 08:46
-
Danke an Tom und Dich, Alexander.
Die db ist 1,4GB groß, 5,4 Mio Datensätze. Das mit dem Speicherverbrauch werde ich prüfen, könnte wohl sein! Die Spalte ist als TEXT deklariert.
Helft mir bitte mal mit diesem 'Parameter'. Ich weiß gar nicht was Ihr hier meint.
Gruß und Dank!
TH
-
Hallo,
zum Parameter ein kurzes Beispiel wie es in etwa geht:
command.CommandText = "Select RowID,nameUTF8,NameASCII,nameAlternativ,breite,lenge,countrycode,countrycodeother,timezone " _ & " from cities where (nameUTF8 Like @tx or NameASCII LIKE " _ & "@tx or nameAlternativ LIKE @tx)" command.CommandType = CommandType.Text command.Parameters.Add(New SQLiteParameter("@tx", tx))data.ByteIndex))
In der Dokumentation sollte mehr dazu drin stehen.
Die @Parametername werden bei der Ausführung durch die Werte aus Patameters ersetzt. Dabei wird auch drauf geachtet das ' etc. zu '' usw. werden und das SQL Injection nicht möglich ist.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort markiert Migration Sucks Montag, 20. März 2017 08:46
-
Vielen Dank, Tom. Dein Beispiel hilft mir sehr. Werde mich mehr damit beschäftigen.
Als Feedback an Euch Beide:
Irgendwas stimmt offenbar mit der DB nicht. Die Feldlänge von rdr(3) ist in diesem Fall nämlich 99 Mio Zeichen! Obwohl der Inhalt, wenn ich ihn mit einem DB-Browser ansehe, so kurz ist wie oben beschrieben.Da muss ich mal bisschen weitergraben!
Jedenfalls habt Ihr mir sehr geholfen. Vielen Dank nochmal !