sqlite3_get_table und C#
-
Ich kriege es nicht gebacken die Funktion sqlite3_get_table() aus der sqlite3.dll zu importieren.
Die Funktion ist so aufgebaut:
int sqlite3_get_table( sqlite3*, /* An open database */ const char *sql, /* SQL to be executed */ char ***resultp, /* Result written to a char *[] that this points to */ int *nrow, /* Number of result rows written here */ int *ncolumn, /* Number of result columns written here */ char **errmsg /* Error msg written here */ );
Ab der Stelle "char ***resultp" weiss ich nicht wie ich da mit C# drankomme...
Die sqlite3_open16() importiere ich momentan so:
[DllImport("sqlite3.dll")] public static extern Int32 sqlite3_open16([MarshalAs(UnmanagedType.LPWStr)] string filename, ref Int32 sqlitehandle);
...und die Funktion ist im Original so aufgebaut:
int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );
Die sqlite3_open16()-Funktion lässt sich einwandfrei aufrufen.
Einen der vorhandenen .net-Wrapper möchte ich nicht benutzen und die verwenden scheinbar alle kein sqlite3_get_table().
Kann mir jemand zeigen, wie ich an die Funktion drankomme ?
Danke schonmal für jeden Versuch
-
Hmpf... ich will jetzt nicht irgendwie sagen, dass C# für sowas nicht geeignet ist, aber ich verwende genau aus solchen Gründen C++/CLI. In deinem Fall musst du UnSafe-Code verwenden; So ein ähnliches Problem gab es bereits einmal irgendwo. Der springende Punkt ist, dass das marshaling von mehrdimensionalen Arrays nicht ohne weiteres funktioniert. Was du machen kannst:
unsafe int sqlite3_get_table( sqlite3*, /* An open database */ const char *sql, /* SQL to be executed */ char ***resultp, /* Result written to a char *[] that this points to */ int *nrow, /* Number of result rows written here */ int *ncolumn, /* Number of result columns written here */ char **errmsg /* Error msg written here */ );
Dann allokierst du Speicher für resultp, übergibtst diesen der Funktion, derefenzierst ihn danach und erstellst via Konstruktor einen Array vom Typ System::String.
-
Ok, vielen Dank schonmal
Ich versuch mal mein Glück