在IIS上发布好了WCF之后,我一直在努力寻找除了XML外最简单的数据库。虽然对SQLite早有耳闻,今天听说android和ios里用的都是sqlite,今天来尝尝鲜

官网上有各种平台的版本,找到你需要的平台。如下

image

然后在平台下的各种版本中选一个,我们选32位.NET4.0的bundle版本:这里大家可以看到一个是bundle的,另一个是不带bundle的;bundle的表示System.Data.SQLite.dll里混合了SQLite.Interop.dll。

我们这里下载bundle混合版本的(如果下的是另一个版本,在项目中添加SQLite.Interop.dll会出错,如果不添加SQLite.Interop.dll也会保存)。

image

 

还有一项准备工作,下载一个工具:sqlitespy,用来操作sqlite数据库的。

 

工具都准备好了,就可以开始了

1. 用spy来创建个数据库

DROP TABLE [BOOK];
CREATE TABLE [Book](
[ID] INTEGER NOT NULL PRIMARY KEY autoincrement,
[BookName] VARCHAR(50) NOT NULL,
[Price] REAL NOT NULL
);

 

2.在vs里写好数据库操作类(写的比较简陋, 大家自行完善)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SQLite;

namespace SQLiteDemo
{

    public class SQLiteDatabase
    {
        String dbConnection;
        SQLiteConnection cnn;

        #region ctor
        /// <summary>
        ///     Default Constructor for SQLiteDatabase Class.
        /// </summary>
        public SQLiteDatabase()
        {
            dbConnection = "Data Source=recipes.s3db";
            cnn = new SQLiteConnection(dbConnection);
        }

        /// <summary>
        ///     Single Param Constructor for specifying the DB file.
        /// </summary>
        /// <param name="inputFile">The File containing the DB</param>
        public SQLiteDatabase(String inputFile)
        {
            dbConnection = String.Format("Data Source={0}", inputFile);
            cnn = new SQLiteConnection(dbConnection);
        }

        /// <summary>
        ///     Single Param Constructor for specifying advanced connection options.
        /// </summary>
        /// <param name="connectionOpts">A dictionary containing all desired options and their values</param>
        public SQLiteDatabase(Dictionary<String, String> connectionOpts)
        {
            String str = "";
            foreach (KeyValuePair<String, String> row in connectionOpts)
            {
                str += String.Format("{0}={1}; ", row.Key, row.Value);
            }
            str = str.Trim().Substring(0, str.Length - 1);
            dbConnection = str;
            cnn = new SQLiteConnection(dbConnection);
        }
        #endregion

