参考了很多SQLITE数据库多线程的解决办法 我自己写了一个SQLITEHELPER 来解决这个问题

希望大家多多指教

调用的时候

 SQLLiteDBHelper _SQLLiteDBHelper = new SQLLiteDBHelper();

 _SQLLiteDBHelper.Dispose();

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SQLite;
using System.Threading; namespace DAL
{
public class SQLLiteDBHelper : IDisposable
{
public static string Connectionstring = "";
/// <summary>
/// 获得连接对象
/// </summary>
/// <returns></returns>
public SQLiteConnection GetSQLiteConnection()
{
//return new SQLiteConnection(Connectionstring);
SQLiteConnection conn = new SQLiteConnection();
try
{ conn.ConnectionString = Connectionstring;
if (conn.State.Equals(ConnectionState.Closed))
{
conn.DefaultTimeout = 5000;
conn.Open(); } }
catch (Exception ee)
{ //OAFile.ErrorLog(OAFile.GetCurrUrl(), "链接字符串错误,请检查,详细错误:" + ee.Message);
}
return conn;
} /// <summary>
/// COMMAND初始化
/// </summary>
/// <param name="cmd"></param>
/// <param name="conn"></param>
/// <param name="cmdText"></param>
/// <param name="p"></param>
private void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)
{
try
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Parameters.Clear();
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 30;
if (p != null)
{
foreach (object parm in p)
cmd.Parameters.Add(parm);
}
}
catch (Exception)
{ } } /// <summary>
/// 批量执行带参数的SQL语句 事务 并返回执行结果
/// </summary>
/// <param name="SQLStringList"></param>
/// <param name="PramsList"></param>
/// <returns></returns>
public string ExecuteSqlTran(List<string> SQLStringList, List<SQLiteParameter[]> PramsList)
{
AcquireWriteLock();
string result = "执行成功";
using (SQLiteConnection conn = GetSQLiteConnection())
{
using (SQLiteCommand cmd = new SQLiteCommand())
{
try
{
cmd.Connection = conn;
SQLiteTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
for (int i = 0; i < SQLStringList.Count; i++)
{
if (SQLStringList[i].Trim().Length > 1)
{
PrepareCommand(cmd, conn, SQLStringList[i].Trim(), PramsList[i]);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
}
tx.Commit();
}
catch (Exception ex)
{
tx.Rollback();
result = ex.Message.Trim();
}
}
catch (Exception)
{ result = "lock";
} }
}
return result;
} /// <summary>
/// 批量执行带参数的SQL语句 事务 并返回执行结果
/// </summary>
/// <param name="SQLStringList"></param>
/// <param name="PramsList"></param>
/// <returns></returns>
public string ExecuteSqlTran(List<string> SQLStringList)
{
AcquireWriteLock();
string result = "执行成功";
using (SQLiteConnection conn = GetSQLiteConnection())
{
using (SQLiteCommand cmd = new SQLiteCommand())
{
cmd.Connection = conn;
SQLiteTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
for (int i = 0; i < SQLStringList.Count; i++)
{
if (SQLStringList[i].Trim().Length > 1)
{
PrepareCommandNoParameters(cmd, conn, SQLStringList[i].Trim());
cmd.ExecuteNonQuery();
// cmd.Parameters.Clear();
}
}
tx.Commit();
}
catch (Exception ex)
{
if (conn.State!=ConnectionState.Closed)
{
tx.Rollback();
} result = ex.Message.Trim();
}
}
}
return result;
} /// <summary>
/// COMMAND初始化
/// </summary>
/// <param name="cmd"></param>
/// <param name="conn"></param>
/// <param name="cmdText"></param>
/// <param name="p"></param>
private void PrepareCommandNoParameters(SQLiteCommand cmd, SQLiteConnection conn, string cmdText)
{
try
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 30;
}
catch (Exception)
{ }
} /// <summary>
/// 返回DataSet
/// </summary>
/// <param name="cmdText"></param>
/// <param name="p"></param>
/// <returns></returns>
public DataSet DS(string cmdText, params object[] p)
{
DataSet ds = new DataSet();
SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(command, connection, cmdText, p);
SQLiteDataAdapter da = new SQLiteDataAdapter(command);
da.Fill(ds);
}
return ds;
} /// <summary>
/// 返回DataTable
/// </summary>
/// <param name="cmdText"></param>
/// <param name="p"></param>
/// <returns></returns>
public DataTable DT(string cmdText, params object[] p)
{
DataSet ds = new DataSet();
SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(command, connection, cmdText, p);
SQLiteDataAdapter da = new SQLiteDataAdapter(command);
da.Fill(ds);
}
return ds.Tables[0];
} /// <summary>
/// 返回DataTable
/// </summary>
/// <param name="cmdText"></param>
/// <param name="p"></param>
/// <returns></returns>
public DataTable DT(string cmdText)
{
DataSet ds = new DataSet();
SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommandNoParameters(command, connection, cmdText);
SQLiteDataAdapter da = new SQLiteDataAdapter(command);
da.Fill(ds);
}
return ds.Tables[0];
} /// <summary>
/// 返回执行数据的行数
/// </summary>
/// <param name="cmdText"></param>
/// <param name="p"></param>
/// <returns></returns>
public DataRow ExecuteDataRow(string cmdText, params object[] p)
{
DataSet ds = DS(cmdText, p);
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
return ds.Tables[0].Rows[0];
return null;
}

