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;
}
经过测试使用此方法没有问题