Toon posts:

[C#] SQLite problemen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben me voor het eerst bezig met wat C#. Nu ben ik bezig met een Visual C# project en graag zou ik daar de SQLite library bij gebruiken. Ik heb de broncode van het mono project (www.go-mono.com) gedownload en heb de Mono.Data.SqliteClient code omgezet naar een Visual C# project. Dit werkt allemaal op de SqliteDataReader.ExecuteReader() methode na. De versies die geen antwoord terug verwachten van de database werken, maar de versie met een callback functie gaat dus fout. Heeft iemand hier ervaring mee?

De code die ik had om Sqlite te testen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Data;
using Mono.Data.SqliteClient;

namespace SqliteTest
{
    class SqliteTestApp
    {
        [STAThread]
        static void Main(string[] args)
        {
            string connectionString = "URI=file:SqliteTest.db";
            SqliteConnection dbcon;
            dbcon = new SqliteConnection(connectionString);
            dbcon.Open();
            SqliteCommand dbcmd = dbcon.CreateCommand();
            dbcmd.Connection = dbcon;
            string sql = "CREATE TABLE test (nummer int)";
            sql = "INSERT INTO test VALUES (12)";
            dbcmd.CommandText = sql;
            dbcmd.ExecuteNonQuery();
            sql = "SELECT nummer FROM test";
            dbcmd.CommandText = sql;
            SqliteDataReader reader;
            reader = dbcmd.ExecuteReader();
            while (reader.Read()) 
            {
                int nummer = reader.GetInt32(0);
                Console.WriteLine(nummer);
            }
            reader.Close();
            reader = null;
            dbcmd.Dispose();
            dbcmd = null;
            dbcon.Close();
            dbcon = null;
        }
    }
}

Als iemand meer wil weten / me helpen, dan wil ik best de workspaces online zetten. De laatste traceback komt bij de volgende instructie (is code van de mono class libs):

[sqlitecommand.cs]
code:
1
2
err = sqlite_exec (parent_conn.Handle, sql, 
         new SqliteCallbackFunction(reader.SqliteCallback), IntPtr.Zero, &msg_result);


Als iemand me desnoods kan wijzen op een stukje documentatie over hoe callback routines te definieren in c# welke aangeroepen kunnen worden door een stukje native dll code, dan zou dat al helpen.

Rick

[ Voor 7% gewijzigd door Verwijderd op 20-07-2003 19:04 . Reden: code block ]


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Misschien kun je de code even tussen de [ code ] tags zetten, zonder spaties, dat leest wat gemakkelijker. Volgens mij was groeten ook niet echt de bedoeling->faq.

Voor de afwisseling wel een duidelijke startpost!

Verwijderd

Hmz... aan de source zal het niet liggen, welke foutmelding krijg je terug. Of krijg je echt niets terug.

Ik maak zelf altijd gebruik van ODBC, de syntax is hetzelfde. En jouw source code ziet er verder goed uit.

Krijg je gewoon geen waarde terug, of krijg je gelijk een error?

edit:
Of lees ik nou echt overal overheen :P... en nice opening post!

[ Voor 13% gewijzigd door Verwijderd op 20-07-2003 19:02 ]


Verwijderd

Topicstarter
De debugger klapt op de gegeven regel met de melding
code:
1
An unhandled exception of type 'System.ExecutionEngineException' occurred in mono.data.sqliteclient.dll

Verwijderd

Gooi het is in een try, en catch het dan... en MessageBox.Show even de cuaght message! :)

edit:
Zo krijg je een beter error message ;)

[ Voor 24% gewijzigd door Verwijderd op 20-07-2003 19:05 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 20 July 2003 @ 19:02:
De debugger klapt op de gegeven regel met de melding
code:
1
An unhandled exception of type 'System.ExecutionEngineException' occurred in mono.data.sqliteclient.dll
Lijkt me eerder een bug in SQLLite; zeker omdat het geen standaard .Net foutmelding is. Iig niet eentje die ik ooit ben tegengekomen.

Vergeet niet dat deze (=SQLLite) nog niet in beta is.

[ Voor 16% gewijzigd door gorgi_19 op 20-07-2003 19:07 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

[b]gorgi_19 schreef op 20 July 2003 @ 19:03Lijkt me eerder een bug in SQLLite; zeker omdat het geen standaard .Net foutmelding is. Iig niet eentje die ik ooit ben tegengekomen.

Vergeet niet dat deze (=SQLLite) nog niet in beta is.
Hmz... ik vind het dan wel een rare bug als je nog niet eens data kan ontvangen. En ik lees er niet over op de site als: "Bug Know".

Maar ik wacht even op de Caught.Message ;)

Verwijderd

Topicstarter
Verwijderd schreef op 20 July 2003 @ 19:03:
Gooi het is in een try, en catch het dan... en MessageBox.Show even de cuaght message! :)

