sqlite基础用法
sqlite作为一个轻量级别的数据库,个人感觉操作起来并不轻便,优缺点各有利弊。
sqlite3的使用是,切换到命令行,然后切换到sqlite3的所在目录,例如sqlite3.exe位于C:sqlitesqlite.exe这个文件夹下,切换目录步骤,
1、cmd——cd c:sqlite 命令行就切换到了命令行,然后在创建数据库,创建表,查询表数据,
C# 使用sqlite 轻量级数据库
一 准备工作 sqlite3.exe 下载地址:http://www.sqlite.org/download.html 下载"sqlite-shell-win32-x86- 3070800.zip" 就OK了Precompiled Binaries For Windows sqlite-shell-win32-x86-3070800.zip (248.28 KiB) system.data.sqlite.dll 下载地址: http://www.dllzj.com/Down_System.Data.SQLite.DLL.html 这个dll 用于Visual Studio 项目中引用 二,试用sqlite3.exe 解压sqlite-shell-win32-x86-3070800.zip 到F:jonseDownLoadssqlLite 目录下 开始-->运行-->cmd >F: >cd F:jonseDownLoadssqlLite >sqlite3 myDB.db (如果myDB.db不存在,则创建之;若存在,则打开它) >create table test(id int,name varchar(20),remark varchar(200)); (创建test表,三列: id,name,remark) >insert into test select 1,'name1','remark1' union select 2,'name2','remark2'; (暂时插入2行数据) >.mode column (显示列模式) >.headers on (显示列头信息) >select * from test; (查询所有的数据) >select ifnull(max(id),0) as MaxID from test; (查询test表最大的ID值) 三, C# 使用sqlite 在VS2010的项目引用中添加System.Data.SQLite.dll (这个在准备工作中已经下载好的) (1),新建一个SqlLiteHelper.cs 的类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SQLite; using System.Data.Common; namespace JonseTest { public abstract class SqlLiteHelper { public static string ConnSqlLiteDbPath = string.Empty; public static string ConnString { get { return string.Format(@"Data Source={0}", ConnSqlLiteDbPath); } } // 取datatable public static DataTable GetDataTable(out string sError,string sSQL) { DataTable dt = null; sError = string.Empty; try { SQLiteConnection conn = new SQLiteConnection(ConnString); conn.Open(); SQLiteCommand cmd = new SQLiteCommand(); cmd.CommandText = sSQL; cmd.Connection = conn; SQLiteDataAdapter dao = new SQLiteDataAdapter(cmd); dt = new DataTable(); dao.Fill(dt); } catch (Exception ex) { sError = ex.Message; } return dt; } // 取某个单一的元素 public static object GetSingle(out string sError, string sSQL) { DataTable dt = GetDataTable(out sError, sSQL); if (dt != null && dt.Rows.Count > 0) { return dt.Rows[0][0]; } return null; } // 取最大的ID public static Int32 GetMaxID(out string sError, string sKeyField,string sTableName) { DataTable dt = GetDataTable(out sError, "select ifnull(max([" + sKeyField + "]),0) as MaxID from [" + sTableName + "]"); if (dt != null && dt.Rows.Count > 0) { return Convert.ToInt32(dt.Rows[0][0].ToString()); } return 0; } // 执行insert,update,delete 动作,也可以使用事务 public static bool UpdateData(out string sError, string sSQL,bool bUseTransaction=false) { int iResult = 0; sError = string.Empty; if (!bUseTransaction) { try { SQLiteConnection conn = new SQLiteConnection(ConnString); conn.Open(); SQLiteCommand comm = new SQLiteCommand(conn); comm.CommandText = sSQL; iResult = comm.ExecuteNonQuery(); } catch (Exception ex) { sError = ex.Message; iResult = -1; } } else // 使用事务 { DbTransaction trans =null; try { SQLiteConnection conn = new SQLiteConnection(ConnString); conn.Open(); trans = conn.BeginTransaction(); SQLiteCommand comm = new SQLiteCommand(conn); comm.CommandText = sSQL; iResult = comm.ExecuteNonQuery(); trans.Commit(); } catch (Exception ex) { sError = ex.Message; iResult = -1; trans.Rollback(); } } return iResult >0; } } } (2) 新建一个frmSqlLite 的form public partial class frmSqlLite : Form { string sError = string.Empty; public frmSqlLite() { InitializeComponent(); } private void InitGrid() { SqlLiteHelper.ConnSqlLiteDbPath = @"F:jonseDownLoadssqlLitemyDB.db"; sError = string.Empty; string sSql = "select * from test"; DataTable dt = SqlLiteHelper.GetDataTable(out sError, sSql); if (!string.IsNullOrEmpty(sError)) Common.DisplayMsg(this.Text, sError); dataGridView1.DataSource = dt; } private void frmSqlLite_Load(object sender, EventArgs e) { InitGrid(); } private void button1_Click(object sender, EventArgs e) { sError=string.Empty; int iMaxID = SqlLiteHelper.GetMaxID(out sError, "id", "test") + 1; string sSql = "insert into test select " + iMaxID + ",'name" + iMaxID + "','remark" + iMaxID + "'"; sError=string.Empty; bool bResult = SqlLiteHelper.UpdateData(out sError, sSql,true); if (bResult) Common.DisplayMsg(this.Text, "插入成功"); InitGrid(); } private void button2_Click(object sender, EventArgs e) { sError = string.Empty; int iMaxID = SqlLiteHelper.GetMaxID(out sError, "id", "test"); string sSql = "update test set name='name_jonse',remark='remark_jonse' where id=" + iMaxID; sError = string.Empty; bool bResult = SqlLiteHelper.UpdateData(out sError, sSql, true); if (bResult) Common.DisplayMsg(this.Text, "修改成功"); InitGrid(); } private void button3_Click(object sender, EventArgs e) { sError = string.Empty; int iMaxID = SqlLiteHelper.GetMaxID(out sError, "id", "test"); string sSql = "delete from test where id=" + iMaxID; sError = string.Empty; bool bResult = SqlLiteHelper.UpdateData(out sError, sSql, true); if (bResult) Common.DisplayMsg(this.Text, "删除成功"); InitGrid(); } } (3). 公共类 public abstract class Common { public static void DisplayMsg(string sCaption, string sMsg) { sMsg = sMsg.TrimEnd('!').TrimEnd('!') + " !"; MessageBox.Show(sMsg, sCaption); } public static bool IsNullOrEmptyObject(object oSource) { if (oSource != null) { return string.IsNullOrEmpty(oSource.ToString()); } return true; } } 摘自 keenweiwei的专栏
C#中使用SQLite数据库
SQLite是一个开源、免费的小型的Embeddable RDBMS(关系型数据库),用C实现,内存占用较小,支持绝大数的SQL92标准,现在已变得越来越流行,它的体积很小,被广泛应用于各种不同类型的应用中。SQLite已经是世界上布署得最广泛的SQL数据库引擎,被用在无以计数的桌面电脑应用中,还有消费电子设备中,如移动电话、掌上电脑和MP3播放器等。 SQLite 的关键字列表, 支持的sql语法 System.Data.SQLite http://sqlite.phxsoftware.com/ 是Sqlite在.NET下的最新实现。 简单介绍如下: System.Data.SQLite 是一个原始SQLite的加强版. 它将是一个原版的sqlite3.dll完全替代品 (你甚至就可以把它重命名为sqlite3.dll). 它不需要链接.NET 运行时,所以可以脱离.NET独立发布, 然而它内嵌了一个完整的 ADO.NET 2.0 引擎,为开发提供了完整的支持. 特性简介: 完整的 ADO.NET 2.0 实现 整个工程完全基于VS2005 和 ADO.NET 2.0全新构建, 使用了全部的ADO.NET framework新特性. 包括完整的 DbProviderFactory 支持, 自动的分布式事务调用, 广泛的模式支持, 此外所有的类都是从 ADO.NET 2.0 的基类继承下来的. 支持完整和精简的 .NET Framework 以及 C/C++ 这个库不需要链接依赖.NET运行时,100%兼容原始的sqlite3.dll,可以使用非托管的C/C++ 进行开发. 可移植的数据库文件 未加密的 SQLite 数据库文件可以自由的跨平台和处理器使用,包括非Windows平台. 加密之后的数据库可以在全部Windows平台上使用. 可以信赖的速度,比包括Sql Server Mobile 在内的其它大多数嵌入式数据库都要快速 SQLite'安装所占用的空间相对于Sql Mobile可谓忽略不计了. 它在运行的时候占用更少的内存,同时生成的数据库也更小. 数据库加密 可以对整个数据库文件进行加密. 支持二进制和明文的密码. 支持使用Visual Studio 2005 设计 你可以向Server Explorer添加一个SQLite 连接, 使用查询设计器创建处查询语句, 向一个数据集中拖拽一个表格等等! SQLite的开发者可以在包括体验版在内的各种Visual Studio 2005下工作. 单文件再发布包容量在400kb以下 将SQLite本身和ADO.NET 封装捆绑编译在一起. 预编译的二进制文件提供了 x86, IA64, x64 和ARM 的版本. 广泛的SQL语言支持 SQLite 支持大部分的SQL92 标准(see below). 支持命名和未命名的参数以 UTF-8 和UTF-16 编码通过优化的管道传入SQLite 内核. 用户自定义的函数 和 排序 全面支持用户自定义函数和排序方式,意味着你可以用自己喜欢的.NET语言来实现SQLite没有提供的特性. 这一切将非常的简单. 提供了全部的源代码. 100% 免费. 全部的封装库源代码都是公有的. 无论是个人还是商业应用都没有任何的协议约束. 下载地址:http://sourceforge.net/projects/sqlite-dotnet2/files/ 下载后安装,在安装路径下找到 System.Data.SQLite.DLL,复制到项目中,添加引用,就可以直接使用了。 SQLite GUI工具很多,SQLite GUI客户端列表 http://www.sqlite.org/cvstrac/wiki?p=ManagementTools 我使用的“SQLite Administrator” 下载地址:http://download.orbmu2k.de/files/sqliteadmin.zip 下载不用安装就可使用,图形化界面,操作起来简单方便。 在网上搜索到一个 SQLite Helper类基于.net c#的SQLite数据库操作类 代码如下: 代码 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Web; 5 using System.Configuration; 6 using System.Data; 7 using System.Data.SQLite; 8 namespace DAL 9 10 { 11 public class Sqlite 12 13 { 14 /// <summary> 15 /// 获得连接对象 16 /// </summary> 17 /// <returns></returns> 18 public static SQLiteConnection GetSQLiteConnection() 19 { 20 return new SQLiteConnection("Data Source=" + System.Web.HttpContext.Current.Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["db"].ToString())); 21 } 22 23 private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p) 24 { 25 if (conn.State != ConnectionState.Open) 26 conn.Open(); 27 cmd.Parameters.Clear(); 28 cmd.Connection = conn; 29 cmd.CommandText = cmdText; 30 cmd.CommandType = CommandType.Text; 31 cmd.CommandTimeout = 30; 32 if (p != null) 33 34 { 35 foreach (object parm in p) 36 cmd.Parameters.AddWithValue(string.Empty, parm); 37 //for (int i = 0; i < p.Length; i++) 38 // cmd.Parameters[i].Value = p[i]; 39 } 40 } 41 public static DataSet ExecuteDataset(string cmdText, params object[] p) 42 { 43 DataSet ds = new DataSet(); 44 SQLiteCommand command = new SQLiteCommand(); 45 using (SQLiteConnection connection = GetSQLiteConnection()) 46 { 47 PrepareCommand(command, connection, cmdText, p); 48 SQLiteDataAdapter da = new SQLiteDataAdapter(command); 49 da.Fill(ds); 50 } 51 return ds; 52 } 53 public static DataRow ExecuteDataRow(string cmdText, params object[] p) 54 { 55 DataSet ds = ExecuteDataset(cmdText, p); 56 if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) 57 return ds.Tables[0].Rows[0]; 58 return null; 59 } 60 /// <summary> 61 /// 返回受影响的行数 62 /// </summary> 63 /// <param name="cmdText">a</param> 64 /// <param name="commandParameters">传入的参数</param> 65 /// <returns></returns> 66 public static int ExecuteNonQuery(string cmdText, params object[] p) 67 { 68 SQLiteCommand command = new SQLiteCommand(); 69 using (SQLiteConnection connection = GetSQLiteConnection()) 70 { 71 PrepareCommand(command, connection, cmdText, p); 72 return command.ExecuteNonQuery(); 73 } 74 } 75 /// <summary> 76 /// 返回SqlDataReader对象 77 /// </summary> 78 /// <param name="cmdText"></param> 79 /// <param name="commandParameters">传入的参数</param> 80 /// <returns></returns> 81 public static SQLiteDataReader ExecuteReader(string cmdText, params object[] p) 82 { 83 SQLiteCommand command = new SQLiteCommand(); 84 SQLiteConnection connection = GetSQLiteConnection(); 85 try 86 { 87 PrepareCommand(command, connection, cmdText, p); 88 SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); 89 return reader; 90 } 91 catch 92 { 93 connection.Close(); 94 throw; 95 } 96 } 97 /// <summary> 98 /// 返回结果集中的第一行第一列,忽略其他行或列 99 /// </summary> 100 /// <param name="cmdText"></param> 101 /// <param name="commandParameters">传入的参数</param> 102 /// <returns></returns> 103 public static object ExecuteScalar(string cmdText, params object[] p) 104 { 105 SQLiteCommand cmd = new SQLiteCommand(); 106 using (SQLiteConnection connection = GetSQLiteConnection()) 107 { 108 PrepareCommand(cmd, connection, cmdText, p); 109 return cmd.ExecuteScalar(); 110 } 111 } 112 /// <summary> 113 /// 分页 114 /// </summary> 115 /// <param name="recordCount"></param> 116 /// <param name="pageIndex"></param> 117 /// <param name="pageSize"></param> 118 /// <param name="cmdText"></param> 119 /// <param name="countText"></param> 120 /// <param name="p"></param> 121 /// <returns></returns> 122 public static DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, params object[] p) 123 { 124 if (recordCount < 0) 125 recordCount = int.Parse(ExecuteScalar(countText, p).ToString()); 126 DataSet ds = new DataSet(); 127 SQLiteCommand command = new SQLiteCommand(); 128 using (SQLiteConnection connection = GetSQLiteConnection()) 129 { 130 PrepareCommand(command, connection, cmdText, p); 131 SQLiteDataAdapter da = new SQLiteDataAdapter(command); 132 da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result"); 133 } 134 return ds; 135 } 136 } 137 } 在VS中使用System.Data.SQLite实现增删改查功能,网上有很多相关实例: 代码 1 using System; 2 using System.Collections.Generic; 3 using System.Web; 4 using System.Web.UI; 5 using System.Web.UI.WebControls; 6 using System.Data.SQLite; 7 8 namespace Demo 9 { 10 public partial class TestSqlLite : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 15 } 16 17 protected void btnTest_Click(object sender, EventArgs e) 18 { 19 SQLiteConnection.ClearAllPools(); 20 SQLiteConnection.CreateFile(Server.MapPath("~") + "/UserData.dbx"); 21 SQLiteConnection conn = new SQLiteConnection("Data Source=" + Server.MapPath("~" + "/UserData.dbx")); 22 conn.Open(); 23 Response.Write("打开数据库成功~~<br />"); 24 25 SQLiteCommand cmd = new SQLiteCommand(); 26 cmd.CommandText = "create table Users (UserID int primary key,UserName varchar(100) not null,UserPassword varchar(100) not null)"; 27 cmd.Connection = conn; 28 cmd.ExecuteNonQuery(); 29 30 for (int i = 0; i < 100; i++) 31 { 32 cmd.CommandText = "insert into Users (UserID,UserName,UserPassword) values (" + i + ",'TestUser_" + i + "','" + DateTime.Now.ToString().Replace(" ", "-").Replace(":", "-") + "')"; 33 cmd.ExecuteNonQuery(); 34 } 35 36 Response.Write("插入成功~~<br />"); 37 38 cmd.CommandText = "select Username from Users where UserID=1"; 39 cmd.Connection = conn; 40 string tempUserName = cmd.ExecuteScalar().ToString(); 41 42 Response.Write("单个值查询结果为:" + tempUserName + "<br /><br />"); 43 44 45 cmd.CommandText = "select * from Users "; 46 cmd.Connection = conn; 47 SQLiteDataReader sdrInfo = cmd.ExecuteReader(); 48 if (sdrInfo != null) 49 { 50 int userID = 0; 51 string userName = string.Empty; 52 string userPassword = string.Empty; 53 while (sdrInfo.Read()) 54 { 55 userID = Convert.ToInt32(sdrInfo["UserID"]); 56 userName = sdrInfo["UserName"].ToString(); 57 userPassword = sdrInfo["UserPassword"].ToString(); 58 59 Response.Write("UserID:" + userID + "<br />"); 60 Response.Write("UserName:" + userName + "<br />"); 61 Response.Write("UserPassword:" + userPassword + "<br />"); 62 Response.Write("<br />"); 63 } 64 sdrInfo.Close(); 65 sdrInfo.Dispose(); 66 } 67 68 cmd.CommandText = "update Users set UserPassword='linxiang'"; 69 cmd.Connection = conn; 70 cmd.ExecuteNonQuery(); 71 Response.Write("更新数据库中的数据成功."); 72 73 Response.Write("以下结果为查询从数据库中经过编辑过后的数据项<br /><br />"); 74 cmd.CommandText = "select * from Users "; 75 cmd.Connection = conn; 76 sdrInfo = cmd.ExecuteReader(); 77 if (sdrInfo != null) 78 { 79 int userID = 0; 80 string userName = string.Empty; 81 string userPassword = string.Empty; 82 while (sdrInfo.Read()) 83 { 84 userID = Convert.ToInt32(sdrInfo["UserID"]); 85 userName = sdrInfo["UserName"].ToString(); 86 userPassword = sdrInfo["UserPassword"].ToString(); 87 88 Response.Write("UserID:" + userID + "<br />"); 89 Response.Write("UserName:" + userName + "<br />"); 90 Response.Write("UserPassword:" + userPassword + "<br />"); 91 Response.Write("<br />"); 92 } 93 sdrInfo.Close(); 94 sdrInfo.Dispose(); 95 } 96 97 conn.Clone(); 98 conn.Dispose(); 99 } 100 } 101 } 相关参考 System.Data.SQLite数据库简介
SQLite数据库操作类
配置<add key="SQLString" value="~demo.db"/> /************************************** * 作用:SQLLite Server操作实现 * 作者:Nick.Yan * 日期: 2009-03-29 * 网址:www.redglove.net **************************************/ using System; using System.Collections; using System.Collections.Specialized; using System.Data; using System.Data.SQLite;//这个可以去网上下载 using System.Configuration; public class SQLiteHelper { //数据库连接字符串(web.config来配置),可以动态更改SQLString支持多数据库. public static string connectionString = "Data Source=" + System.Web.HttpContext.Current.Server.MapPath( ConfigurationManager.AppSettings["SQLString"]); public SQLiteHelper() { } #region 公用方法 public static int GetMaxID(string FieldName, string TableName) { string strsql = "select max(" + FieldName + ")+1 from " + TableName; object obj = GetSingle(strsql); if (obj == null) { return 1; } else { return int.Parse(obj.ToString()); } } public static bool Exists(string strSql) { object obj = GetSingle(strSql); int cmdresult; if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { cmdresult = 0; } else { cmdresult = int.Parse(obj.ToString()); } if (cmdresult == 0) { return false; } else { return true; } } public static bool Exists(string strSql, params SQLiteParameter[] cmdParms) { object obj = GetSingle(strSql, cmdParms); int cmdresult; if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { cmdresult = 0; } else { cmdresult = int.Parse(obj.ToString()); } if (cmdresult == 0) { return false; } else { return true; } } #endregion #region 执行简单SQL语句 /// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="SQLString">SQL语句</param> /// <returns>影响的记录数</returns> public static int ExecuteSql(string SQLString) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection)) { try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (System.Data.SQLite.SQLiteException E) { connection.Close(); throw new Exception(E.Message); } } } } /// <summary> /// 执行SQL语句,设置命令的执行等待时间 /// </summary> /// <param name="SQLString"></param> /// <param name="Times"></param> /// <returns></returns> public static int ExecuteSqlByTime(string SQLString, int Times) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection)) { try { connection.Open(); cmd.CommandTimeout = Times; int rows = cmd.ExecuteNonQuery(); return rows; } catch (System.Data.SQLite.SQLiteException E) { connection.Close(); throw new Exception(E.Message); } } } } /// <summary> /// 执行多条SQL语句,实现数据库事务。 /// </summary> /// <param name="SQLStringList">多条SQL语句</param> public static void ExecuteSqlTran(ArrayList SQLStringList) { using (SQLiteConnection conn = new SQLiteConnection(connectionString)) { conn.Open(); SQLiteCommand cmd = new SQLiteCommand(); cmd.Connection = conn; SQLiteTransaction tx = conn.BeginTransaction(); cmd.Transaction = tx; try { for (int n = 0; n < SQLStringList.Count; n++) { string strsql = SQLStringList[n].ToString(); if (strsql.Trim().Length > 1) { cmd.CommandText = strsql; cmd.ExecuteNonQuery(); } } tx.Commit(); } catch (System.Data.SQLite.SQLiteException E) { tx.Rollback(); throw new Exception(E.Message); } } } /// <summary> /// 执行带一个存储过程参数的的SQL语句。 /// </summary> /// <param name="SQLString">SQL语句</param> /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param> /// <returns>影响的记录数</returns> public static int ExecuteSql(string SQLString, string content) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { SQLiteCommand cmd = new SQLiteCommand(SQLString, connection); SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String); myParameter.Value = content; cmd.Parameters.Add(myParameter); try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (System.Data.SQLite.SQLiteException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } /// <summary> /// 执行带一个存储过程参数的的SQL语句。 /// </summary> /// <param name="SQLString">SQL语句</param> /// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param> /// <returns>影响的记录数</returns> public static object ExecuteSqlGet(string SQLString, string content) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { SQLiteCommand cmd = new SQLiteCommand(SQLString, connection); SQLiteParameter myParameter = new SQLiteParameter("@content", DbType.String); myParameter.Value = content; cmd.Parameters.Add(myParameter); try { connection.Open(); object obj = cmd.ExecuteScalar(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (System.Data.SQLite.SQLiteException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } /// <summary> /// 向数据库里插入图像格式的字段(和上面情况类似的另一种实例) /// </summary> /// <param name="strSQL">SQL语句</param> /// <param name="fs">图像字节,数据库的字段类型为image的情况</param> /// <returns>影响的记录数</returns> public static int ExecuteSqlInsertImg(string strSQL, byte[] fs) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { SQLiteCommand cmd = new SQLiteCommand(strSQL, connection); SQLiteParameter myParameter = new SQLiteParameter("@fs", DbType.Binary); myParameter.Value = fs; cmd.Parameters.Add(myParameter); try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (System.Data.SQLite.SQLiteException E) { throw new Exception(E.Message); } finally { cmd.Dispose(); connection.Close(); } } } /// <summary> /// 执行一条计算查询结果语句,返回查询结果(object)。 /// </summary> /// <param name="SQLString">计算查询结果语句</param> /// <returns>查询结果(object)</returns> public static object GetSingle(string SQLString) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection)) { try { connection.Open(); object obj = cmd.ExecuteScalar(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (System.Data.SQLite.SQLiteException e) { connection.Close(); throw new Exception(e.Message); } } } } /// <summary> /// 执行查询语句,返回SQLiteDataReader(使用该方法切记要手工关闭SQLiteDataReader和连接) /// </summary> /// <param name="strSQL">查询语句</param> /// <returns>SQLiteDataReader</returns> public static SQLiteDataReader ExecuteReader(string strSQL) { SQLiteConnection connection = new SQLiteConnection(connectionString); SQLiteCommand cmd = new SQLiteCommand(strSQL, connection); try { connection.Open(); SQLiteDataReader myReader = cmd.ExecuteReader(); return myReader; } catch (System.Data.SQLite.SQLiteException e) { throw new Exception(e.Message); } //finally //不能在此关闭,否则,返回的对象将无法使用 //{ // cmd.Dispose(); // connection.Close(); //} } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet Query(string SQLString) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { DataSet ds = new DataSet(); try { connection.Open(); SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection); command.Fill(ds, "ds"); } catch (System.Data.SQLite.SQLiteException ex) { throw new Exception(ex.Message); } return ds; } } public static DataSet Query(string SQLString, string TableName) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { DataSet ds = new DataSet(); try { connection.Open(); SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection); command.Fill(ds, TableName); } catch (System.Data.SQLite.SQLiteException ex) { throw new Exception(ex.Message); } return ds; } } /// <summary> /// 执行查询语句,返回DataSet,设置命令的执行等待时间 /// </summary> /// <param name="SQLString"></param> /// <param name="Times"></param> /// <returns></returns> public static DataSet Query(string SQLString, int Times) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { DataSet ds = new DataSet(); try { connection.Open(); SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection); command.SelectCommand.CommandTimeout = Times; command.Fill(ds, "ds"); } catch (System.Data.SQLite.SQLiteException ex) { throw new Exception(ex.Message); } return ds; } } #endregion #region 执行带参数的SQL语句 /// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="SQLString">SQL语句</param> /// <returns>影响的记录数</returns> public static int ExecuteSql(string SQLString, params SQLiteParameter[] cmdParms) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand cmd = new SQLiteCommand()) { try { PrepareCommand(cmd, connection, null, SQLString, cmdParms); int rows = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return rows; } catch (System.Data.SQLite.SQLiteException E) { throw new Exception(E.Message); } } } } /// <summary> /// 执行多条SQL语句,实现数据库事务。 /// </summary> /// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SQLiteParameter[])</param> public static void ExecuteSqlTran(Hashtable SQLStringList) { using (SQLiteConnection conn = new SQLiteConnection(connectionString)) { conn.Open(); using (SQLiteTransaction trans = conn.BeginTransaction()) { SQLiteCommand cmd = new SQLiteCommand(); try { //循环 foreach (DictionaryEntry myDE in SQLStringList) { string cmdText = myDE.Key.ToString(); SQLiteParameter[] cmdParms = (SQLiteParameter[]) myDE.Value; PrepareCommand(cmd, conn, trans, cmdText, cmdParms); int val = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); trans.Commit(); } } catch { trans.Rollback(); throw; } } } } /// <summary> /// 执行一条计算查询结果语句,返回查询结果(object)。 /// </summary> /// <param name="SQLString">计算查询结果语句</param> /// <returns>查询结果(object)</returns> public static object GetSingle(string SQLString, params SQLiteParameter[] cmdParms) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand cmd = new SQLiteCommand()) { try { PrepareCommand(cmd, connection, null, SQLString, cmdParms); object obj = cmd.ExecuteScalar(); cmd.Parameters.Clear(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { return null; } else { return obj; } } catch (System.Data.SQLite.SQLiteException e) { throw new Exception(e.Message); } } } } /// <summary> /// 执行查询语句,返回SQLiteDataReader (使用该方法切记要手工关闭SQLiteDataReader和连接) /// </summary> /// <param name="strSQL">查询语句</param> /// <returns>SQLiteDataReader</returns> public static SQLiteDataReader ExecuteReader(string SQLString, params SQLiteParameter[] cmdParms) { SQLiteConnection connection = new SQLiteConnection(connectionString); SQLiteCommand cmd = new SQLiteCommand(); try { PrepareCommand(cmd, connection, null, SQLString, cmdParms); SQLiteDataReader myReader = cmd.ExecuteReader(); cmd.Parameters.Clear(); return myReader; } catch (System.Data.SQLite.SQLiteException e) { throw new Exception(e.Message); } //finally //不能在此关闭,否则,返回的对象将无法使用 //{ // cmd.Dispose(); // connection.Close(); //} } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet Query(string SQLString, params SQLiteParameter[] cmdParms) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { SQLiteCommand cmd = new SQLiteCommand(); PrepareCommand(cmd, connection, null, SQLString, cmdParms); using (SQLiteDataAdapter da = new SQLiteDataAdapter(cmd)) { DataSet ds = new DataSet(); try { da.Fill(ds, "ds"); cmd.Parameters.Clear(); } catch (System.Data.SQLite.SQLiteException ex) { throw new Exception(ex.Message); } return ds; } } } public static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, SQLiteTransaction trans, string cmdText, SQLiteParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = CommandType.Text;//cmdType; if (cmdParms != null) { foreach (SQLiteParameter parameter in cmdParms) { if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null)) { parameter.Value = DBNull.Value; } cmd.Parameters.Add(parameter); } } } #endregion #region 参数转换 /// <summary> /// 放回一个SQLiteParameter /// </summary> /// <param name="name">参数名字</param> /// <param name="type">参数类型</param> /// <param name="size">参数大小</param> /// <param name="value">参数值</param> /// <returns>SQLiteParameter的值</returns> public static SQLiteParameter MakeSQLiteParameter(string name, DbType type, int size, object value) { SQLiteParameter parm = new SQLiteParameter(name, type, size); parm.Value = value; return parm; } public static SQLiteParameter MakeSQLiteParameter(string name, DbType type, object value) { SQLiteParameter parm = new SQLiteParameter(name, type); parm.Value = value; return parm; } #endregion } 调用方法 复制 保存 /// <summary> /// 判断用户是否存在 /// </summary> /// <param name="name">用户名称</param> /// <returns></returns> public bool UserExists(string name) { StringBuilder strSql = new StringBuilder(); strSql.Append("select count(*) n from Users"); strSql.Append(" where UserName=@UserName "); SQLiteParameter[] parameters = { SQLiteHelper.MakeSQLiteParameter("@UserName", DbType.String,30,name)}; return SQLiteHelper.Exists(strSql.ToString(), parameters); } /// <summary> /// 增加一个用户 /// </summary> /// <param name="name">用户名</param> /// <param name="pwd">密码</param> /// <returns></returns> public int CreateUser(string name, string pwd) { int ret = 0; if (!UserExists(name)) { StringBuilder strSql = new StringBuilder(); strSql.Append("insert into t_UserGroup("); strSql.Append("UserName,Password)"); strSql.Append(" values ("); strSql.Append("@UserName,@Password)"); SQLiteParameter[] parameters = { SQLiteHelper.MakeSQLiteParameter("@UserName", DbType.String,30,name), SQLiteHelper.MakeSQLiteParameter("@Password", DbType.String,128,pwd) }; if (SQLiteHelper.ExecuteSql(strSql.ToString(), parameters) >= 1) { ret = 1; } } else { ret = 2; } return ret; } /// <summary> /// 更新一条数据 /// </summary> /// <param name="model">用户分组实体类</param> /// <returns></returns> public bool UpdateUser(int id, string name, string pwd) { StringBuilder strSql = new StringBuilder(); strSql.Append("update Users set "); strSql.Append("UserName=@UserName,"); strSql.Append("Password=@Password"); strSql.Append(" where UserID=@UserID"); SQLiteParameter[] parameters = { SQLiteHelper.MakeSQLiteParameter("@UserID", DbType.Int32,11,id), SQLiteHelper.MakeSQLiteParameter("@UserName", DbType.String,30,name), SQLiteHelper.MakeSQLiteParameter("@Password", DbType.String,128,pwd)}; if (SQLiteHelper.ExecuteSql(strSql.ToString(), parameters) >= 1) { return true; } else { return false; } } /// <summary> /// 删除用户 /// </summary> /// <param name="ID">用户ID</param> /// <returns></returns> public int DeleteUser(int id) { int ret = 0; string strSql3 = "delete from Users where UserID=@UserID"; SQLiteParameter[] parameters = { SQLiteHelper.MakeSQLiteParameter("@UserID", DbType.Int32,4,id)}; if (SQLiteHelper.ExecuteSql(strSql3, parameters) >= 1) { ret = 1; } else { ret = 0; } return ret; } /// <summary> /// 获得用户分组数据列表 /// </summary> /// <param name="strWhere">Where条件</param> /// <returns></returns> public DataSet GetUserList(string strWhere) { StringBuilder strSql = new StringBuilder(); strSql.Append("select * FROM Users "); if (strWhere.Trim() != "") { strSql.Append(" where " + strWhere); } strSql.Append(" order by UserID desc"); return SQLiteHelper.Query(strSql.ToString()); } 注意事项 1. @@IDENTITY LAST_INSERT_ROWID() 2. SELECT cn = COUNT(*) FROM ... SELECT COUNT(*) cn FROM ... 3. LIMIT startIndex,itemCn 这儿的startIndex是从0开始的,而ROW_NUMBER()是从1开始的 4. sqlite中没有SELECT TOP,用LIMIT即可 5. SQLite自增字段,如果在事务中插入数据失败,并不会占用增长后的id,而sql server中对应的id将无效 6. SQLite中没有GETDATE日期函数,在类中加入参数如下DbType.DateTime,DateTime.Now.ToString("s") 7. SQLite支持REPLACE INTO语法,sql server 2008中支持merge to
System.Data.SQLite数据库简介
SQLite介绍 在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义、表、索引和数据本身)都保存在一个单一的文件中。并且,SQLite是一个用C实现的类库,它在内存消耗、文件体积、简单性方面都有不错的表现,如果数据在10W条以下,查询速度也是相当快的。 SQLite具有以下特征: 实现多数SQL92的标准,包括事务(原子性、一致性、隔离性和持久性)、触发器和大多数的复杂查询。 不对插入或者更新的数据进行类型检查,你可以将字符串插入到整数列中(这个可能让有些用户不太适应)。 支持Windows/Linux/Unix等主流系统,还支持嵌入式系统如Android或Windows Mobile。 System.Data.SQLite介绍 System.Data.SQLite是SQLite的加强版,它可以无需.NET Framework支持,由于它内部包含了一个ADO.NET 2.0引擎,所以.NET开发人员可以利用System.Data.SQLite方便地开发.NET程序。 System.Data.SQLite及SQLite也有一些限制,比如不支持行级及表级锁,当一个连接锁定数据库以用于写入数据,其它的数据库连接只能等待那个连接操作完成之后进行读写操作,SQLite.NET尝试在超时期内多次尝试。 实际上对于大型的应用我们都会选择一些大型专业的数据库,System.Data.SQLite和SQLite适合于一些受限的场合,比如手机等。在这里我讲一个真实的经历,在此前我曾经做过一个小型系统,要分析三个Excel文件,其中两个的记录大约在400条左右,而另外一个大约是1万条左右,对于这么一个系统如果使用数据库,即使单机版的Access,导入之后利用数据库的特性进行分析,将是一个相对较为简单的事情,因为我们可以在数据库里使用连接查询,还可以对记录使用数据库函数,但是对方提供的信息是部署的机器上尽管安装了Office,但是只是安装了Word、Excel和Outlook,而没有Access,对方也不希望安装其它的软件,由于我也不能确定没有安装Access的机器上是否能通过OleDB访问.mdb文件,所以没有办法,只有才有内存表的形式,即将Excel中的数据读取到DataTable中,然后对三个DataTable进行分析,尽管做了很多优化,但是效率仍然不是太理想。对于这种情况,如果我当时知道System.Data.SQLite就好办多了,将三个Excel中的数据导入到System.Data.SQLite中,然后利用System.Data.SQLite提供的函数处理起来是相当省事和方便的。对于System.Data.SQLite来说,部署时不需要安装,仅需要一个System.Data.SQLite.dll就够了,这个dll仅866K!而且它不需要像使用Com组件那样需要注册。 在VS2008中操作System.Data.SQLite 为了方便开发者,System.Data.SQLite提供了VS2005和VS2008的支持,甚至还支持.NET 3.5 SP1中的Entity Framework,下面是在VS2008中使用System.Data.SQLite设计器的情况: 首先打开VS2008中的服务器资源管理器,如下图: 接着在数据连接上点击鼠标右键,如下图所示: 然后选择“添加连接”,如下图所示: 这时候选择System.Data.SQLite使用的数据库文件,文件后缀默认是.db3,还可以点击下方的“测试连接”按钮,如果没有问题就会弹出正确的对话框,点击“确定”按钮之后在服务器资源管理器中就会出现如下的情况: 这样我们就可以像操作SQL Server中的库一样操作System.Data.SQLite中的表了。 System.Data.SQLite数据库通用类 针对对数据库的操作情况,分为以下几种情况: 创建数据库文件; 返回DataTable; 返回DataReader; 执行增删改,返回受影响的行数; 执行查询,返回第一行第一列(通常用于带有行函数的查询,如SUM/AVG/COUNT等); 返回库中所有的表; 因为在System.Data.SQLite中不存在存储过程,所以所有的操作都是基于文本的SQL语句,为了避免SQL注入,所以使用了参数化的SQL语句,这个数据库通用类如下: [c-sharp]view plaincopy 1 using System; 2 using System.Data; 3 using System.Data.Common; 4 using System.Data.SQLite; 5 6 namespace SQLiteQueryBrowser 7 { 8 /// <summary> 9 /// 说明:这是一个针对System.Data.SQLite的数据库常规操作封装的通用类。 10 /// 作者:zhoufoxcn(周公) 11 /// 日期:2010-04-01 12 /// Blog:http://zhoufoxcn.blog.51cto.com or http://blog.csdn.net/zhoufoxcn 13 /// Version:0.1 14 /// </summary> 15 public class SQLiteDBHelper 16 { 17 private string connectionString = string.Empty; 18 /// <summary> 19 /// 构造函数 20 /// </summary> 21 /// <param name="dbPath">SQLite数据库文件路径</param> 22 public SQLiteDBHelper(string dbPath) 23 { 24 this.connectionString = "Data Source=" + dbPath; 25 } 26 /// <summary> 27 /// 创建SQLite数据库文件 28 /// </summary> 29 /// <param name="dbPath">要创建的SQLite数据库文件路径</param> 30 public static void CreateDB(string dbPath) 31 { 32 using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbPath)) 33 { 34 connection.Open(); 35 using (SQLiteCommand command = new SQLiteCommand(connection)) 36 { 37 command.CommandText = "CREATE TABLE Demo(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)"; 38 command.ExecuteNonQuery(); 39 40 command.CommandText = "DROP TABLE Demo"; 41 command.ExecuteNonQuery(); 42 } 43 } 44 } 45 /// <summary> 46 /// 对SQLite数据库执行增删改操作,返回受影响的行数。 47 /// </summary> 48 /// <param name="sql">要执行的增删改的SQL语句</param> 49 /// <param name="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 50 /// <returns></returns> 51 public int ExecuteNonQuery(string sql, SQLiteParameter[] parameters) 52 { 53 int affectedRows = 0; 54 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 55 { 56 connection.Open(); 57 using (DbTransaction transaction = connection.BeginTransaction()) 58 { 59 using (SQLiteCommand command = new SQLiteCommand(connection)) 60 { 61 command.CommandText = sql; 62 if (parameters != null) 63 { 64 command.Parameters.AddRange(parameters); 65 } 66 affectedRows = command.ExecuteNonQuery(); 67 } 68 transaction.Commit(); 69 } 70 } 71 return affectedRows; 72 } 73 /// <summary> 74 /// 执行一个查询语句,返回一个关联的SQLiteDataReader实例 75 /// </summary> 76 /// <param name="sql">要执行的查询语句</param> 77 /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 78 /// <returns></returns> 79 public SQLiteDataReader ExecuteReader(string sql, SQLiteParameter[] parameters) 80 { 81 SQLiteConnection connection = new SQLiteConnection(connectionString); 82 SQLiteCommand command = new SQLiteCommand(sql, connection); 83 if (parameters != null) 84 { 85 command.Parameters.AddRange(parameters); 86 } 87 connection.Open(); 88 return command.ExecuteReader(CommandBehavior.CloseConnection); 89 } 90 /// <summary> 91 /// 执行一个查询语句,返回一个包含查询结果的DataTable 92 /// </summary> 93 /// <param name="sql">要执行的查询语句</param> 94 /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 95 /// <returns></returns> 96 public DataTable ExecuteDataTable(string sql, SQLiteParameter[] parameters) 97 { 98 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 99 { 100 using (SQLiteCommand command = new SQLiteCommand(sql, connection)) 101 { 102 if (parameters != null) 103 { 104 command.Parameters.AddRange(parameters); 105 } 106 SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); 107 DataTable data = new DataTable(); 108 adapter.Fill(data); 109 return data; 110 } 111 } 112 113 } 114 /// <summary> 115 /// 执行一个查询语句,返回查询结果的第一行第一列 116 /// </summary> 117 /// <param name="sql">要执行的查询语句</param> 118 /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> 119 /// <returns></returns> 120 public Object ExecuteScalar(string sql, SQLiteParameter[] parameters) 121 { 122 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 123 { 124 using (SQLiteCommand command = new SQLiteCommand(sql, connection)) 125 { 126 if (parameters != null) 127 { 128 command.Parameters.AddRange(parameters); 129 } 130 SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); 131 DataTable data = new DataTable(); 132 adapter.Fill(data); 133 return data; 134 } 135 } 136 } 137 /// <summary> 138 /// 查询数据库中的所有数据类型信息 139 /// </summary> 140 /// <returns></returns> 141 public DataTable GetSchema() 142 { 143 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) 144 { 145 connection.Open(); 146 DataTable data=connection.GetSchema("TABLES"); 147 connection.Close(); 148 //foreach (DataColumn column in data.Columns) 149 //{ 150 // Console.WriteLine(column.ColumnName); 151 //} 152 return data; 153 } 154 } 155 156 } 157 } System.Data.SQLite数据库通用类的用法 下面演示一下刚刚编写的数据库通用类的用法,代码如下: [c-sharp]view plaincopy 158 using System; 159 using System.Collections.Generic; 160 using System.Text; 161 using System.Data; 162 using System.Data.Common; 163 using System.Data.SQLite; 164 using SQLiteQueryBrowser; 165 166 namespace SQLiteDemo 167 { 168 class Program 169 { 170 static void Main(string[] args) 171 { 172 //CreateTable(); 173 //InsertData(); 174 ShowData(); 175 Console.ReadLine(); 176 } 177 178 public static void CreateTable() 179 { 180 string dbPath = "D://Demo.db3"; 181 //如果不存在改数据库文件,则创建该数据库文件 182 if (!System.IO.File.Exists(dbPath)) 183 { 184 SQLiteDBHelper.CreateDB("D://Demo.db3"); 185 } 186 SQLiteDBHelper db = new SQLiteDBHelper("D://Demo.db3"); 187 string sql = "CREATE TABLE Test3(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,Name char(3),TypeName varchar(50),addDate datetime,UpdateTime Date,Time time,Comments blob)"; 188 db.ExecuteNonQuery(sql, null); 189 } 190 191 public static void InsertData() 192 { 193 string sql = "INSERT INTO Test3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)"; 194 SQLiteDBHelper db = new SQLiteDBHelper("D://Demo.db3"); 195 for (char c = 'A'; c <= 'Z'; c++) 196 { 197 for (int i = 0; i < 100; i++) 198 { 199 SQLiteParameter[] parameters = new SQLiteParameter[]{ 200 new SQLiteParameter("@Name",c+i.ToString()), 201 new SQLiteParameter("@TypeName",c.ToString()), 202 new SQLiteParameter("@addDate",DateTime.Now), 203 new SQLiteParameter("@UpdateTime",DateTime.Now.Date), 204 new SQLiteParameter("@Time",DateTime.Now.ToShortTimeString()), 205 new SQLiteParameter("@Comments","Just a Test"+i) 206 }; 207 208 db.ExecuteNonQuery(sql, parameters); 209 } 210 } 211 212 } 213 214 public static void ShowData() 215 { 216 //查询从50条起的20条记录 217 string sql = "select * from test3 order by id desc limit 50 offset 20"; 218 SQLiteDBHelper db = new SQLiteDBHelper("D://Demo.db3"); 219 using (SQLiteDataReader reader = db.ExecuteReader(sql, null)) 220 { 221 while (reader.Read()) 222 { 223 Console.WriteLine("ID:{0},TypeName{1}", reader.GetInt64(0), reader.GetString(1)); 224 } 225 } 226 } 227 228 229 } 230 } 在实际情况中,采用通用类大批量插入数据会有些慢,这是因为在System.Data.SQLite中的操作如果没有指定操作,则会被当做一个事物,如果需要一次性写入大量记录,则建议显式创建一个事物,在这个事务中完成所有的操作比较好,这样的话比每次操作创建一个事物的效率要提升很多。 最终利用VS2008提供的功能,可以看到里面的数据如下: 需要说明的是在System.Data.SQLite中数据类型的规定不适很严格,从创建Test3表的SQL语句来看,表中addDate、UpdateTime、Time分别是DateTime、Date、Time类型字段,但实际上我们插入的时候没有按照这个规定,最终显示的结果也是尽量遵循数据库字段的定义。 总结 System.Data.SQLite确实是一个非常小巧精悍的数据库,作为对SQLite的封装(SQLite可以在Android等类型的手机上利用Java访问),它依然是体较小,同比性能高、内存消耗小、无需安装仅需一个dll就可以运行的优点(如果在Mobile手机上则需要两个文件),唯一的一个缺点是没有比较的GUI(图形用户界面),不过正因为如此它才得以体积小。 在实际开发中没有图形用户界面可能有些不便,我们可以使用VS来查看和操作数据,我自己也做了一个小东东,便于管理和维护数据,界面如下: 如果你要开发数据量在10万条以下的应用,我建议你尝试使用一下System.Data.SQLite,它或许是一个不错的选择。 周公 2010-04-01 分享到: · 上一篇:ADO.NET与ORM的比较(2):NHibernate实现CRUD · 下一篇:ADO.NET与ORM的比较(3):Linq to SQL实现CRUD 查看评论 21楼 pzw520125 2012-04-15 16:33发表 [回复] [引用][举报] 学习,很详细,谢谢分享! 20楼 bs897945043 2012-03-26 09:25发表 [回复] [引用] [举报]
经典sql基本语句大全
下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明: 删除新表:drop table tabname 6、说明: 增加一个列:Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明: 添加主键:Alter table tabname add primary key(col) 说明: 删除主键:Alter table tabname drop primary key(col) 8、说明: 创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明: 创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count * as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 11、说明:几个高级查询运算词 A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、说明:使用外连接 A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 其次,大家来看一些不错的sql语句 1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a 2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b; 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where.. 4、说明:子查询(表名1:a 表名2:b) select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 5、说明:显示文章、提交人和最后回复时间 select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 6、说明:外连接查询(表名1:a 表名2:b) select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 7、说明:在线视图查询(表名1:a ) select * from (SELECT a,b,c FROM a) T where t.a > 1; 8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2 9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 12、说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 13、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 14、说明:前10条记录 select top 10 * form table1 where 范围 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 (select a from tableA ) except (select a from tableB) except (select a from tableC) 17、说明:随机取出10条数据 select top 10 * from tablename order by newid() 18、说明:随机选择记录 select newid() 19、说明:删除重复记录 Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 20、说明:列出数据库里所有的表名 select name from sysobjects where type='U' 21、说明:列出表里的所有的 select name from syscolumns where id=object_id('TableName') 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type vender pcs 电脑 A 1 电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3 23、说明:初始化表table1 TRUNCATE TABLE table1 24、说明:选择从10到15的记录 select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现) 对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环: Randomize RNumber = Int(Rnd*499) +1 While Not objRec.EOF If objRec("ID") = RNumber THEN ... 这里是执行脚本 ... end if objRec.MoveNext Wend 这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了? 采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示: Randomize RNumber = Int(Rnd*499) + 1 SQL = "SELECT * FROM Customers WHERE ID = " & RNumber set objRec = ObjConn.Execute(SQL) Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email") 不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。 再谈随机数 现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。 为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录: SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3 假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码): SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9" 注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。 随机读取若干条记录,测试过 Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id) Sql server:select top n * from 表名 order by newid() mysql select * From 表名 Order By rand() Limit n Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查) 语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ... 使用SQL语句 用...代替过长的字符串显示 语法: SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; Conn.Execute说明 Execute方法 该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种: 1.执行SQL查询语句时,将返回查询得到的记录集。用法为: Set 对象变量名=连接对象.Execute("SQL 查询语言") Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。 2.执行SQL的操作性语言时,没有记录集的返回。此时用法为: 连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option] ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。 ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。 ·BeginTrans、RollbackTrans、CommitTrans方法 这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。 事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。 BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。 SQL语句大全精要 2006/10/26 13:46 DELETE语句 DELETE语句:用于创建一个删除查询,可从列在 FROM 子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用DELETE删除多个记录。 语法:DELETE [table.*] FROM table WHERE criteria 语法:DELETE * FROM table WHERE criteria='查询的字' 说明:table参数用于指定从其中删除记录的表的名称。 criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。 可以使用 Execute 方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。 UPDATE 有关UPDATE,急!!!!!!!!!!! 在ORACLE数据库中 表 A ( ID ,FIRSTNAME,LASTNAME ) 表 B( ID,LASTNAME) 表 A 中原来ID,FIRSTNAME两个字段的数据是完整的 表 B中原来ID,LASTNAME两个字段的数据是完整的 现在要把表 B中的LASTNAME字段的相应的数据填入到A表中LASTNAME相应的位置。两个表中的ID字段是相互关联的。 先谢谢了!!!! update a set a.lastname=(select b.lastname from b where a.id=b.id) 掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。 练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。 在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据操作语言(DML)语句进行处理。 SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。