分享一个SqliteHelper类-创新互联

分享一个SqliteHelper类

网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于企业网站设计,高端网页制作,对玻璃钢坐凳等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业营销推广优化,H5建站,响应式网站。

SQLite作为一个本地文件数据库相当好用,小巧、快速、支持事务、关系型,甚至可以运行在Android上。在很久以前的一个项目中,我们用过它来将接收到的数据做本地统计,数据量很大,甚至于我们想自己搞个内存空间专门做缓存,缓存满后再一点点地往SQLite中移,现在看起来是多余的,这也不符合开发的过程。在开发中,应该先把功能做出来,如果有性能问题,再找出解决方法。直接在SQLite中做插入而不是先在内存中做,它的效率已经达到了要求。

现在跟大家分享一个对SQLite操作的帮助类,使用它可以对本地SQLite数据库进行方便的操作。

 如有引用,注意写明转自:http://www.cnblogs.com/wgp13x/p/3868916.html

关键词:SQLite, C#, sqlite3.dll, SQLite Expert摘要:SQLite作为一个本地文件数据库相当好用,小巧、快速、支持事务、关系型,在之前的一个项目中使用了它,现在把这使用经验总结一下,分享给大家。
  1 using System;
  2 using System.Data.SQLite;
  3 using System.Data;
  4 using System.Data.Common;
  5  
  6 namespace DXPlatformClientFramework.UC.StatAnalyzeCommon
  7 {
  8     public class SqliteHelper : IDisposable
  9     {
 10         public SQLiteConnection conn;
 11  
 12         public void Dispose()
 13         {
 14             Dispose(true);
 15             GC.SuppressFinalize(this);           
 16         }
 17  
 18         protected virtual void Dispose(bool disposing)
 19         {
 20  if(disposing)
 21   if(conn != null)
 22                 {
 23                     conn.Dispose();
 24                     conn = null;
 25                 }
 26         }
 27  
 28         ~SqliteHelper()
 29         {
 30             Dispose(false);
 31         }
 32  
 33 ///  34 /// 构造函数。
 35 ///  36 /// 数据库名 37         public SqliteHelper(string dataBaseName)
 38         {
 39             string connString = string.Format(@"Data Source={0}", dataBaseName);
 40             conn = new SQLiteConnection(connString);
 41             conn.Open();
 42         }
 43  
 44 ///  45 /// 手动打开数据库。
 46 ///  47         public void SqliteOpen()
 48         {
 49  if(conn != null&& conn.State == ConnectionState.Closed)
 50                 conn.Open();
 51         }
 52  
 53 ///  54 /// 通过执行SQL语句,获取表中数据。
 55 ///  56 /// 错误信息 57 /// 执行的SQL语句 58         public DataTable GetDataTable(out string sError, string sSQL)
 59         {
 60             DataTable dt = null;
 61             sError = string.Empty;
 62  try 63             {
 64                 SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn };
 65                 SQLiteDataAdapter dao = newSQLiteDataAdapter(cmd);
 66                 dt = newDataTable();
 67                 dao.Fill(dt);
 68             }
 69  catch(Exception e)
 70             {
 71                 sError = e.Message;
 72             }
 73             return dt;
 74         }
 75  
 76 ///  77 /// 通过执行SQL语句,获取表中数据个数。
 78 ///  79 /// 错误信息 80 /// 执行的SQL语句 81         public int GetDataCount(out string sError, string sSQL)
 82         {
 83             DataTable dt = newDataTable();
 84             sError = string.Empty;
 85             SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn };
 86  try 87             {
 88                 SQLiteDataAdapter dao = new SQLiteDataAdapter(cmd);
 89                 dao.Fill(dt);
 90                 cmd.Dispose();
 91             }
 92  catch(Exception e)
 93             {
 94                 sError = e.Message;
 95             }
 96  finally{ cmd.Dispose(); }
 97             return int.Parse(dt.Rows[0][0].ToString());
 98         }
 99  
