----- Original Message -----
From: "Gregory Letellier" <[EMAIL PROTECTED]>
i'm trying tu use sqli3 with vb. net
he create the db but not the table..
what is the mistake ?
i've this code
Imports System.Runtime.InteropServices
Public Class Form1
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Public Structure sqlite_callback
Public Void As Long
Public I1 As Long
Public s1 As String
Public s2 As String
End Structure
Public Declare Function sqlite3_open Lib "sqlite3.dll" (ByVal
Filename As String, ByRef Handle As Long) As Long
Public Declare Function sqlite3_exec Lib "sqlite3.dll" (ByVal Handle
As Long, ByVal Query As String, ByRef CallbackFunction As
sqlite_callback, ByRef CallBackArgs As Long, ByRef Erreur As String) As
Long
Public Declare Function sqlite3_close Lib "sqlite3.dll" (ByVal
Handle As Long) As Long
Public Declare Function sqlite3_errmsg Lib "sqlite3.dll" (ByVal
Handle As Long) As String
Public Sub Main()
Dim lRet As Long
Dim lHandle As Long
Dim sErreur As String
Dim sSQL As String
lRet = sqlite3_open("c:\test.db", lHandle)
sSQL = "CREATE Table Toto(titi varchar(15));"
lRet = sqlite3_exec(lHandle, sSQL, Nothing, Nothing, sErreur)
sqlite3_close(lHandle)
End Sub
End Class
Lots of problems here ... My VB is rusty, but here goes:
1. Don't bother declaring the callback struct -- you cannot do any form of
callbacks in .NET with SQLite without major hacking. SQLite's callbacks are
expected to be "cdecl" and .NET callbacks are always "stdcall" and you will
get stack errors if you even attempt it. The ADO.NET 2.0 provider for
SQLite does it, but I had to go through hoops.
2. sqlite3_exec is declared incorrectly. The errormessage is a char **,
which is a pointer to a pointer. Getting this out of sqlite into .NET is
not straightforward. You'll have to use ByRef IntPtr and use the Marshal
class to convert it to a string.
3. sqlite3_open and sqlite3_exec are both sortof declared and processed
incorrectly. Those functions expect UTF-8 encoded strings, and you are
passing "string" to them which .NET will at best translate to MBCS ANSI
strings -- which means no international support. For added safety you
should declare those API functions with the CharSet=ANSI attribute to make
absolutely sure .NET gives sqlite ANSI strings instead of UNICODE strings.
It's still wrong, but its close enough for English-only.
4. All sqlite API functions are declared as cdecl, and without instructions
to the contrary, .NET will try and call them as stdcall which means after
every call .NET will have to perform stack fixups. It won't error out your
program per-se, but it will be a performance hit. There's an attribute you
can use to change the calling conventions of the API declaration, but I
can't remember it off the top of my head.
Robert