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

namespace SqliteHelper
{
public class SqliteHelper
{
#region 全局变量
private string path;
private SQLiteConnection conn;
private static SqliteHelper instance;
public static SqliteHelper Instance
{
get { return GetInstance(); }
set { SqliteHelper.instance = value; }
}
private static Dictionary<object, object> Sessions = new Dictionary<object, object>();
#endregion

#region 单例
private static SqliteHelper GetInstance()
{
if (instance == null)
instance = new SqliteHelper();
return instance;
}
#endregion

#region 初始化
public void Init()
{
InitPath();
InitConn();
}
private void InitPath()
{
if (string.IsNullOrEmpty(path))
throw new NullReferenceException("请先指定数据库文件路径!");
if (!File.Exists(path))
SQLiteConnection.CreateFile(path);
}
private void InitConn()
{
conn = new SQLiteConnection(string.Format("Data Source = {0};version = 3", path));
}
public void SetDataSourcePath(string path)
{
this.path = path;
}
#endregion

#region 建表、删表
public bool CreateTable(string tableName, params string[][] parameters)
{
InitConn();
var isExists = IsExists(tableName);
if (isExists)
DropTable(tableName);
//校验数据库是否存在
if (parameters == null)
throw new NullReferenceException("参数不能为空!");
var list = new List<string>();
foreach (var parameter in parameters)
list.Add(string.Join(" ", parameter));
var sql = string.Format("create table {0}({1})", tableName, string.Join(",", list));
return ExecuteNonQuery(sql);
}
public void DropTable(string tableName)
{
InitConn();
var sql = "Drop table " + tableName;
using (conn)
{
conn.Open();
using (var cmd = new SQLiteCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
}
}
public void DropDataSource()
{
if (string.IsNullOrEmpty(path) || !File.Exists(path))
throw new NullReferenceException("文件未找到!");
File.Delete(path);
}
#endregion

#region 增删查改
public bool Insert(string tableName, params string[] parameters)
{
if (parameters == null)
throw new NullReferenceException("数据不能为空!");
InitConn();
var sql = string.Format("insert into {0} values('{1}')", tableName, string.Join("','", parameters));
return ExecuteNonQuery(sql);
}
public bool Delete(string tableName, params string[] parameters)
{
if (parameters == null || parameters.Length != 2)
throw new NullReferenceException("参数错误!");
InitConn();
var _parameters = new List<string>();
_parameters.Add(tableName);
_parameters.AddRange(parameters);
var sql = string.Format("Delete {0} where {1} = '{2}'", _parameters.ToArray());
return ExecuteNonQuery(sql);
}
public bool IsExists(string tableName)
{
var sql = "select count(1) from sqlite_master where name=@name";
var sqliteparameters = new[] { new SQLiteParameter("@name", tableName) };
return int.Parse(GetOnly(sql, sqliteparameters).ToString()) != 0;
}
public bool IsExists(string tableName, params Parameter[] parameters)
{
if (parameters == null || parameters.Length == 0)
throw new NullReferenceException("没有参数!");
var table = GetTable(tableName, parameters);
return table != null && table.Rows != null && table.Rows.Count > 0;
}
public DataTable GetTable(string tableName, params Parameter[] parameters)
{
var sql = new StringBuilder();
var sqliteparameters = new List<SQLiteParameter>();
sql.Append(string.Format("select * from {0} where 1 = 1 ", tableName));
if (parameters != null)
foreach (var parameter in parameters)
{
var sqliteParameter = new SQLiteParameter("@" + parameter.parameterName, parameter.parameterValue);
var _sql = string.Empty;
sqliteparameters.Add(sqliteParameter);
switch (parameter.selectMode)
{
case SelectMode.AndNoequal:
_sql = "and {0} <> @{0} ";
break;
case SelectMode.AndFirstLike:
_sql = "and {0} like '%" + sqliteParameter.Value + " ";
sqliteparameters.Remove(sqliteParameter);
break;
case SelectMode.AndLastLike:
_sql = "and {0} like '" + sqliteParameter.Value + "%' ";
sqliteparameters.Remove(sqliteParameter);
break;
case SelectMode.AndLike:
_sql = "and {0} like '%" + sqliteParameter.Value + "%' ";
sqliteparameters.Remove(sqliteParameter);
break;
case SelectMode.OrEqual:
_sql = "or {0} = @{0} ";
break;
case SelectMode.OrNoequal:
_sql = "or {0} <> @{0} ";
break;
case SelectMode.OrFirstLike:
_sql = "or {0} like '%" + sqliteParameter.Value + "' ";
sqliteparameters.Remove(sqliteParameter);
break;
case SelectMode.OrLastLike:
_sql = "and {0} like '" + sqliteParameter.Value + "%' ";
sqliteparameters.Remove(sqliteParameter);
break;
case SelectMode.OrLike:
_sql = "and like '" + sqliteParameter.Value + "%' ";
sqliteparameters.Remove(sqliteParameter);
break;
default://AndEqual
_sql = "and {0} = @{0} ";
break;
}
sql.Append(string.Format(_sql, parameter.parameterName));
}

return GetTable(sql.ToString(), sqliteparameters.ToArray());
}
public object GetOnly(string sql, params SQLiteParameter[] sqliteparameters)
{
InitConn();
using (conn)
{
conn.Open();
using (var cmd = new SQLiteCommand(sql, conn))
{
if (sqliteparameters != null)
cmd.Parameters.AddRange(sqliteparameters);
return cmd.ExecuteScalar();
}
}
}
public bool Update(string tableName, params string[] parameters)
{
if (parameters == null || parameters.Length != 4)
throw new NullReferenceException("参数错误!");
var _parameters = new List<string>();
_parameters.Add(tableName);
_parameters.AddRange(parameters);
var sql = string.Format("Update {0} set {3} = '{4}' where {1} = '{2}'", _parameters.ToArray());
return ExecuteNonQuery(sql);
}
public bool ExecuteNonQuery(string sql, params SQLiteParameter[] sqliteparameters)
{
InitConn();
using (conn)
{
conn.Open();
using (var cmd = new SQLiteCommand(sql, conn))
{
if (sqliteparameters != null)
cmd.Parameters.AddRange(sqliteparameters);
return cmd.ExecuteNonQuery() > 0;
}
}
}
public DataTable GetTable(string sql, params SQLiteParameter[] sqliteparameters)
{
InitConn();
using (conn)
{
conn.Open();
using (var cmd = new SQLiteCommand(sql, conn))
{
if (sqliteparameters != null)
cmd.Parameters.AddRange(sqliteparameters.ToArray());
var ds = new DataSet();
var da = new SQLiteDataAdapter(cmd);
try
{
da.Fill(ds);
if (ds.Tables == null)
throw new IndexOutOfRangeException();
return ds.Tables[0];
}
catch (IndexOutOfRangeException)
{
return new DataTable();
}
catch (SQLiteException)
{
return null;
}
}
}
}
#endregion

#region 附
public string[] GetAllTables()
{
var sql = "select * from sqlite_master";
var table = GetTable(sql, default(SQLiteParameter[]));
var tables = new List<string>();
foreach (DataRow row in table.Rows)
tables.Add(row[1].ToString());
return tables.ToArray();
}
public string[] GetAllColumnsByTableName(string tableName)
{
var sql = string.Format("pragma table_info({0})", tableName);
var table = GetTable(sql, default(SQLiteParameter[]));
var columns = new List<string>();
foreach (DataRow row in table.Rows)
columns.Add(row[1].ToString());
return columns.ToArray();
}
public void SetSession(object key, object value)
{
if (!Sessions.ContainsKey(key))
Sessions.Add(key, null);
Sessions[key] = value;
}
public object GetSessionByKey(object key)
{
if (!Sessions.ContainsKey(key))
return null;
return Sessions[key];
}
public bool CheckConnection()
{
return !string.IsNullOrEmpty(path);
}
public object Execute(string sql, params SQLiteParameter[] sqliteparameters)
{
InitConn();

using (conn)
{
conn.Open();
using (var cmd = new SQLiteCommand(sql, conn))
{
try
{
cmd.Transaction = conn.BeginTransaction();
if (sqliteparameters != null)
cmd.Parameters.AddRange(sqliteparameters);
var ds = new DataSet();
var da = new SQLiteDataAdapter(cmd);
da.Fill(ds);
if (ds.Tables.Count == 0)
throw new SQLiteException("sql语句不合法.");
return ds;
}
catch (SQLiteException)
{
try
{
cmd.Transaction.Rollback();
cmd.Transaction = conn.BeginTransaction();
return cmd.ExecuteNonQuery();
}
catch (SQLiteException)
{
return null;
}
}
catch (Exception)
{
return null;
}
finally
{
cmd.Transaction.Commit();
}
}
}
}
#endregion
}
}

关于c#连接数据库的代码的更多相关文章

