System.EntryPointNotFoundException: Unable to find an entry point named 'sqlite3_column_origin_name'

本文介绍在Android真机上使用SQLite时遇到System.EntryPointNotFoundException异常的解决方案。由于libsqlite.so缺少对sqlite3_column_origin_name()的支持,作者提供了一种替代SqliteDataAdapter的方法,通过自定义函数QueryDataSet和ToTable,成功构造DataTable并避免了该异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

System.EntryPointNotFoundException: Unable to find an entry point named 'sqlite3_column_origin_name' in 'sqlite3'
运行在android真机上后使用读取sqlite出现以上错误
 

最后发现是在android里libsqlite.so不包含对sqlite3_column_origin_name()方法的支持,所以在使用System.Data.DataTable会出现问题,应该是我使用的版本过低的情况,可以使用最新版的尝试.

不过我使用了另一种方法
我修复之前是使用了这种方法来返回一个DataTable

public DataTable QueryDataSet(string queryString)
    {
        DataSet ds = new DataSet();
        try
        {
            lock (this)
            {
                Open();
                SqliteDataAdapter da = new SqliteDataAdapter(queryString, _dbConnection); //SqliteConnection _dbConnection;  当前使用数据库连接定义
                da.Fill(ds); 
            }
        }
        catch (Exception ex)
        {
            Debug.LogError(ex);
            Debug.LogError("此时是错误的数据指令为:" + queryString);           
        }
        finally
        {
            AutoClose();
        }
        if (ds.Tables.Count <= 0)
        {
            return new DataTable();
        }
        return ds.Tables[0];
    }

现在只能去舍弃SqliteDataAdapter来自己构造一个DataTable来避免sqlite3_column_origin_name()

 

public DataTable QueryDataSet(string queryString)
    {
        //DataSet ds = new DataSet();
        DataTable dt = null;
        try
        {
            lock (this)
            {
                Open();
                //SqliteDataAdapter da = new SqliteDataAdapter(queryString, _dbConnection);
                //da.Fill(ds);
                using (SqliteCommand dbCommand = _dbConnection.CreateCommand())
                {
                    dbCommand.CommandText = queryString;
                    using (SqliteDataReader dataReader = dbCommand.ExecuteReader())
                    {
                        dt = ToTable(dataReader);
                    }                    
                }                
            }
        }
        catch (Exception ex)
        {
            Debug.LogError(ex);
            Debug.LogError("此时是错误的数据指令为:" + queryString);
        }
        finally
        {
            AutoClose();
        }
        
        return dt;
    }


   private DataTable ToTable(SqliteDataReader reader)
    {
        DataTable dt = new DataTable();
        
        for(int i = 0; i < reader.FieldCount; i++)
        {
            string name = reader.GetName(i);
            Type t = reader.GetFieldType(i);
            dt.Columns.Add(reader.GetName(i),t);
        }

        while (reader.Read())
        {
            DataRow dr = dt.NewRow();
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                if (reader.IsDBNull(i))
                {
                    dr[i] = DBNull.Value;
                    continue;
                }
                object val = reader[i];
                if(val.GetType()!= dt.Columns[i].DataType)
                {
                    val = Convert.ChangeType(val,dt.Columns[i].DataType);
                }
                dr[i] = val;
            }
            dt.Rows.Add(dr);
        }
        return dt;
    }


经过测试使用此方法没有问题
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值