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. Asianux 7.3安装Oracle 11.2.0.4单实例体验

    环境:Asianux 7.3 需求:安装Oracle 11.2.0.4 单实例 背景:系统使用默认的最小安装部署,Oracle安装额外需要的包统一使用yum安装. 查看当前系统相关信息: [root@ ...

  2. flex检查对象是否存在某个方法(函数)、属性的最简方法

    //if("方法/属性名" in object){存在do...}else{不存在do...}if("data" in event.tagert)//只要使用这 ...

  3. Docker 推送镜像到hub.docker

    1.Docker镜像文件:lails.server.demo:1.0, 2.登录Docker:docker login[根据提示输入用户名/密码] 3.执行:docker push lails.ser ...

  4. input file 上传 判断文件类型、路径是否为空

    <html> <body bgcolor="white"> <TABLE cellSpacing=0 cellPadding=0 width=&quo ...

  5. bootloader研究最后一关(上)

    2011-03-12 17:03:17 把map文件也仔细看了下.代码及map文件及段分配的关系,可以参考我总结的图.暂时堆栈我就不放在ZI上了.不是今天的重了点 今天重点研究2440的nandfla ...

  6. 记账本微信小程序开发四

    学习添加组件 集成日期组件 添加组件 需要在main.js文件中,声明一个data值date与wxml中的{{date}}绑定关联,然后在onLoad中初始化字符串格式的日期值, 处理日期组件点击确认 ...

  7. Python基础(六)_全局变量声明、可变参数、关键字参数

    1. global声明全局变量 #声明name这个变量为全局变量,只是写在函数里面 #写代码时,尽量不要用全局变量,会一直占用内存.       ------->{'name':'abc','s ...

  8. Python Redis set集合

    Set操作.Set集合就是不允许重复的列表 (无序集合) sadd(name,values) # name对应的集合中添加元素 scard(name) # 获取name对应的集合中元素个数 sdiff ...

  9. koa2 中 cookie 存在的中文问题

    koa2  中的 cookie 没办法直接设置中文,会报错 ‘ argument value is invalid ’ 解决办法: 先将它转成 ‘ base64 ’ 编码来存储 new Buffer( ...

  10. vc++2010如何新建项目并在控制台打印helloworld

    关于写c++使用什么集成开发环境的问题其实挺纠结的.我找了好久找到codeblocks,发现这款IDE还是最适合用在最标准的c++语法环境中.其实先前装过vs2015旗舰版,但是这款软件太大了,非常消 ...