public static int sqlite3_prepare_v2(
            DatabaseHandle db,
            string zSql,
            out StatementHandle ppStmt,
            out string pzTail)
        {
            int nByte;
            var zSqlPtr = MarshalEx.StringToHGlobalUTF8(zSql, out nByte);

            try
            {
                IntPtr pzTailPtr;
                var    rc = sqlite3_prepare_v2(db, zSqlPtr, nByte, out ppStmt, out pzTailPtr);
                pzTail = MarshalEx.PtrToStringUTF8(pzTailPtr);

                return(rc);
            }
            finally
            {
                if (zSqlPtr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(zSqlPtr);
                }
            }
        }
        public static object Read(SQLiteType sqliteType, StatementHandle handle, int ordinal)
        {
            Debug.Assert(handle != null && !handle.IsInvalid, "handle is null.");

            if (sqliteType == SQLiteType.Null
                || NativeMethods.sqlite3_column_type(handle, ordinal) == Constants.SQLITE_NULL)
            {
                return DBNull.Value;
            }

            switch (sqliteType)
            {
                case SQLiteType.Integer:
                    return NativeMethods.sqlite3_column_int64(handle, ordinal);

                case SQLiteType.Float:
                    return NativeMethods.sqlite3_column_double(handle, ordinal);

                case SQLiteType.Text:
                    return NativeMethods.sqlite3_column_text(handle, ordinal);

                default:
                    Debug.Assert(sqliteType == SQLiteType.Blob, "_sqliteType is not Blob.");
                    return NativeMethods.sqlite3_column_blob(handle, ordinal);
            }
        }
        public static int sqlite3_bind_blob(StatementHandle pStmt, int i, byte[] zData)
        {
            var zDataPtr = Marshal.AllocHGlobal(zData.Length);
            try
            {
                Marshal.Copy(zData, 0, zDataPtr, zData.Length);

                return sqlite3_bind_blob(pStmt, i, zDataPtr, zData.Length, Constants.SQLITE_TRANSIENT);
            }
            finally
            {
                Marshal.FreeHGlobal(zDataPtr);
            }
        }
 public static int sqlite3_bind_parameter_index(StatementHandle pStmt, string zName)
 {
     var ptr = MarshalEx.StringToHGlobalUTF8(zName);
     try
     {
         return sqlite3_bind_parameter_index(pStmt, ptr);
     }
     finally
     {
         if (ptr != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(ptr);
         }
     }
 }
        public static int sqlite3_bind_blob(StatementHandle pStmt, int i, byte[] zData)
        {
            var zDataPtr = Marshal.AllocHGlobal(zData.Length);

            try
            {
                Marshal.Copy(zData, 0, zDataPtr, zData.Length);

                return(sqlite3_bind_blob(pStmt, i, zDataPtr, zData.Length, Constants.SQLITE_TRANSIENT));
            }
            finally
            {
                Marshal.FreeHGlobal(zDataPtr);
            }
        }
 public static int sqlite3_bind_text(StatementHandle pStmt, int i, string zData)
 {
     int size;
     var ptr = MarshalEx.StringToHGlobalUTF8(zData, out size);
     try
     {
         return sqlite3_bind_text(pStmt, i, ptr, size - 1, Constants.SQLITE_TRANSIENT);
     }
     finally
     {
         if (ptr != IntPtr.Zero)
         {
             Marshal.FreeHGlobal(ptr);
         }
     }
 }
        public static int sqlite3_bind_parameter_index(StatementHandle pStmt, string zName)
        {
            var ptr = MarshalEx.StringToHGlobalUTF8(zName);

            try
            {
                return(sqlite3_bind_parameter_index(pStmt, ptr));
            }
            finally
            {
                if (ptr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(ptr);
                }
            }
        }
        public static byte[] sqlite3_column_blob(StatementHandle pStmt, int iCol)
        {
            var ptr = sqlite3_column_blob_raw(pStmt, iCol);

            if (ptr == IntPtr.Zero)
            {
                return(null);
            }

            var bytes = sqlite3_column_bytes(pStmt, iCol);

            var result = new byte[bytes];

            Marshal.Copy(ptr, result, 0, bytes);

            return(result);
        }
        public static int sqlite3_bind_text(StatementHandle pStmt, int i, string zData)
        {
            int size;
            var ptr = MarshalEx.StringToHGlobalUTF8(zData, out size);

            try
            {
                return(sqlite3_bind_text(pStmt, i, ptr, size - 1, Constants.SQLITE_TRANSIENT));
            }
            finally
            {
                if (ptr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(ptr);
                }
            }
        }
 public static extern int sqlite3_reset(StatementHandle pStmt);
 public static extern long sqlite3_column_int64(StatementHandle pStmt, int iCol);
 public static extern int sqlite3_column_type(StatementHandle pStmt, int iCol);
 private static extern IntPtr sqlite3_column_text_raw(StatementHandle pStmt, int iCol);
 private static extern IntPtr sqlite3_column_name_raw(StatementHandle pStmt, int N);
 public static extern int sqlite3_clear_bindings(StatementHandle pStmt);
 private static extern int sqlite3_bind_parameter_index(StatementHandle pStmt, IntPtr zName);
 public static extern int sqlite3_bind_double(StatementHandle pStmt, int i, double rValue);
 public static extern int sqlite3_stmt_readonly(StatementHandle pStmt);
 public static extern int sqlite3_stmt_busy(StatementHandle pStmt);
 public static extern int sqlite3_reset(StatementHandle pStmt);
 public static string sqlite3_column_text(StatementHandle pStmt, int iCol)
 {
     return MarshalEx.PtrToStringUTF8(sqlite3_column_text_raw(pStmt, iCol));
 }
        public static int sqlite3_prepare_v2(
            DatabaseHandle db,
            string zSql,
            out StatementHandle ppStmt,
            out string pzTail)
        {
            int nByte;
            var zSqlPtr = MarshalEx.StringToHGlobalUTF8(zSql, out nByte);
            try
            {
                IntPtr pzTailPtr;
                var rc = sqlite3_prepare_v2(db, zSqlPtr, nByte, out ppStmt, out pzTailPtr);
                pzTail = MarshalEx.PtrToStringUTF8(pzTailPtr);

                return rc;
            }
            finally
            {
                if (zSqlPtr != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(zSqlPtr);
                }
            }
        }
 public static extern int sqlite3_stmt_readonly(StatementHandle pStmt);
 public static extern int sqlite3_bind_int64(StatementHandle pStmt, int i, long iValue);
 public static extern int sqlite3_bind_int64(StatementHandle pStmt, int i, long iValue);
 private static extern int sqlite3_bind_text(StatementHandle pStmt, int i, IntPtr zData, int n, IntPtr xDel);
 public static extern int sqlite3_bind_null(StatementHandle pStmt, int i);
 private static extern int sqlite3_prepare_v2(
     DatabaseHandle db,
     IntPtr zSql,
     int nByte,
     out StatementHandle ppStmt,
     out IntPtr pzTail);
 private static extern int sqlite3_bind_parameter_index(StatementHandle pStmt, IntPtr zName);
 public static string sqlite3_column_name(StatementHandle pStmt, int N)
 {
     return(MarshalEx.PtrToStringUTF8(sqlite3_column_name_raw(pStmt, N)));
 }
 public static string sqlite3_column_name(StatementHandle pStmt, int N)
 {
     return MarshalEx.PtrToStringUTF8(sqlite3_column_name_raw(pStmt, N));
 }
 public static string sqlite3_column_text(StatementHandle pStmt, int iCol)
 {
     return(MarshalEx.PtrToStringUTF8(sqlite3_column_text_raw(pStmt, iCol)));
 }
 private static extern int sqlite3_bind_text(StatementHandle pStmt, int i, IntPtr zData, int n, IntPtr xDel);
 private static extern int sqlite3_prepare_v2(
     DatabaseHandle db,
     IntPtr zSql,
     int nByte,
     out StatementHandle ppStmt,
     out IntPtr pzTail);
 private static extern IntPtr sqlite3_column_name_raw(StatementHandle pStmt, int N);
 public static extern double sqlite3_column_double(StatementHandle pStmt, int iCol);
 public static extern int sqlite3_clear_bindings(StatementHandle pStmt);
 public static extern int sqlite3_stmt_busy(StatementHandle pStmt);
 private static extern IntPtr sqlite3_column_blob_raw(StatementHandle pStmt, int iCol);
 public static extern int sqlite3_bind_double(StatementHandle pStmt, int i, double rValue);
 private static extern int sqlite3_column_bytes(StatementHandle pStmt, int iCol);
 public static extern int sqlite3_bind_null(StatementHandle pStmt, int i);
 private static extern int sqlite3_column_bytes(StatementHandle pStmt, int iCol);
 public static extern int sqlite3_column_count(StatementHandle pStmt);
 public static extern int sqlite3_column_count(StatementHandle pStmt);
 public static extern double sqlite3_column_double(StatementHandle pStmt, int iCol);
 public static extern long sqlite3_column_int64(StatementHandle pStmt, int iCol);
        public static byte[] sqlite3_column_blob(StatementHandle pStmt, int iCol)
        {
            var ptr = sqlite3_column_blob_raw(pStmt, iCol);
            if (ptr == IntPtr.Zero)
            {
                return null;
            }

            var bytes = sqlite3_column_bytes(pStmt, iCol);

            var result = new byte[bytes];
            Marshal.Copy(ptr, result, 0, bytes);

            return result;
        }
 public static extern int sqlite3_column_type(StatementHandle pStmt, int iCol);