C# 使用Mono.SQLite進行跨平臺開發

SQLite安裝

1. windows安裝

1. 進入官網下載最新的SQLite版本,找到:sqlite-tools-osx-x86-3150100.zip。[不區分64位和32位]

http://www.sqlite.org/download.html

2. 設置環境變量

將下載的文件解壓到特定的目錄,並在windows上設置環境變量目錄!

3. 打開cmd,執行如下命令進行安裝配置調試:

sqlite3 test1;
create table person(name varchar(30),age int);
insert into person values ('張三',23);
select * from person;

2. linux安裝

方法一:

wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gz
tar xvzf sqlite-autoconf-3070500.tar.gz
cd sqlite-autoconf-3070500
./configure
make
sudo make install

方法二:

sudo yum install sqlite-devel

方法三:

sudo gem install sqlite3-ruby

C# 公共代碼實現類

1. Nuget 引入Mono.Data.SQLite 文件!

2 . 公共代碼類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Mono.Data.Sqlite;
using System.Data;
using System.Collections;
using System.Configuration;

namespace DAL
{
    /// <summary>
    /// 數據訪問基礎類(基於SQLite)
    /// 可以用戶可以修改滿足自己項目的需要。
    /// </summary>
    public abstract class DbHelperSQLite
    {
        //數據庫連接字符串(web.config來配置),可以動態更改connectionString支持多數據庫.    
        public static string connectionString =ConfigurationManager.AppSettings["dbstring"];
        public DbHelperSQLite()
        {
        }


        #region 公用方法

        public static int GetMaxID(string FieldName, string TableName)
        {
            string strsql = "select max(" + FieldName + ")+1 from " + TableName;
            object obj = GetSingle(strsql);
            if (obj == null)
            {
                return 1;
            }
            else
            {
                return int.Parse(obj.ToString());
            }
        }
        public static bool Exists(string strSql)
        {
            object obj = GetSingle(strSql);
            int cmdresult;
            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        public static bool Exists(string strSql, params SqliteParameter[] cmdParms)
        {
            object obj = GetSingle(strSql, cmdParms);
            int cmdresult;
            if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
            {
                cmdresult = 0;
            }
            else
            {
                cmdresult = int.Parse(obj.ToString());
            }
            if (cmdresult == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        #endregion

        #region  執行簡單SQL語句

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數
        /// </summary>
        /// <param name="SQLString">SQL語句</param>
        /// <returns>影響的記錄數</returns>
        public static int ExecuteSql(string SQLString)
        {

            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                using (SqliteCommand cmd = new SqliteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (SqliteException E)
                    {
                        connection.Close();
                        throw new Exception(E.Message);
                    }
                }
            }
        }

        /// <summary>
        /// 執行多條SQL語句,實現數據庫事務。
        /// </summary>
        /// <param name="SQLStringList">多條SQL語句</param>    
        public static void ExecuteSqlTran(ArrayList SQLStringList)
        {
            using (SqliteConnection conn = new SqliteConnection(connectionString))
            {
                conn.Open();
                SqliteCommand cmd = new SqliteCommand();
                cmd.Connection = conn;
                SqliteTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                }
                catch (SqliteException E)
                {
                    tx.Rollback();
                    throw new Exception(E.Message);
                }
            }
        }
        /// <summary>
        /// 執行帶一個存儲過程參數的的SQL語句。
        /// </summary>
        /// <param name="SQLString">SQL語句</param>
        /// <param name="content">參數內容,比如一個字段是格式複雜的文章,有特殊符號,可以通過這個方式添加</param>
        /// <returns>影響的記錄數</returns>
        public static int ExecuteSql(string SQLString, string content)
        {
            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                SqliteCommand cmd = new SqliteCommand(SQLString, connection);
                SqliteParameter myParameter = new SqliteParameter("@content", DbType.String);
                myParameter.Value = content;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (SqliteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }
        /// <summary>
        /// 向數據庫裏插入圖像格式的字段(和上面情況類似的另一種實例)
        /// </summary>
        /// <param name="strSQL">SQL語句</param>
        /// <param name="fs">圖像字節,數據庫的字段類型爲image的情況</param>
        /// <returns>影響的記錄數</returns>
        public static int ExecuteSqlInsertImg(string strSQL, byte[] fs)
        {
            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                SqliteCommand cmd = new SqliteCommand(strSQL, connection);
                SqliteParameter myParameter = new SqliteParameter("@fs", DbType.Binary);
                myParameter.Value = fs;
                cmd.Parameters.Add(myParameter);
                try
                {
                    connection.Open();
                    int rows = cmd.ExecuteNonQuery();
                    return rows;
                }
                catch (SqliteException E)
                {
                    throw new Exception(E.Message);
                }
                finally
                {
                    cmd.Dispose();
                    connection.Close();
                }
            }
        }

        /// <summary>
        /// 執行一條計算查詢結果語句,返回查詢結果(object)。
        /// </summary>
        /// <param name="SQLString">計算查詢結果語句</param>
        /// <returns>查詢結果(object)</returns>
        public static object GetSingle(string SQLString)
        {
            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                using (SqliteCommand cmd = new SqliteCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        object obj = cmd.ExecuteScalar();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (SqliteException e)
                    {
                        connection.Close();
                        throw new Exception(e.Message);
                    }
                }
            }
        }
        /// <summary>
        /// 執行查詢語句,返回SqliteDataReader
        /// </summary>
        /// <param name="strSQL">查詢語句</param>
        /// <returns>SqliteDataReader</returns>
        public static SqliteDataReader ExecuteReader(string strSQL)
        {
            SqliteConnection connection = new SqliteConnection(connectionString);
            SqliteCommand cmd = new SqliteCommand(strSQL, connection);
            try
            {
                connection.Open();
                SqliteDataReader myReader = cmd.ExecuteReader();
                return myReader;
            }
            catch (SqliteException e)
            {
                throw new Exception(e.Message);
            }

        }
        /// <summary>
        /// 執行查詢語句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查詢語句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString)
        {
            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                DataSet ds = new DataSet();
                try
                {
                    connection.Open();
                    SqliteDataAdapter command = new SqliteDataAdapter(SQLString, connection);
                    command.Fill(ds, "ds");
                }
                catch (SqliteException ex)
                {
                    throw new Exception(ex.Message);
                }
                return ds;
            }
        }


