Posted on 2009-08-31 19:16
春之痕 阅读(2133)
评论(10) 编辑 收藏
SQLite作为windows mobile的数据库,是一种不错的选择。SQLite的下载地址为:
SQLite,SQLite的ADO.net Provider下载地址为:
System.Data.SQLite ,在发布程序时,请别忘记拷贝SQLite.Interop.065.DLL、system.data.sqlite.dll两个文件到安装目录下。
本文非原创,而是参考egmkang撰写的
WM下访问SQLite(一种替代SQL CE的解决方案) ,并根据我自己的编程需要和习惯做了少许修改,错误在所难免。下面实现的是一个SQLiteHelper封装类:
using System.Data;
using System.Data.SQLite;
using System.IO;

namespace MyHelper.DataAccess


{
public class SQLiteHelper

{
private static string password = "***"; //请修改***为实际密码
private static string dbFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()
.GetName().CodeBase) + "\\***.db"; //请修改***为实际SQLite数据库名

private static string connectString = string.Format("Data Source =\"
{0}\"", dbFilePath, password);
private static SQLiteConnection myConnect = new SQLiteConnection(connectString);


/**//// <summary>
/// 取当前SQLite连接
/// </summary>
/// <returns>当前SQLite连接</returns>
public static SQLiteConnection GetConnection()

{
return myConnect;
}


/**//// <summary>
/// 执行SQL语句,返回受影响的行数
/// </summary>
/// <param name="commandString">SQL语句</param>
/// <param name="parameters">SQL语句参数</param>
/// <returns>受影响的行数</returns>
public static int ExecuteNonQuery(string commandString, params SQLiteParameter[] parameters)

{
int result = 0;
using (SQLiteCommand command = new SQLiteCommand())

{
PrepareCommand(command, null, commandString, parameters);
result = command.ExecuteNonQuery();
command.Parameters.Clear();
}
return result;
}


/**//// <summary>
/// 执行带事务的SQL语句,返回受影响的行数
/// </summary>
/// <param name="transaction">SQL事务</param>
/// <param name="commandString">SQL语句</param>
/// <param name="parameters">SQL语句参数</param>
/// <returns>受影响的行数</returns>
public static int ExecuteNonQuery(SQLiteTransaction transaction, string commandString,
params SQLiteParameter[] parameters)

{
int result = 0;
using (SQLiteCommand command = new SQLiteCommand())

{
PrepareCommand(command, transaction, commandString, parameters);
result = command.ExecuteNonQuery();
command.Parameters.Clear();
}
return result;
}


/**//// <summary>
/// 执行查询,并返回结果集的第一行第一列的值,忽略其它所有的行和列
/// </summary>
/// <param name="commandString">SQL语句</param>
/// <param name="parameters">SQL语句参数</param>
/// <returns>第一行第一列的值</returns>
public static object ExecuteScalar(string commandString, params SQLiteParameter[] parameters)

{
object result;
using (SQLiteCommand command = new SQLiteCommand())

{
PrepareCommand(command, null, commandString, parameters);
result = command.ExecuteScalar();
}
return result;
}


/**//// <summary>
/// 执行SQL语句,返回结果集的DataReader
/// </summary>
/// <param name="commandString">SQL语句</param>
/// <param name="parameters">SQL语句参数</param>
/// <returns>结果集的DataReader</returns>
public static SQLiteDataReader ExecuteReader(string commandString, params SQLiteParameter[] parameters)

{
SQLiteCommand command = new SQLiteCommand();
try

{
PrepareCommand(command, null, commandString, parameters);
SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
command.Parameters.Clear();
return reader;
}
catch

{
throw;
}
}


/**//// <summary>
/// 预处理Command对象,数据库链接,事务,需要执行的对象,参数等的初始化
/// </summary>
/// <param name="command">Command对象</param>
/// <param name="transaction">transaction对象</param>
/// <param name="commandString">SQL语句</param>
/// <param name="parameters">SQL语句参数</param>
private static void PrepareCommand(SQLiteCommand command, SQLiteTransaction transaction,
string commandString, params SQLiteParameter[] parameters)

{
if (myConnect.State != ConnectionState.Open)
myConnect.Open();

command.Connection = myConnect;
command.CommandText = commandString;

if (transaction != null)
command.Transaction = transaction;
if (parameters != null && parameters.Length > 0)

{
command.Parameters.AddRange(parameters);
}
}
}
}
为了提高效率,我将数据库连接修改为长连接。这样,只有第一次连接时会比较耗时,以后的操作就比较快了。如果本文有错误的地方,请大家参考egmkang原文。
Feedback
习惯不错哈
我的那个本来就是demo一般的,毕竟公司还没用.
ExecuteNonQueryWithTrans
你这个不对的.
Transaction是说多个sql一起被执行,或者一起不被执行.
你这个只执行一个.
已经修改了ExecuteNonQueryWithTrans,并且提供一个“取SQLite连接”的方法。要取得SQLiteConnect事务,请使用SQLiteHelper.GetConnection().BeginTransaction()语句。
@春之痕
很凑巧,我之前也写了一个SQLITE的类,但是没有用到单例做,呵呵,看了你写的后,我改造了我的操作类,我的项目中由于是多线程同时操作数据库,我为每个线程都开一个连接.这是我的访问类,如果有问题,大家可以一起讨论博文地址
ExecuteNonQueryWithTrans 没看见这个方法
if (myConnect.State != ConnectionState.Open)
myConnect.Open();
command.Connection = myConnect;
这个改成 command.Connection = GetConnection();
public static SQLiteConnection GetConnection()
{
return myConnect;
}
改成
public static SQLiteConnection GetConnection()
{
if (myConnect.State != ConnectionState.Open)
myConnect.Open();
return myConnect;
}
你好,我在项目中使用时Insert出现如下错误
SQLite error
Insufficient parameters supplied to the command
请问有遇见过吗