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 🙂


Anmelden zum Antworten