        #endregion

        #region 執行帶參數的SQL語句

        /// <summary>
        /// 執行SQL語句,返回影響的記錄數
        /// </summary>
        /// <param name="SQLString">SQL語句</param>
        /// <returns>影響的記錄數</returns>
        public static int ExecuteSql(string SQLString, params SqliteParameter[] cmdParms)
        {
            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                using (SqliteCommand cmd = new SqliteCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        return rows;
                    }
                    catch (SqliteException E)
                    {
                        throw new Exception(E.Message);
                    }
                }
            }
        }


        /// <summary>
        /// 執行多條SQL語句,實現數據庫事務。
        /// </summary>
        /// <param name="SQLStringList">SQL語句的哈希表(key爲sql語句,value是該語句的SqliteParameter[])</param>
        public static void ExecuteSqlTran(Hashtable SQLStringList)
        {
            using (SqliteConnection conn = new SqliteConnection(connectionString))
            {
                conn.Open();
                using (SqliteTransaction trans = conn.BeginTransaction())
                {
                    SqliteCommand cmd = new SqliteCommand();
                    try
                    {
                        //循環
                        foreach (DictionaryEntry myDE in SQLStringList)
                        {
                            string cmdText = myDE.Key.ToString();
                            SqliteParameter[] cmdParms = (SqliteParameter[])myDE.Value;
                            PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                            int val = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();

                            trans.Commit();
                        }
                    }
                    catch
                    {
                        trans.Rollback();
                        throw;
                    }
                }
            }
        }


        /// <summary>
        /// 執行一條計算查詢結果語句,返回查詢結果(object)。
        /// </summary>
        /// <param name="SQLString">計算查詢結果語句</param>
        /// <returns>查詢結果(object)</returns>
        public static object GetSingle(string SQLString, params SqliteParameter[] cmdParms)
        {
            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                using (SqliteCommand cmd = new SqliteCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                        object obj = cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                        if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            return null;
                        }
                        else
                        {
                            return obj;
                        }
                    }
                    catch (SqliteException e)
                    {
                        throw new Exception(e.Message);
                    }
                }
            }
        }

        /// <summary>
        /// 執行查詢語句,返回SqliteDataReader
        /// </summary>
        /// <param name="strSQL">查詢語句</param>
        /// <returns>SqliteDataReader</returns>
        public static SqliteDataReader ExecuteReader(string SQLString, params SqliteParameter[] cmdParms)
        {
            SqliteConnection connection = new SqliteConnection(connectionString);
            SqliteCommand cmd = new SqliteCommand();
            try
            {
                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                SqliteDataReader myReader = cmd.ExecuteReader();
                cmd.Parameters.Clear();
                return myReader;
            }
            catch (SqliteException e)
            {
                throw new Exception(e.Message);
            }

        }

        /// <summary>
        /// 執行查詢語句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查詢語句</param>
        /// <returns>DataSet</returns>
        public static DataSet Query(string SQLString, params SqliteParameter[] cmdParms)
        {
            using (SqliteConnection connection = new SqliteConnection(connectionString))
            {
                SqliteCommand cmd = new SqliteCommand();
                PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                using (SqliteDataAdapter da = new SqliteDataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        da.Fill(ds, "ds");
                        cmd.Parameters.Clear();
                    }
                    catch (SqliteException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }
        }


        private static void PrepareCommand(SqliteCommand cmd, SqliteConnection conn, SqliteTransaction trans, string cmdText, SqliteParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            if (cmdParms != null)
            {
                foreach (SqliteParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }

        #endregion
    }
}

3. 使用Linq2db 讓SQLite支持Linq

參考文檔:http://www.cnblogs.com/lxzhangying/p/3227110.html

目前該方法不支持Linxu下操作!

參考文檔:
http://blog.itpub.net/26230597/viewspace-1260552/
http://www.weste.net/2014/10-08/99347.html
http://www.cnblogs.com/vingi/articles/4302497.html
https://my.oschina.net/lbp0200/blog/194025

大道至簡

發佈了490 篇原創文章 · 獲贊 1268 · 訪問量 251萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章