分享一个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