        /// <summary>
        ///     Allows the programmer to run a query against the Database.
        /// </summary>
        /// <param name="sql">The SQL to run</param>
        /// <returns>A DataTable containing the result set.</returns>
        public DataTable GetDataTable(string sql)
        {
            DataTable dt = new DataTable();
            try
            {
                SQLiteConnection cnn = new SQLiteConnection(dbConnection);
                cnn.Open();
                SQLiteCommand mycommand = new SQLiteCommand(cnn);
                mycommand.CommandText = sql;
                SQLiteDataReader reader = mycommand.ExecuteReader();
                dt.Load(reader);
                reader.Close();
                cnn.Close();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return dt;
        }
        public DataTable GetDataTable(string sql, IList<SQLiteParameter> cmdparams)
        {
            DataTable dt = new DataTable();
            try
            {
                SQLiteConnection cnn = new SQLiteConnection(dbConnection);
                cnn.Open();
                SQLiteCommand mycommand = new SQLiteCommand(cnn);
                mycommand.CommandText = sql;
                mycommand.Parameters.AddRange(cmdparams.ToArray());
                mycommand.CommandTimeout = 180;
                SQLiteDataReader reader = mycommand.ExecuteReader();
                dt.Load(reader);
                reader.Close();
                cnn.Close();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            return dt;
        }

        /// <summary>
        ///     Allows the programmer to interact with the database for purposes other than a query.
        /// </summary>
        /// <param name="sql">The SQL to be run.</param>
        /// <returns>An Integer containing the number of rows updated.</returns>
        public bool ExecuteNonQuery(string sql)
        {
            bool successState = false;
            cnn.Open();
            using (SQLiteTransaction mytrans = cnn.BeginTransaction())
            {
                SQLiteCommand mycommand = new SQLiteCommand(sql, cnn);
                try
                {
                    mycommand.CommandTimeout = 180;
                    mycommand.ExecuteNonQuery();
                    mytrans.Commit();
                    successState = true;
                    cnn.Close();
                }
                catch (Exception e)
                {
                    mytrans.Rollback();
                }
                finally
                {
                    mycommand.Dispose();
                    cnn.Close();
                }
            }
            return successState;
        }

        public bool ExecuteNonQuery(string sql, IList<SQLiteParameter> cmdparams)
        {
            bool successState = false;
            cnn.Open();
            using (SQLiteTransaction mytrans = cnn.BeginTransaction())
            {
                SQLiteCommand mycommand = new SQLiteCommand(sql, cnn, mytrans);
                try
                {
                    mycommand.Parameters.AddRange(cmdparams.ToArray());
                    mycommand.CommandTimeout = 180;
                    mycommand.ExecuteNonQuery();
                    mytrans.Commit();
                    successState = true;
                    cnn.Close();
                }
                catch (Exception e)
                {
                    mytrans.Rollback();
                    throw e;
                }
                finally
                {
                    mycommand.Dispose();
                    cnn.Close();
                }
                
            }
            return successState;
        }

        /// <summary>
        ///     暂时用不到
        ///     Allows the programmer to retrieve single items from the DB.
        /// </summary>
        /// <param name="sql">The query to run.</param>
        /// <returns>A string.</returns>
        public string ExecuteScalar(string sql)
        {
            cnn.Open();
            SQLiteCommand mycommand = new SQLiteCommand(cnn);
            mycommand.CommandText = sql;
            object value = mycommand.ExecuteScalar();
            cnn.Close();
            if (value != null)
            {
                return value.ToString();
            }
            return "";
        }

        /// <summary>
        ///     Allows the programmer to easily update rows in the DB.
        /// </summary>
        /// <param name="tableName">The table to update.</param>
        /// <param name="data">A dictionary containing Column names and their new values.</param>
        /// <param name="where">The where clause for the update statement.</param>
        /// <returns>A boolean true or false to signify success or failure.</returns>
        public bool Update(String tableName, Dictionary<String, String> data, String where)
        {
            String vals = "";
            Boolean returnCode = true;
            if (data.Count >= 1)
            {
                foreach (KeyValuePair<String, String> val in data)
                {
                    vals += String.Format(" {0} = '{1}',", val.Key.ToString(), val.Value.ToString());
                }
                vals = vals.Substring(0, vals.Length - 1);
            }
            try
            {
                this.ExecuteNonQuery(String.Format("update {0} set {1} where {2};", tableName, vals, where));
            }
            catch
            {
                returnCode = false;
            }
            return returnCode;
        }
    }
}

 

3. 写好dal, 这里有个提示, id可以自增, 但是一定要插入null

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;

namespace SQLiteDemo
{
    public class BookDAL
    {
        SQLiteDatabase sqlExcute = new SQLiteDatabase();
        public bool Create(Book book)
        {
            try
            {

                var sql = "insert into Book values(@ID,@BookName,@Price);";
                var cmdparams = new List<SQLiteParameter>()
                {
                    new SQLiteParameter("ID", null),
                    new SQLiteParameter("BookName", book.BookName),
                    new SQLiteParameter("Price", book.Price)
                };
                return sqlExcute.ExecuteNonQuery(sql, cmdparams);
            }
            catch (Exception e)
            {
                //Do any logging operation here if necessary
                throw e;
                return false;
            }
        }
        public bool Update(Book book)
        {
            try
            {
                var sql = "update Book set BookName=@BookName,Price=@Price where ID=@ID;";
                var cmdparams = new List<SQLiteParameter>()
                {
                    new SQLiteParameter("ID", book.ID),
                    new SQLiteParameter("BookName", book.BookName),
                    new SQLiteParameter("Price", book.Price)
                };
                return sqlExcute.ExecuteNonQuery(sql, cmdparams);
            }
            catch (Exception)
            {
                //Do any logging operation here if necessary
                return false;
            }
        }
        public bool Delete(int ID)
        {
            try
            {
                using (SQLiteConnection conn = new SQLiteConnection("Data Source=e:\\test.db3"))
                {
                    conn.Open();
                    SQLiteCommand cmd = conn.CreateCommand();
                    cmd.CommandText = "delete from Book where ID=@ID;";
                    cmd.Parameters.Add(new SQLiteParameter("ID", ID));
                    int i = cmd.ExecuteNonQuery();
                    return i == 1;
                }
            }
            catch (Exception)
            {
                //Do any logging operation here if necessary
                return false;
            }
        }
        public Book GetbyID(int ID)
        {
            try
            {
                var sql = "select * from Book where ID=@ID;";
                var cmdparams = new List<SQLiteParameter>()
                {
                    new SQLiteParameter("ID", ID)
                };
                var dt = sqlExcute.GetDataTable(sql, cmdparams);
                if (dt.Rows.Count > 0)
                {
                    Book book = new Book();
                    book.ID = int.Parse(dt.Rows[0]["ID"].ToString());
                    book.BookName = dt.Rows[0]["BookName"].ToString();
                    book.Price = decimal.Parse(dt.Rows[0]["Price"].ToString());
                    return book;
                }
                else
                    return null;
            }
            catch (Exception)
            {
                //Do any logging operation here if necessary
                return null;
            }
        }
    }
}

 

4. 在console里写调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SQLite;

namespace SQLiteDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            BookDAL BookDAL = new SQLiteDemo.BookDAL();
            Book book = new Book();
            book.BookName = "第一本书";
            book.Price = 10.0m;
            BookDAL.Create(book);
            book.BookName = "第二本书";
            book.Price = 13.0m;
            BookDAL.Create(book);
            book = BookDAL.GetbyID(2);
            Console.WriteLine(book.ID + " " + book.BookName + " " + book.Price);
            book.Price = 11.1m;
            BookDAL.Update(book);
            book = BookDAL.GetbyID(2);
            Console.WriteLine(book.ID + " " + book.BookName + " " + book.Price);
            book = BookDAL.GetbyID(1);
            Console.WriteLine(book.ID + " " + book.BookName + " " + book.Price);

            Console.Read();
        }
    }

}

 

5.出来实例

image

 

http://system.data.sqlite.org/downloads/1.0.65.0/sqlite-netFx40-setup-x86-2010-1.0.65.0.exe

 

注意:


如果客户端调用出错,可能是数据库的位置错误,因为这里是相对bin/debug下的位置,最好放个固定的位置。

 

参考:


http://stackoverflow.com/questions/2605490/system-data-sqlite-net-4