SQLite数据访问类(.NETCF)

最近我在使用 SQLite 数据库开发 Windows Mobile 项目,顺便把 .NET Compact Framework 版的 Data Access Application Block (SQL Server Compact) 转成 SQLite 版,觉得挺好用,跟大家分享!

 

代码
using System;
using System.Data.Common;
using System.Data;

namespace System.Data.SQLite
{
    
/// <summary>
    
///        This class provides the foundation for simplified access to a database. It contains a number
    
///        of helper methods that make working with the database easier.
    
/// </summary>
    public class SQLiteDatabase : IDisposable
    {
        
private string connectionString;
        
private SQLiteConnection databaseConnection;

        
private SQLiteDatabase() { }

        
/// <summary>
        
///        The constructor.
        
/// </summary>
        
/// <param name="connectionString">
        
///        The connection string that will be used to connect to the database.
        
/// </param>
        public SQLiteDatabase(string connectionString)
        {
            Guard.ArgumentNotNullOrEmptyString(connectionString, 
"connectionString");

            
this.connectionString = connectionString;

            CreateConnection();
        }

        
/// <summary>
        
///        Closes the current connection. You should call this method when you are completely
        
///        done using this database instance. Methods will fail after you've disposed of this
        
///        instance.
        
/// </summary>
        public void Dispose()
        {
            
if (databaseConnection != null)
            {
                databaseConnection.Close();            
// .NET documents recommend closing instead of disposing connection
                databaseConnection = null;
            }
        }

        
/// <summary>
        
///        Creates a new, unopened connection instance for this database.
        
/// </summary>
        
/// <returns>
        
/// An unopened <see cref="SQLiteConnection"/> for this database.
        
/// </returns>
        
/// <seealso cref="SQLiteConnection"/>        
        private void CreateConnection()
        {
            
if (databaseConnection == null)
            {
                databaseConnection 
= new SQLiteConnection();
                databaseConnection.ConnectionString 
= ConnectionString;
            }
        }

        
/// <summary>
        
///        Gets the connection string for this instance.
        
/// </summary>
        public string ConnectionString
        {
            
get { return connectionString; }
        }

        
/// <summary>
        
///        Builds a value parameter name for the current database by ensuring there is an '@' at the
        
///        start of the name.
        
/// </summary>
        
/// <param name="name">The name of the parameter.</param>
        
/// <returns>A correctly formated parameter name, which starts with an '@'.</returns>
        public string BuildParameterName(string name)
        {
            Guard.ArgumentNotNullOrEmptyString(name, 
"name");

            
if (name[0!= '@')
                
return "@" + name;
            
else
                
return name;
        }

        
/// <summary>
        
///        Creates a new parameter and sets the name of the parameter.
        
/// </summary>
        
/// <param name="name">The name of the parameter.</param>
        
/// <returns>
        
///        A new <see cref="SQLiteParameter"/> instance of the correct type for this database.</returns>
        
/// <remarks>
        
///        The database will automatically add the correct prefix, like "@" for SQLite, to the
        
///        parameter name. In other words, you can just supply the name without a prefix.
        
/// </remarks>
        public SQLiteParameter CreateParameter(string name)
        {
            SQLiteParameter parameter 
= new SQLiteParameter();
            parameter.ParameterName 
= BuildParameterName(name);
            
return parameter;
        }

        
/// <summary>
        
///        Creates a new parameter and sets the name of the parameter.
        
/// </summary>
        
/// <param name="name">The name of the parameter.</param>
        
/// <param name="value">
        
///        The value you want assigned to thsi parameter. A null value will be converted to
        
///        a <see cref="DBNull"/> value in the parameter.
        
/// </param>
        
/// <returns>
        
///        A new <see cref="SQLiteParameter"/> instance of the correct type for this database.</returns>
        
/// <remarks>
        
///        The database will automatically add the correct prefix, like "@" for SQLite, to the
        
///        parameter name. In other words, you can just supply the name without a prefix.
        
/// </remarks>
        public SQLiteParameter CreateParameter(string name, object value)
        {
            SQLiteParameter param 
= CreateParameter(name);
            param.Value 
= (value == null? DBNull.Value : value;
            
return param;
        }

        
/// <summary>
        
///        Creates a new parameter and sets the name of the parameter.
        
/// </summary>
        
/// <param name="name">The name of the parameter.</param>
        
/// <param name="type">The type of the parameter.</param>
        
/// <param name="size">The size of this parameter.</param>
        
/// <param name="value">
        
///        The value you want assigned to this parameter. A null value will be converted to
        
///        a <see cref="DBNull"/> value in the parameter.
        
/// </param>
        
/// <returns>
        
///        A new <see cref="SQLiteParameter"/> instance of the correct type for this database.</returns>
        
/// <remarks>
        
///        The database will automatically add the correct prefix, like "@" for SQLite, to the
        
///        parameter name. In other words, you can just supply the name without a prefix.
        
/// </remarks>
        public SQLiteParameter CreateParameter(string name, DbType type, int size, object value)
        {
            SQLiteParameter param 
= CreateParameter(name);
            param.DbType 
= type;
            param.Size 
= size;
            param.Value 
= (value == null? DBNull.Value : value;
            
return param;
        }

        
/// <summary>
        
///        Executes an SQL query with an optional set of parameters.
        
/// </summary>
        
/// <param name="command">The command to execute.</param>
        
/// <param name="parameters">Zero or more parameters for the query.</param>
        
/// <returns>The number of rows affected.</returns>
        public int ExecuteNonQuery(SQLiteCommand command, params SQLiteParameter[] parameters)
        {
            Guard.ArgumentNotNull(command, 
"Command");
            
int result;
            SQLiteConnection connection 
= GetConnection();
            PrepareCommand(command, connection, parameters);
            result 
= command.ExecuteNonQuery();
            
return result;
        }

        
/// <summary>
        
///        Executes an SQL query with an optional set of parameters.
        
/// </summary>
        
/// <param name="sqlCommand">The SQL statement to execute.</param>
        
/// <param name="parameters">Zero or more parameters for the query.</param>
        
/// <returns>The number of rows affected.</returns>
        public int ExecuteNonQuery(string sqlCommand, params SQLiteParameter[] parameters)
        {
            Guard.ArgumentNotNull(sqlCommand, 
"sqlCommand");

            
using (SQLiteCommand command = new SQLiteCommand())
            {
                command.CommandText 
= sqlCommand;
                
return ExecuteNonQuery(command, parameters);
            }
        }

        
/// <summary>
        
///        Execute a command and return a <see cref="SQLiteDataReader"/> that contains the rows
        
///        returned.
        
/// </summary>
        
/// <param name="command">The command to execute.</param>
        
/// <param name="parameters">Zero or more parameters for the query.</param>
        
/// <returns><see cref="SQLiteDataReader"/> that contains the rows returned by the query.</returns>
        public SQLiteDataReader ExecuteReader(SQLiteCommand command, params SQLiteParameter[] parameters)
        {
            SQLiteDataReader result;
            Guard.ArgumentNotNull(command, 
"command");

            SQLiteConnection connection 
= GetConnection();
            PrepareCommand(command, connection, parameters);

            result 
= command.ExecuteReader();
            
return result;
        }

        
/// <summary>
        
///        Execute a command and return a <see cref="SQLiteDataReader"/> that contains the rows
        
///        returned.
        
/// </summary>
        
/// <param name="sqlCommand">The SQL query to execute.</param>
        
/// <param name="parameters">Zero or more parameters for the query.</param>
        
/// <returns><see cref="SQLiteDataReader"/> that contains the rows returned by the query.</returns>
        public SQLiteDataReader ExecuteReader(string sqlCommand, params SQLiteParameter[] parameters)
        {
            Guard.ArgumentNotNullOrEmptyString(sqlCommand, 
"sqlCommand");

            
using (SQLiteCommand command = new SQLiteCommand())
            {
                command.CommandText 
= sqlCommand;
                
return ExecuteReader(command, parameters);
            }
        }

        
/// <summary>
        
/// <para>
        
///        Executes the <paramref name="command"/> and returns the first column of the first
        
///        row in the result set returned by the query. Extra columns or rows are ignored.
        
/// </para>
        
/// </summary>
        
/// <param name="command">
        
/// <para>
        
///        The command that contains the query to execute.
        
/// </para>
        
/// </param>
        
/// <param name="parameters">Zero or more parameters for the query.</param>
        
/// <returns>
        
/// <para>
        
///        The first column of the first row in the result set.
        
/// </para>
        
/// </returns>
        
/// <seealso cref="ISQLiteCommand.ExecuteScalar"/>
        public object ExecuteScalar(SQLiteCommand command, params SQLiteParameter[] parameters)
        {
            
object result;
            Guard.ArgumentNotNull(command, 
"command");

            SQLiteConnection connection 
= GetConnection();
            PrepareCommand(command, connection, parameters);
            result 
= command.ExecuteScalar();
            
return result;
        }

        
/// <summary>
        
///        Executes the <paramref name="command"/> and returns the first column of the first
        
///        row in the result set returned by the query. Extra columns or rows are ignored.
        
/// </summary>
        
/// <param name="sqlCommand">The SQL statement to execute.</param>
        
/// <param name="parameters">Zero or more parameters for the query.</param>
        
/// <returns>
        
/// <para>
        
///        The first column of the first row in the result set.
        
/// </para>
        
/// </returns>
        
/// <seealso cref="ISQLiteCommand.ExecuteScalar"/>
        public object ExecuteScalar(string sqlCommand, params SQLiteParameter[] parameters)
        {
            Guard.ArgumentNotNull(sqlCommand, 
"sqlCommand");

            
using (SQLiteCommand command = new SQLiteCommand())
            {
                command.CommandText 
= sqlCommand;
                
return ExecuteScalar(command, parameters);
            }
        }

        
/// <summary>
        
/// <para>Returns the shared connection, and opens it the first startTime.</para>
        
/// </summary>
        
/// <returns>The opened connection.</returns>
        public SQLiteConnection GetConnection()
        {
            
if (databaseConnection.State != ConnectionState.Open)
                databaseConnection.Open();

            
return databaseConnection;
        }

        
/// <summary>
        
/// Closes the shared connection.
        
/// </summary>
        public void CloseConnection()
        {
            
if (databaseConnection.State != ConnectionState.Closed)
            {
                databaseConnection.Close();
            }
        }

        
/// <summary>
        
/// <para>
        
///        Assigns a <paramref name="connection"/> to the <paramref name="command"/> and 
        
///        discovers parameters if needed.
        
/// </para>
        
/// </summary>
        
/// <param name="command">The command that contains the query to prepare.</param>
        
/// <param name="connection">The connection to assign to the command.</param>
        private static void PrepareCommand(SQLiteCommand command, SQLiteConnection connection)
        {
            Guard.ArgumentNotNull(command, 
"command");
            Guard.ArgumentNotNull(connection, 
"connection");

            command.Connection 
= connection;
        }

        
/// <summary>
        
///        Prepares a <see cref="SQLiteCommand"/> object for use. This involves setting the connection
        
///        and adding any parameters to the command.
        
/// </summary>
        
/// <param name="command">The command object you want prepared.</param>
        
/// <param name="connection">The connection to use with the command.</param>
        
/// <param name="parameters">Zero or more parameters to add to the command.</param>
        private void PrepareCommand(SQLiteCommand command, SQLiteConnection connection, params SQLiteParameter[] parameters)
        {
            Guard.ArgumentNotNull(command, 
"command");
            Guard.ArgumentNotNull(connection, 
"connection");

            command.Connection 
= connection;

            
if (parameters != null)
            {
                
for (int i = 0; i < parameters.Length; i++)
                    command.Parameters.Add(parameters[i]);
            }
        }

        
/// <summary>
        
///        Checks to see if a table exists in the open database.
        
/// </summary>
        
/// <param name="tableName">Name of the table.</param>
        
/// <returns>true if the table exists, otherwise false.</returns>
        public bool TableExists(string tableName)
        {
            Guard.ArgumentNotNullOrEmptyString(tableName, 
"tableName");

            
string sql = "SELECT name FROM sqlite_master WHERE name=@TableName";

            SQLiteParameter param 
= CreateParameter("@TableName", DbType.String, 512, tableName);
            SQLiteDataReader rdr 
= ExecuteReader(sql, param);
            
if (rdr.HasRows)
                
return true;
            
else
                
return false;
        }

        
/// <summary>
        
///        This is a simple helper method that will convert a DBNull value into
        
///        a null value.
        
/// </summary>
        
/// <param name="value">The value you want to check for DBNull</param>
        
/// <returns>Null if <paramref name="value"/> is DBNull.Value, or <paramref name="value"/>.</returns>
        public static object GetNullable(object value)
        {
            
return (value is DBNull) ? null : value;
        }

        
/// <summary>
        
/// Common guard clauses
        
/// </summary>
        internal static class Guard
        {
            
/// <summary>
            
/// Checks an argument to ensure it isn't null
            
/// </summary>
            
/// <param name="argumentValue">The argument value to check.</param>
            
/// <param name="argumentName">The name of the argument.</param>
            public static void ArgumentNotNull(object argumentValue, string argumentName)
            {
                
if (argumentValue == null)
                    
throw new ArgumentNullException(argumentName);
            }

            
/// <summary>
            
/// Checks a string argument to ensure it isn't null or empty
            
/// </summary>
            
/// <param name="argumentValue">The argument value to check.</param>
            
/// <param name="argumentName">The name of the argument.</param>
            public static void ArgumentNotNullOrEmptyString(string argumentValue, string argumentName)
            {
                ArgumentNotNull(argumentValue, argumentName);

                
if (argumentValue.Trim().Length == 0)
                    
throw new ArgumentException("The string cannot be empty.", argumentName);
            }
        }
    }
}

 

 

这里下载源码:https://files.cnblogs.com/bobli/SQLiteDatabase_src.rar

 

作者:黎波
博客:http://bobli.cnblogs.com/
日期:2011年1月4日

posted @ 2011-01-04 22:34  黎波  阅读(3081)  评论(4编辑  收藏  举报