  1. 无状态会话Bean、有状态会话Bean、CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码?

    无状态会话Bean.有状态会话Bean.CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码? A.无状态会话Bean B.有状态会话Bean C.CMP D.BMP 解答:C

  2. asp.net 通用的连接数据库实例代码

    asp.net中数据库连接代码,有需要的朋友可以参考一下. <%@ Page Language="C#" AutoEventWireup="true" C ...

  3. JDBC——连接数据库的代码

    第一步:在SCR下创建一个file,写好数据库的相关信息. #oracle数据库 driver=oracle.jdbc.driver.OracleDriver jdbcUrl=jdbc:oracle: ...

  4. IDEA中安装EasyCode插件并连接数据库生成代码

    场景 EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据库相关的代码都可以通过自定义模板来生成.支持数据库类型与j ...

  5. Java 使用 JDBC 连接数据库的代码整合[MySql、SqlServer、Oracle]-[经过设计模式改造](2020年寒假小目标01)

    日期:2020.01.08 博客期:121 星期三 今天对过去整个大二和大三上半学期用到的数据库的方法进行汇总,可以有效的使用.套用,每一个部分都有<软件设计模式>知识,上述代码满足了开闭 ...

  6. java连接数据库驱动代码综合共享

    1.Oracle8/8i/9i数据库(thin模式)Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();S ...