/// <summary>
/// 返回受影响的行数
/// </summary>
/// <param name="cmdText">a</param>
/// <param name="commandParameters">传入的参数</param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdText, params object[] p)
{
AcquireWriteLock();
SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(command, connection, cmdText, p);
return command.ExecuteNonQuery();
}
} /// <summary>
/// 返回受影响的行数
/// </summary>
/// <param name="cmdText">a</param>
/// <param name="commandParameters">传入的参数</param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdText)
{
AcquireWriteLock();
SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{ PrepareCommandNoParameters(command, connection, cmdText);
return command.ExecuteNonQuery();
}
} /// <summary>
/// 返回SqlDataReader对象
/// </summary>
/// <param name="cmdText"></param>
/// <param name="commandParameters">传入的参数</param>
/// <returns></returns>
public SQLiteDataReader ExecuteReader(string cmdText, params object[] p)
{
SQLiteCommand command = new SQLiteCommand();
SQLiteConnection connection = GetSQLiteConnection();
try
{
PrepareCommand(command, connection, cmdText, p);
SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
catch
{
connection.Close();
throw;
}
} /// <summary>
/// 返回结果集中的第一行第一列,忽略其他行或列
/// </summary>
/// <param name="cmdText"></param>
/// <param name="commandParameters">传入的参数</param>
/// <returns></returns>
public object ExecuteScalar(string cmdText, params object[] p)
{
SQLiteCommand cmd = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(cmd, connection, cmdText, p);
return cmd.ExecuteScalar();
}
} /// <summary>
/// 分页
/// </summary>
/// <param name="recordCount"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="cmdText"></param>
/// <param name="countText"></param>
/// <param name="p"></param>
/// <returns></returns>
public DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, params object[] p)
{
if (recordCount < 0)
recordCount = int.Parse(ExecuteScalar(countText, p).ToString());
DataSet ds = new DataSet();
SQLiteCommand command = new SQLiteCommand();
using (SQLiteConnection connection = GetSQLiteConnection())
{
PrepareCommand(command, connection, cmdText, p);
SQLiteDataAdapter da = new SQLiteDataAdapter(command);
da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");
}
return ds;
} #region 静态字段和属性
const short WAIT_TIME = 5;
static readonly object locker = new object();
static Dictionary<string, int> _dbThreadIdDict = new Dictionary<string, int>();
/// <summary>
/// 获得写操作的超时时间,单位为毫秒,可以通过配置文件appSettings节中添加设置 SQLiteWriteLockTimeout 的value值控制锁等待的超时时间,该值必须为正整数数字,单位为毫秒
/// 默认的超时时间是1000ms
/// </summary>
public static int SQLiteWriteLockTimeout
{
get
{
string configValule = "300000";
if (!string.IsNullOrEmpty(configValule))
{
return int.Parse(configValule);
}
return 1000;
}
}
#endregion private string _connString; public SQLLiteDBHelper()
{
} #region 私有方法 private void AcquireWriteLock()
{
if (Connectionstring=="")
{
return;
}
_connString = Connectionstring;
int threadId = Thread.CurrentThread.ManagedThreadId; int waitTimes = 0;
while (_dbThreadIdDict.ContainsKey(_connString) && _dbThreadIdDict[_connString] != threadId)
{
Thread.Sleep(WAIT_TIME);
waitTimes += WAIT_TIME;
#if DEBUG
Console.WriteLine(_connString + " wait for " + waitTimes + " ms");
#endif
if (waitTimes > SQLiteWriteLockTimeout)
{
//throw new TimeoutException("SQLite等待写操作超时");
}
} lock (locker)
{
if (!_dbThreadIdDict.ContainsKey(_connString))
_dbThreadIdDict.Add(_connString, threadId);
}
} private void ReleaseWriteLock()
{
lock (locker)
{
if (_connString!=null)
{
if (_dbThreadIdDict.ContainsKey(_connString))
{
_dbThreadIdDict.Remove(_connString);
}
} }
} #endregion #region IDisposable 成员 public void Dispose()
{
ReleaseWriteLock();
}
#endregion
}
}

  