edit:
Zo krijg je een beter error message ;)
Zou best willen was het niet dat de code al in een try block staat. Ok, dan daarna wel geen catch block, maar een finally, maar dat moet niet uitmaken. In de IDE kan ik ook niet veel meer wijs worden.

Verwijderd

Probeer is:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Data;
using Mono.Data.SqliteClient;

namespace SqliteTest
{
    class SqliteTestApp
    {
        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                string connectionString = "URI=file:SqliteTest.db";
                SqliteConnection dbcon;
                dbcon = new SqliteConnection(connectionString);
                dbcon.Open();
                SqliteCommand dbcmd = dbcon.CreateCommand();
                dbcmd.Connection = dbcon;
                string sql = "CREATE TABLE test (nummer int)";
                sql = "INSERT INTO test VALUES (12)";
                dbcmd.CommandText = sql;
                dbcmd.ExecuteNonQuery();
                sql = "SELECT nummer FROM test";
                dbcmd.CommandText = sql;
                SqliteDataReader reader;
                reader = dbcmd.ExecuteReader();
                while (reader.Read()) 
                {
                    int nummer = reader.GetInt32(0);
                    Console.WriteLine(nummer);
                }
                reader.Close();
                reader = null;
                dbcmd.Dispose();
                dbcmd = null;
                dbcon.Close();
                dbcon = null;
            }

            catch (ExecutionEngineException caught)
            {
                Console.Write(caught.Message);
            }
        }
    }
}


En kijk is naar de error die je terug krijgt?

Verwijderd

Topicstarter
Helaas werken de try-catch structuren niet bij mijn probleem. Zowel in de debug run als in de release run klapt mijn programma eruit. Lijkt er op dat de callback functie het zodanig verprutst dat niets meer wil werken. Ik zal een zip bestandje maken met daarin mijn code. Kunnen de mensen die me niet geloven het zelf proberen :)

Bij deze

http://home.wanadoo.nl/hgvl/MyProblemSqlite.zip

[ Voor 9% gewijzigd door Verwijderd op 20-07-2003 19:34 . Reden: URL geplaatst ]


Verwijderd

Verwijderd schreef op 20 juli 2003 @ 19:28:
Helaas werken de try-catch structuren niet bij mijn probleem. Zowel in de debug run als in de release run klapt mijn programma eruit. Lijkt er op dat de callback functie het zodanig verprutst dat niets meer wil werken. Ik zal een zip bestandje maken met daarin mijn code. Kunnen de mensen die me niet geloven het zelf proberen :)
Ik geloof je wel :) Maar heb je niet je bij je DeBug Opties aanstaan dat hij be elke exception je DeBug'er maar in moet vliegen? Ik zet dat namelijk ook wel is aan, en vergeet ik het uit te zetten :P

Waarom niet gewoon ODBC? :9

[ Voor 11% gewijzigd door Verwijderd op 20-07-2003 19:33 ]


Verwijderd

