首页 > 解决方案 > C# 从 SqliteConnection 获取 DbHandle

问题描述

我为 sqlite 创建了一个 C# 包装器,并使用它尝试执行创建插入查询。我需要使用我现有的 sqlite 连接,所以我编写了一个GetDbHandleFromConnection函数来获取dbHandle.

这是与 DbHandle 转换器的连接;

    public static IntPtr GetDbHandleFromConnection(SqliteConnection conn)
    {
        var sqlFieldValue = typeof(SqliteConnection)
            .GetField("_sql", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
            .GetValue(conn);

        var inner_sqlFieldValue = sqlFieldValue.GetType()
            .GetField("_sql", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
            .GetValue(sqlFieldValue);

        var handleFieldValue = inner_sqlFieldValue.GetType()
            .GetField("handle", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
            .GetValue(inner_sqlFieldValue);

        return (IntPtr)handleFieldValue;
    }

这就是我所说的;应用程序在创建表执行时停止,我找不到错误。

    public void Process()
    {
        SqliteConnection connection = new SqliteConnection("Data Source=" + DB_PATH + ";Pooling=False;");
        connection.Open();
        var dbHandle = GetDbHandleFromConnection(connection); // get DBhandle
        IntPtr err = IntPtr.Zero;
        // application stops here, without error;
        var x = UnsafeSqliteNativeMethods.sqlite3_exec(dbHandle, Encoding.UTF8.GetBytes("create table boo (id int, name varchar(255))"), IntPtr.Zero, IntPtr.Zero, out err);
        var y = UnsafeSqliteNativeMethods.sqlite3_exec(dbHandle, Encoding.UTF8.GetBytes("insert into boo values (1, 'Bob')"), IntPtr.Zero, IntPtr.Zero, out err);
        connection.Close();
    }

输出窗口: 在此处输入图像描述

我不能使用GetDbHandleFromConnection来转换SqliteConnection和使用它DbHandle吗?或者GetDbHandleFromConnection函数有什么问题吗?

感谢你的帮助!

标签: c#databasesqlite

解决方案


推荐阅读