  7. JDBC连接数据库核心代码

    1.Oracle数据库   Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   String url ...

  8. java连接数据库核心代码

    一.oracle String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:Oracle ...

  9. (转)PHP连接数据库之PHP连接MYSQL数据库代码

    PHP连接数据库之PHP连接MYSQL数据库代码 < ?php $mysql_server_name='localhost'; //改成自己的mysql数据库服务器 $mysql_usernam ...

随机推荐

  1. pycharm中代码整体缩进

    整体缩进 :  1.选中需要缩进的代码 2.Tab键 反向缩进:  shift+Tab

  2. 关于UI适配的文档

    第一部分:原理 (1)根据当前屏幕尺寸与开发预设屏幕尺寸尺寸得出以下参数. 1 XRatio:当前屏幕尺寸与开发尺寸的X轴比例 2 YRtaio:当前屏幕尺寸与开发尺寸的Y轴比例 3minRatio: ...

  3. html5 javascript 事件练习3随机键盘

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. idea 更换svn地址

    右键项目-->Subversion-->Relocate 上面是旧的SVN地址,下面填入你要更换的目标SVN地址

  5. MongoDB 之 你得知道MongoDB是个什么鬼 MongoDB - 1

    最近有太多的同学向我提起MongoDB,想要学习MongoDB,还不知道MongoDB到底是什么鬼,或者说,知道是数据库,知道是文件型数据库,但是不知道怎么来用 那么好,所谓千呼万唤始出来,现在我就拉 ...

  6. EasyUI相关知识点整理

    EasyUI相关知识整理 EasyUI是一种基于jQuery.Angular..Vue和React的用户界面插件集合.easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能.也就 ...

  7. Why Choose MB SD C5 with Engineer Software

    MB SD C5 with engineer software performed good and now is released. Unlike the old clone C5 which us ...

  8. 20190409Liunx中计划任务及压缩归档week2_day1

    计划任务介绍 我们可以通过一些设置.来让电脑定时提醒我们该做什么事了.或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务.而遇到一些需要执行的事情或任务.我们也可以通过命令来告 ...

  9. java SE学习过程中的知识点小结(一)(很多内容过于基础,希望能帮助到学习路上的同学)————欢迎老手批评指正

    ①.把boolean测试放在括号内:例如while(x==4){}  //当然看过很多博客,里面有工作经验的工作者说以后公司可能习惯性写(4==x) ②.所有java程序都定义在类中(也是区别于C++ ...

  10. win的使用

    1.net use 挂在远端文件系统,方便本机软件操作! 添加挂载文件   net use  h:   //192.168.1.1/file 删除挂载文件   net use /delete  h: ...