Topicstarter
Werkt niet... laat ik maar direct iets anders gaan doen wat wel werkt... nah... ik wil dit gewoon aan de praat krijgen. Moet kunnen. Lukt mij alleen niet :(

Verwijderd

Verwijderd schreef op 20 July 2003 @ 19:35:
Werkt niet... laat ik maar direct iets anders gaan doen wat wel werkt... nah... ik wil dit gewoon aan de praat krijgen. Moet kunnen. Lukt mij alleen niet :(
Probeer het met ODBC, is werkend... en je source is goed. Dus ja, je zou nu wel zeggen dat of je DB niet goed zit (kan ik me niet voorstellen) of dat het echt een SQLite ligt.

Dus, ik denk dat ODBC een goede oplossing voor jouw zal zijn.

edit:
En de frustratie van "dit moet werken" ken ik maar al tegoed...

[ Voor 8% gewijzigd door Verwijderd op 20-07-2003 19:38 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

C#:
1
2
3
4
5
6
                        string errmsg;
-->                    sqlite_handle = sqlite_open (db_file, db_mode, out errmsg);

                        if (errmsg != null) {
                                throw new ApplicationException (errmsg);
                        }

Bij het pijltje klapt hij er uit, iets exacter gedefinieerd. Normaliter hoort die foutmelding afgevangen te worden door, getuige de output parameter. Echter, de fout is zo cruciaal, dat hij die niet eens accepteert.

Vanaf dat punt kan ik de foutmelding ook niet verder traceren;
C#:
1
2
               [DllImport("sqlite")]
                static extern IntPtr sqlite_open (string dbname, int db_mode, out string errstr);

Hier vliegt hij uit het C# gedeelte en de externe dll kan ik niet benaderen. Ik zou bijna gokken dat hij het niet fijn vindt om het bestand te maken oid, maar dit blijft een gok.

[ Voor 7% gewijzigd door gorgi_19 op 20-07-2003 19:46 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Misschien iemand met callback ervaringen die kan vertellen wat er mis is. Misschien moet ik straks wel even een oudere versie van sqlite.dll gebruiken...

Kun je een ODBC bestand tijdens een installer installeren? Samen met speciale ODBC drivers? (sqlite heeft ook eigen odbc drivers)

Verwijderd

Topicstarter
gorgi_19 schreef op 20 July 2003 @ 19:44:
C#:
1
2
3
4
5
6
                        string errmsg;
-->                    sqlite_handle = sqlite_open (db_file, db_mode, out errmsg);

                        if (errmsg != null) {
                                throw new ApplicationException (errmsg);
                        }

Bij het pijltje klapt hij er uit, iets exacter gedefinieerd. Normaliter hoort die foutmelding afgevangen te worden door, getuige de output parameter. Echter, de fout is zo cruciaal, dat hij die niet eens accepteert.

Vanaf dat punt kan ik de foutmelding ook niet verder traceren;
C#:
1
2
               [DllImport("sqlite")]
                static extern IntPtr sqlite_open (string dbname, int db_mode, out string errstr);

Hier vliegt hij uit het C# gedeelte en de externe dll kan ik niet benaderen. Ik zou bijna gokken dat hij het niet fijn vindt om het bestand te maken oid, maar dit blijft een gok.
Dat is vreemd. Bij mij werkt het wel als ik een create database query uitvoer, en een insert query (geen callback nodig). De database wordt netjes gemaakt (code is uit het voorbeeld gehaald). Data select uitvoeren gaat alleen niet. Vreemd dus dat bij jouw de hele mikmak het gewoon niet doet (hier een klein deel alleen niet)

[ Voor 1% gewijzigd door Verwijderd op 20-07-2003 19:48 . Reden: typo ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Als je een catch-blok gebruikt, en er treedt een error op in het bijhorende try block, dan moet dat catch blok hoedanook uitgevoerd worden...

Ben je trouwens zeker dat je SQL-statement correct is?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Als de JIT of zijn omgeving klapt, dan ben je nergens met een catch blok. Lijkt lastig? Blijft wel native code waarmee je plraat en geen .NET component. Daarnaast hebben we het (zonder lullig te doen) nog wel over een MS product ;)

Zonder dollen. Het stukje SQL is goed en ook al was dat niet zo, dan mag de code er nogsteeds niet op deze manier uitklappen. De wrapper om de sqlite.dll is gewoon nog niet volwassen en dus gaat het blijkbaar nog niet helemaal goed.

[ Voor 1% gewijzigd door Verwijderd op 20-07-2003 23:20 . Reden: typos (zoals gewoonlijk) ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Verwijderd schreef op 20 July 2003 @ 23:19:
Daarnaast hebben we het (zonder lullig te doen) nog wel over een MS product ;)
Beetje kort door de bocht. .NET is een MS product, maar die SqlLite niet. En het is nu eenmaal blijkbaar met die laatste dat hij problemen heeft....
:P

https://fgheysels.github.io/


Verwijderd

whoami schreef op 21 July 2003 @ 10:13:
Beetje kort door de bocht. .NET is een MS product, maar die SqlLite niet. En het is nu eenmaal blijkbaar met die laatste dat hij problemen heeft....
:P
Jip, ik ben zelf van mening dat MS idd geen slechte software maakt. En ik heb het geprobeert om het probleem op te lossen, maar ik geef het op!

Try ODBC... en laat dit achter je liggen. Het is vaak wel moeilijk, omdat de drang van 'dit moet kunnen' je vaak niet loslaat! Maar, het is ook maar een tip van me ;)
Pagina: 1