SQLite数据库在多线程写锁文件的解决办法的更多相关文章

  1. sql server 数据库正在使用该文件的解决办法

    今天在帮朋友还原数据库时遇到了一个问题.朋友用的是sql server 2008数据库,本身有一个数据库,他在修改程序的时候,想修改数据库的内容.但是又不想在原数据库中修改.想备份还原出一个数据库然后 ...

  2. 对SQLite数据库操作 操作db文件

    sqlite数据库就是一个DB文件.  程序每操作一次数据库都要读一次 .DB  文件 .  这个文件就是这个SQLite数据库. 如果需要依赖包的可以联系我 工具类: package com.hot ...

  3. “只有DBA才能导入由其他DBA导出的文件”各种解决办法

    “只有DBA才能导入由其他DBA导出的文件”各种解决办法 当oracle导入的时候出现“只有 DBA 才能导入由其他 DBA 导出的文件”的时候通常有以下几种解决办法! 1:常见的是直接grant   ...

  4. MySQL安装过程net start mysql 启动失败 报“错误2,系统找不到文件”的解决办法

    MySQL安装过程net start mysql 启动失败 报“错误2,系统找不到文件”的解决办法 错误2,系统找不到文件. 开始...运行... regedit  注册表项: HKEY_LOCAL_ ...

  5. ubuntu Linux 测试PHP却提示下载文件的解决办法

    ubuntu Linux 测试PHP却提示下载文件的解决办法   一般这种情况都是在刚刚开始配置环境时出现的, 输入 sudo a2enmod php5  看提示如果出现“$ This module ...

  6. Ubuntu“无法解析或打开软件包的列表或是状态文件”的解决办法。_StarSasumi_新浪博客

    Ubuntu"无法解析或打开软件包的列表或是状态文件"的解决办法. (2011-04-30 14:56:14) 转载▼ 标签: ubuntu apt 分类: Ubuntu/Linu ...

  7. mysql数据库死锁的产生原因及解决办法

    这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下   数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同 ...

  8. IOS7.1-7.1.1越狱后无法读取越狱文件的解决办法

    IOS7.1-7.1.1越狱后无法读取越狱文件的解决办法 申明:      下面安装PP源的方法已经失效,请不用按照下面的方法操作.      更新最新的方法,在cydia中搜索源 apple fil ...

  9. Chrome不能在网易网盘中上传文件的解决办法

    Chrome不能在网易网盘中上传文件的解决办法1. 安装 Adobe Flash Player PPAPI,设置flash插件 chrome://settings/content/flash,许可[* ...

随机推荐

  1. Strategy pattern策略模式

    在Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator,或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,使用的是策略模式. 一.策略模式的定义 ...

  2. 关于ssh上传文件

    今天用ssh传项目到公司总部的服务器上,报了错误: encountered 1 errors during the transfer 重启ssh再次上传还是一样的错误,然后我让公司那里重启一下服务器, ...

  3. Coding源码学习第四部分(Masonry介绍与使用(一))

    Masonry GitHub:https://github.com/SnapKit/Masonry Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了 ...

  4. 【67测试20161116】【数论】【DP】【思维】

    第一题: LGTB 得到了一个序列,他想在这个序列中选择一个最长的连续子序列,使得这个子序列的最大公约数等于1.请告诉他他能得到的最大长度,如果没有这样的序列,输出-1. 对于50% 的数据,1 &l ...

  5. StormNimbus集群保证CAP流程

    Nimbus启动时,检查当前本地是不是有所有的topology的代码,同时去申请获取leader锁,如果某台nimbus节点成为了集群的leader,会再去检查一次当前本地的代码是不是包含所有活动状态 ...

  6. spout详解

    spout放在每个executer执行,我们先从spoutExecutors的初始化开始往下看,spoutExecutors是在一个worker中管理其中的tasks,在SpoutExecutors的 ...

  7. ssh 无密码登陆

    ssh -i littlesuccess-aws.pem root@172.31.36.91 "cat >> ~/.ssh/authorized_keys" < ...

  8. linux 内核学习之五 system_call过程分析

    一   使用gdb工具跟踪分析一个自添加的系统调用 应用程序的进程通常在用户空间下运行,当它调用一个系统调用时,进程进入内核空间,执行的是kernel内部的代码,从而具有执行特权指令的权限,完成特定的 ...

  9. 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解

    关于 DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  10. hihoCoder#1039

    刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在 ...