100 /// 101 /// 通过执行SQL语句,执行insert,update,delete 动作,也可以使用事务。
102 /// 103 /// 错误信息104 /// 执行的SQL语句105 /// 是否使用事务106         public bool UpdateData(out string sError, string sSQL, bool bUseTransaction=false)108     {
109             bool iResult = false;
110             sError = string.Empty;
111  if(!bUseTransaction)
112             {
113   try114                 {                   
115                     SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };
116                     iResult = comm.ExecuteNonQuery()>0;
117                     comm.Dispose();
118                 }
119   catch(Exception ex)
120                 {
121                     sError = ex.Message;
122                 }
123             }
124  else// 使用事务125             {
126                 DbTransaction trans = null;
127                 trans = conn.BeginTransaction();
128                 SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };
129   try130                 { 
131                     iResult = comm.ExecuteNonQuery()>0;
132                     trans.Commit();
133                  }
134   catch(Exception ex)
135                 {
136                     sError = ex.Message;
137                     iResult = false;
138                     trans.Rollback();
139                 }
140   finally{comm.Dispose();trans.Dispose();}
141             }
142             return iResult;
143         }
144  
145 /// 146 /// 使用事务执行多条相同的带参数的SQL语句。
147 /// 148 /// SQL语句149 /// 每次SQL执行的参数150         public void ExecuteSqlTran(string sqlString, object[][] sqLiteParameters)
151         {
152  if(sqLiteParameters.Length == 0)
153   return;
154  using(DbTransaction trans = conn.BeginTransaction())
155             {
156   if(conn.State != ConnectionState.Open)
157                     conn.Open();
158                 SQLiteCommand cmd = conn.CreateCommand();
159                 cmd.Connection = conn;
160   try161                 {
162 for(inti = 0; i < sqLiteParameters[0].Length; i++)
163                     {
164                         cmd.Parameters.Add(cmd.CreateParameter());
165                     }
166 //循环167 foreach(object[] sqlParameters insqLiteParameters)
168                     {
169                         ExecuteSqlNonQuery(cmd, sqlString, sqlParameters);
170                     }
171                     trans.Commit();
172                 }
173   catch(Exception ex)
174                 {
175                     trans.Rollback();
176 throw;
177                 }
178   finally179                 {
180                     cmd.Dispose();trans.Dispose();
181                 }
182             }
183         }
184  
185 /// 186 /// 不使用事务执行一条带参数的SQL语句。
187 /// 188 /// SQL语句189 /// SQL执行的参数190         public void ExecuteSql(string sqlString, object[] sqLiteParameters)
191         {
192  if(conn.State != ConnectionState.Open)
193                 conn.Open();
194             SQLiteCommand cmd = conn.CreateCommand();
195             cmd.Connection = conn;
196             cmd.CommandText = sqlString;
197  try198             {
199   for(inti = 0; i < sqLiteParameters.Length; i++)
200                 {
201                     cmd.Parameters.Add(cmd.CreateParameter());
202                     cmd.Parameters[i].Value = sqLiteParameters[i];
203                 }
204                 cmd.ExecuteNonQuery();
205             }
206  finally207             {
208                 cmd.Dispose();
209             }
210         }
211  
212         private void ExecuteSqlNonQuery(SQLiteCommand cmd, string cmdText, object[] cmdParms)214     {
215             cmd.CommandText = cmdText;
216  if(cmdParms != null)
217             {
218   for(inti = 0; i < cmdParms.Length; i++ )
219                 {
220                     cmd.Parameters[i].Value = cmdParms[i];
221                 }
222             }
223             cmd.ExecuteNonQuery();
224         }
225     }
226 }
SQLite的语法跟标准的SQL语法不太一样,比如isnull(x, y) --> 如果x为空则应该返回y,SQLite就不支持,取代的是ifnull(x, y),使用起来也很方便。这里提供了C#版本的的操作代码,JAVA版本的也差不多。 做了这个项目,回头看以前写的代码,惨不忍睹,太烂。尤其是关于C#多线程的,线程之间同步处理的一笔吊糟,经常缝缝补补,代码逻辑混乱。做完后自己就立马总结了一下,关于多线程的同步,不到万不得以,不要自己做。lock (BackWorker.ProduceLocker) {  Monitor.Pulse(BackWorker.ProduceLocker); }lock (BackWorker.ConsumeLocker) { Monitor.Wait(BackWorker.ConsumeLocker); }这类的,非常容易把自己绕进去,而且脱离了面向对象的思想。多线程同步无非是因为多个线程同时对同一份数据有了同时操作,它们之间得分出个先后次序来,这在JAVA中提供了线程安全的集合在java.util.concurrent包中,这就不需要自己在线程中手动做同步了,这也非常符合面向对象的思想。SQLite本身应该提供了多线程访问的支持。之后的多线程开发就是使用了线程安全的集合,代码结构简单。来自王安琪http://www.cnblogs.com/wgp13x/

作者:Angel 出处:http://www.cnblogs.com/wgp13x/ 欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能推荐或关注。

王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。

Email:aitanjupt@hotmail.com

QQ:289770363


网站名称:分享一个SqliteHelper类-创新互联
标题网址:http://scyanting.com/article/ejged.html