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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构