Thread overview
I could use some help with SQLite3
Jul 29, 2004
Mista
Jul 29, 2004
Vathix
Jul 29, 2004
Mista
July 29, 2004
I hope someone can help me with sqlite3.
Maybe someone has been doing it succesfully and can show me how they did it, or maybe someone can explain what i am doing wrong in my own test.
Because i can't figure out how i should use the callback function of sqlite3.
The code does compile without errors.
But when i start the program it gives the error message:  "Error: Access Violation"
Also the numCols always returns 1 no matter how many columns there are.
And if i try to writef the results then i get a wrong set of characters and the
error message:  "Error: invalid UTF-8 sequence"
And if i try to do the same with columnNames then i get the error message:
"Error: ArrayBoundsError test.d(9)"



Here is my code:


import std.stdio;
import sqlite3_imp;


int DoTheCallback (void* NotUsed, int numCols , char[][] results, char[][] columnNames)
  {
  writef("number of colomns: ", numCols, "\n");
  return 0;
  };


int main()
  {
  sqlite3* db;
  sqlite3_open("test.db", &db);
  sqlite3_exec(db, "SELECT * FROM account" ,cast(sqlite_callback) &DoTheCallback, null, null);
  sqlite3_close(db);
  return 0;
  }





July 29, 2004
"Mista" <stoop@hotpop.com> wrote in message news:ceb8pu$1i9n$1@digitaldaemon.com...
> I hope someone can help me with sqlite3.
> Maybe someone has been doing it succesfully and can show me how they did
> it, or maybe someone can explain what i am doing wrong in my own test.
> Because i can't figure out how i should use the callback function of
> sqlite3.
> The code does compile without errors.
> But when i start the program it gives the error message:  "Error: Access
> Violation"
> Also the numCols always returns 1 no matter how many columns there are.
> And if i try to writef the results then i get a wrong set of characters
> and the
> error message:  "Error: invalid UTF-8 sequence"
> And if i try to do the same with columnNames then i get the error message:
> "Error: ArrayBoundsError test.d(9)"
>
>
>
> Here is my code:
>
>
> import std.stdio;
> import sqlite3_imp;
>
>
> int DoTheCallback (void* NotUsed, int numCols , char[][] results,
> char[][] columnNames)
>    {
>    writef("number of colomns: ", numCols, "\n");
>    return 0;
>    };
>
>
> int main()
>    {
>    sqlite3* db;
>    sqlite3_open("test.db", &db);
>    sqlite3_exec(db, "SELECT * FROM account" ,cast(sqlite_callback)
> &DoTheCallback, null, null);
>    sqlite3_close(db);
>    return 0;
>    }
>

Your callback function is incorrect and your cast is telling the compiler to ignore it. Use this and don't cast it:


extern(C) int DoTheCallback(void* pArg, int numCols, char** results, char**
columnNames)
{
   writef("number of colomns: ", numCols, "\n");

   for(int i = 0; i != numCols; i++)
   {
      writef("Column '%s' result is: %s\n", toString(columnNames[i]),
toString(results[i]));
   }
   return 0;
}


July 29, 2004
Thank you, that did the trick.

It would be great if the callback part could be included in the example on http://www.dprogramming.com/sqlite.php
Maybe there will be more people who will find this info usefull.
Or maybe i am the only one who can't figure out that i should use extern(C) :D



Vathix wrote:

> "Mista" <stoop@hotpop.com> wrote in message
> news:ceb8pu$1i9n$1@digitaldaemon.com...
> 
>>I hope someone can help me with sqlite3.
>>Maybe someone has been doing it succesfully and can show me how they did
>>it, or maybe someone can explain what i am doing wrong in my own test.
>>Because i can't figure out how i should use the callback function of
>>sqlite3.
>>The code does compile without errors.
>>But when i start the program it gives the error message:  "Error: Access
>>Violation"
>>Also the numCols always returns 1 no matter how many columns there are.
>>And if i try to writef the results then i get a wrong set of characters
>>and the
>>error message:  "Error: invalid UTF-8 sequence"
>>And if i try to do the same with columnNames then i get the error message:
>>"Error: ArrayBoundsError test.d(9)"
>>
>>
>>
>>Here is my code:
>>
>>
>>import std.stdio;
>>import sqlite3_imp;
>>
>>
>>int DoTheCallback (void* NotUsed, int numCols , char[][] results,
>>char[][] columnNames)
>>   {
>>   writef("number of colomns: ", numCols, "\n");
>>   return 0;
>>   };
>>
>>
>>int main()
>>   {
>>   sqlite3* db;
>>   sqlite3_open("test.db", &db);
>>   sqlite3_exec(db, "SELECT * FROM account" ,cast(sqlite_callback)
>>&DoTheCallback, null, null);
>>   sqlite3_close(db);
>>   return 0;
>>   }
>>
> 
> 
> Your callback function is incorrect and your cast is telling the compiler to
> ignore it. Use this and don't cast it:
> 
> 
> extern(C) int DoTheCallback(void* pArg, int numCols, char** results, char**
> columnNames)
> {
>    writef("number of colomns: ", numCols, "\n");
> 
>    for(int i = 0; i != numCols; i++)
>    {
>       writef("Column '%s' result is: %s\n", toString(columnNames[i]),
> toString(results[i]));
>    }
>    return 0;
> }
> 
>