posts - 6, comments - 24, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

SQLite访问封装类

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

#1楼  回复 引用 查看   

2009-08-31 20:15 by egmkang      
习惯不错哈
我的那个本来就是demo一般的,毕竟公司还没用.

#2楼  回复 引用 查看   

2009-09-01 09:59 by egmkang      
ExecuteNonQueryWithTrans
你这个不对的.
Transaction是说多个sql一起被执行,或者一起不被执行.
你这个只执行一个.

#3楼[楼主]  回复 引用 查看   

2009-09-01 16:52 by 春之痕      
确实是不对,需要修改,谢谢:)

#4楼[楼主]  回复 引用 查看   

2009-09-03 09:58 by 春之痕      
已经修改了ExecuteNonQueryWithTrans,并且提供一个“取SQLite连接”的方法。要取得SQLiteConnect事务,请使用SQLiteHelper.GetConnection().BeginTransaction()语句。

#5楼  回复 引用 查看   

2010-01-06 13:52 by chunchill      
@春之痕
很凑巧,我之前也写了一个SQLITE的类,但是没有用到单例做,呵呵,看了你写的后,我改造了我的操作类,我的项目中由于是多线程同时操作数据库,我为每个线程都开一个连接.这是我的访问类,如果有问题,大家可以一起讨论博文地址

#6楼  回复 引用 查看   

2010-03-23 17:44 by to be or not      
ExecuteNonQueryWithTrans 没看见这个方法

#7楼  回复 引用 查看   

2010-03-24 16:08 by to be or not      
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;
}

#8楼  回复 引用 查看   

2010-08-12 11:21 by 瑞雪年      
推荐一个可用在wm下的可访问sqlite的数据组件:http://www.cnblogs.com/zhongzf/archive/2010/02/26/1674303.html

#9楼  回复 引用 查看   

2010-09-16 14:04 by 大铁片蕨      
留名 赞一个

#10楼  回复 引用 查看   

2010-12-30 17:58 by 一只笨鸟      
你好,我在项目中使用时Insert出现如下错误
SQLite error
Insufficient parameters supplied to the command
请问有遇见过吗