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. 测试Oracle统计信息的导出导入

    背景:有时我们会希望可以对Oracle的统计信息整体进行导出导入.比如在数据库迁移前后,希望统计信息保持不变;又比如想对统计信息重新进行收集,但是担心重新收集的结果反而引发性能问题,想先保存当前的统计 ...

  2. 第三章 jQuery事件和动画

    1.什么是事件:事件指的是用于对网页操作的时候,网页做出的一个回应. 2.JQuery中的事件:JQuery事件是对JavaScript事件的封装,常用事件的分类如下:(1)基础事件:window事件 ...

  3. Objective-C RunTime 学习笔记 之 基础结构体

    1.OC 运行期常用对象结构体 基本的结构体定义 typedef objc_class Class; /* 类 */ typedef objc_object *id; /* 各种类型,只要第一个字段为 ...

  4. 20155228 2017-11-19 实现mypwd(选做,加分)

    20155228 2017-11-19 实现mypwd(选做,加分) 题目和要求 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试mypwd ...

  5. android studio 中如何合并冲突(转)

    合并分支,解决冲突 执行Git merge ,如果有冲突,就会出现如下格式: <<<<<<< HEAD 这个位置的内容就是当前所在分支的内容 ======= ...

  6. LeetCode258 各位相加

    题目链接:https://leetcode-cn.com/problems/add-digits/ 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: ...

  7. LinkedList 利用的是尾插法

  8. Java正则表达式草稿程序*2

    1.成绩统计. 输入文件input.txt: 张三 语文12 数学31 英语11 李四 语文22 数学22 英语22 王五 语文33 数学33 英语33 期待输出output.txt: 张三 语文12 ...

  9. nginx ssl 卸载功能 第八章

    一 .证书自签发和给web 服务签发证书 .ssl 证书加密文件 ****************************** 建立私有CA openCA openssl 证书申请及签署步骤 .生成证 ...

  10. 关于oracle result_cache

    结果集缓存 和聚合物化视图类似,报表系统和数据仓库系统是最适合结果集缓存的,这些系统通常具有大量复杂的SQL,其中不少子查询包含聚合函数,如果能够尽可能重用这些已经计算过的聚合结果集,将极大的提升系统 ...