2023年6月21日发(作者:)
分享⼀个SqliteHelper类SQLite作为⼀个本地⽂件数据库相当好⽤,⼩巧、快速、⽀持事务、关系型,甚⾄可以运⾏在Android上。在很久以前的⼀个项⽬中,我们⽤过它来将接收到的数据做本地统计,数据量很⼤,甚⾄于我们想⾃⼰搞个内存空间专门做缓存,缓存满后再⼀点点地往SQLite中移,现在看起来是多余的,这也不符合开发的过程。在开发中,应该先把功能做出来,如果有性能问题,再找出解决⽅法。直接在SQLite中做插⼊⽽不是先在内存中做,它的效率已经达到了要求。现在跟⼤家分享⼀个对SQLite操作的帮助类,使⽤它可以对本地SQLite数据库进⾏⽅便的操作。关键词:SQLite, C#, , SQLite Expert摘要:SQLite作为⼀个本地⽂件数据库相当好⽤,⼩巧、快速、⽀持事务、关系型,在之前的⼀个项⽬中使⽤了它,现在把这使⽤经验总结⼀下,分享给⼤家。 1 using System; 2 using ; 3 using ; 4 using ; 5
6 namespace alyzeCommon 7 { 8 public class SqliteHelper : IDisposable 9 { 10 public SQLiteConnection conn; 11
12 public void Dispose() 13 { 14 Dispose(true); 15 ssFinalize(this);
16 } 17
18 protected virtual void Dispose(bool disposing) 19 { 20 if(disposing) 21 if(conn != null) 22 { 23 e(); 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 = (@"Data Source={0}", dataBaseName); 40 conn = new SQLiteConnection(connString); 41 (); 42 } 43
44 /// 45 /// ⼿动打开数据库。 46 /// 47 public void SqliteOpen() 48 { 49 if(conn != null && == ) 50 (); 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 = ; 62 try 63 { 64 SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn }; 65 SQLiteDataAdapter dao = newSQLiteDataAdapter(cmd); 66 dt = newDataTable(); 67 (dt); 68 } 69 catch(Exception e) 70 { 71 sError = e; 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 = ; 85 SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn }; 86 try 87 { 88 SQLiteDataAdapter dao = new SQLiteDataAdapter(cmd); 89 (dt); 90 e(); 91 } 92 catch(Exception e) 93 { 94 sError = e; 95 } 96 finally{ e(); } 97 return ([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 = ;111 if(!bUseTransaction)112 {113 try114 {
115 SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };116 iResult = eNonQuery()>0;117 e();118 }119 catch(Exception ex)120 {121 sError = e;122 }123 }124 else// 使⽤事务125 {126 DbTransaction trans = null;127 trans = ransaction();128 SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };129 try130 {
131 iResult = eNonQuery()>0;132 ();133 }134 catch(Exception ex)135 {136 sError = e;137 iResult = false;138 ck();139 }140 finally{e();e();}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( == 0)153 return;154 using(DbTransaction trans = ransaction())155 {156 if( != )157 ();158 SQLiteCommand cmd = Command();159 tion = conn;160 try161 {162 for(inti = 0; i < sqLiteParameters[0].Length; i++)163 {164 (Parameter());165 }166 //循环167 foreach(object[] sqlParameters insqLiteParameters)168 {169 ExecuteSqlNonQuery(cmd, sqlString, sqlParameters);170 }171 ();172 }173 catch(Exception ex)174 {175 ck();176 throw;177 }178 finally179 {180 e();e();181 }182 }183 }184
185 /// 186 /// 不使⽤事务执⾏⼀条带参数的SQL语句。187 /// 188 /// SQL语句189 /// SQL执⾏的参数190 public void ExecuteSql(string sqlString, object[] sqLiteParameters)191 {192 if( != )193 ();194 SQLiteCommand cmd = Command();195 tion = conn;196 dText = sqlString;197 try198 {199 for(inti = 0; i < ; i++)200 {201 (Parameter());202 ters[i].Value = sqLiteParameters[i];203 }204 eNonQuery();205 }206 finally207 {208 e();209 }210 }211
212 private void ExecuteSqlNonQuery(SQLiteCommand cmd, string cmdText, object[] cmdParms)214 {215 dText = cmdText;216 if(cmdParms != null)217 {218 for(inti = 0; i < ; i++ )219 {220 ters[i].Value = cmdParms[i];221 }222 }223 eNonQuery();224 }225 }226 }
SQLite的语法跟标准的SQL语法不太⼀样,⽐如isnull(x, y) --> 如果x为空则应该返回y,SQLite就不⽀持,取代的是ifnull(x, y),使⽤起来也很⽅便。这⾥提供了C#版本的的操作代码,JAVA版本的也差不多。
做了这个项⽬,回头看以前写的代码,惨不忍睹,太烂。尤其是关于C#多线程的,线程之间同步处理的⼀笔吊糟,经常缝缝补补,代码逻辑混乱。做完后⾃⼰就⽴马总结了⼀下,关于多线程的同步,不到万不得以,不要⾃⼰做。lock (eLocker) { (eLocker); }lock (eLocker) { (eLocker); }这类的,⾮常容易把⾃⼰绕进去,⽽且脱离了⾯向对象的思想。多线程同步⽆⾮是因为多个线程同时对同⼀份数据有了同时操作,它们之间得分出个先后次序来,这在JAVA中提供了线程安全的集合在rent包中,这就不需要⾃⼰在线程中⼿动做同步了,这也⾮常符合⾯向对象的思想。SQLite本⾝应该提供了多线程访问的⽀持。之后的多线程开发就是使⽤了线程安全的集合,代码结构简单。
2023年6月21日发(作者:)
分享⼀个SqliteHelper类SQLite作为⼀个本地⽂件数据库相当好⽤,⼩巧、快速、⽀持事务、关系型,甚⾄可以运⾏在Android上。在很久以前的⼀个项⽬中,我们⽤过它来将接收到的数据做本地统计,数据量很⼤,甚⾄于我们想⾃⼰搞个内存空间专门做缓存,缓存满后再⼀点点地往SQLite中移,现在看起来是多余的,这也不符合开发的过程。在开发中,应该先把功能做出来,如果有性能问题,再找出解决⽅法。直接在SQLite中做插⼊⽽不是先在内存中做,它的效率已经达到了要求。现在跟⼤家分享⼀个对SQLite操作的帮助类,使⽤它可以对本地SQLite数据库进⾏⽅便的操作。关键词:SQLite, C#, , SQLite Expert摘要:SQLite作为⼀个本地⽂件数据库相当好⽤,⼩巧、快速、⽀持事务、关系型,在之前的⼀个项⽬中使⽤了它,现在把这使⽤经验总结⼀下,分享给⼤家。 1 using System; 2 using ; 3 using ; 4 using ; 5
6 namespace alyzeCommon 7 { 8 public class SqliteHelper : IDisposable 9 { 10 public SQLiteConnection conn; 11
12 public void Dispose() 13 { 14 Dispose(true); 15 ssFinalize(this);
16 } 17
18 protected virtual void Dispose(bool disposing) 19 { 20 if(disposing) 21 if(conn != null) 22 { 23 e(); 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 = (@"Data Source={0}", dataBaseName); 40 conn = new SQLiteConnection(connString); 41 (); 42 } 43
44 /// 45 /// ⼿动打开数据库。 46 /// 47 public void SqliteOpen() 48 { 49 if(conn != null && == ) 50 (); 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 = ; 62 try 63 { 64 SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn }; 65 SQLiteDataAdapter dao = newSQLiteDataAdapter(cmd); 66 dt = newDataTable(); 67 (dt); 68 } 69 catch(Exception e) 70 { 71 sError = e; 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 = ; 85 SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn }; 86 try 87 { 88 SQLiteDataAdapter dao = new SQLiteDataAdapter(cmd); 89 (dt); 90 e(); 91 } 92 catch(Exception e) 93 { 94 sError = e; 95 } 96 finally{ e(); } 97 return ([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 = ;111 if(!bUseTransaction)112 {113 try114 {
115 SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };116 iResult = eNonQuery()>0;117 e();118 }119 catch(Exception ex)120 {121 sError = e;122 }123 }124 else// 使⽤事务125 {126 DbTransaction trans = null;127 trans = ransaction();128 SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };129 try130 {
131 iResult = eNonQuery()>0;132 ();133 }134 catch(Exception ex)135 {136 sError = e;137 iResult = false;138 ck();139 }140 finally{e();e();}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( == 0)153 return;154 using(DbTransaction trans = ransaction())155 {156 if( != )157 ();158 SQLiteCommand cmd = Command();159 tion = conn;160 try161 {162 for(inti = 0; i < sqLiteParameters[0].Length; i++)163 {164 (Parameter());165 }166 //循环167 foreach(object[] sqlParameters insqLiteParameters)168 {169 ExecuteSqlNonQuery(cmd, sqlString, sqlParameters);170 }171 ();172 }173 catch(Exception ex)174 {175 ck();176 throw;177 }178 finally179 {180 e();e();181 }182 }183 }184
185 /// 186 /// 不使⽤事务执⾏⼀条带参数的SQL语句。187 /// 188 /// SQL语句189 /// SQL执⾏的参数190 public void ExecuteSql(string sqlString, object[] sqLiteParameters)191 {192 if( != )193 ();194 SQLiteCommand cmd = Command();195 tion = conn;196 dText = sqlString;197 try198 {199 for(inti = 0; i < ; i++)200 {201 (Parameter());202 ters[i].Value = sqLiteParameters[i];203 }204 eNonQuery();205 }206 finally207 {208 e();209 }210 }211
212 private void ExecuteSqlNonQuery(SQLiteCommand cmd, string cmdText, object[] cmdParms)214 {215 dText = cmdText;216 if(cmdParms != null)217 {218 for(inti = 0; i < ; i++ )219 {220 ters[i].Value = cmdParms[i];221 }222 }223 eNonQuery();224 }225 }226 }
SQLite的语法跟标准的SQL语法不太⼀样,⽐如isnull(x, y) --> 如果x为空则应该返回y,SQLite就不⽀持,取代的是ifnull(x, y),使⽤起来也很⽅便。这⾥提供了C#版本的的操作代码,JAVA版本的也差不多。
做了这个项⽬,回头看以前写的代码,惨不忍睹,太烂。尤其是关于C#多线程的,线程之间同步处理的⼀笔吊糟,经常缝缝补补,代码逻辑混乱。做完后⾃⼰就⽴马总结了⼀下,关于多线程的同步,不到万不得以,不要⾃⼰做。lock (eLocker) { (eLocker); }lock (eLocker) { (eLocker); }这类的,⾮常容易把⾃⼰绕进去,⽽且脱离了⾯向对象的思想。多线程同步⽆⾮是因为多个线程同时对同⼀份数据有了同时操作,它们之间得分出个先后次序来,这在JAVA中提供了线程安全的集合在rent包中,这就不需要⾃⼰在线程中⼿动做同步了,这也⾮常符合⾯向对象的思想。SQLite本⾝应该提供了多线程访问的⽀持。之后的多线程开发就是使⽤了线程安全的集合,代码结构简单。
发布评论