在wince设备上,使用sqlite很方便,基本都能满足项目的需要,速度也不错。在工作中,封装了此类,方便开发。
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SQLite;
using System.Data;
using System.IO;
namespace Austec.DB
{
public class CSqlite : IDisposable
{
public string m_LastError = null;
private string dbPath = "";
private SQLiteConnection sqConn = null;
private SQLiteCommand sqCmd = null;
private SQLiteTransaction transaction = null;
private bool m_Result = false;
public bool Result
{
get { return m_Result; }
}
/// <summary>
/// 不允许通过该方式构造此类
/// </summary>
private CSqlite(){}
/// <summary>
/// 打开数据库
/// </summary>
/// <param name="dbPath">数据库路径</param>
public CSqlite( string dbPath )
{
this.dbPath = dbPath;
}
~CSqlite()
{
Close();
}
#region 打开与关闭
public bool Open()
{
try
{
m_Result = false;
if (sqConn == null)
{
//在打开数据库时,会判断数据库是否存在,如果不存在,则在当前目录下创建一个
sqConn= new SQLiteConnection("Data Source=" + dbPath +";Pooling=true;FailIfMissing=false");
sqCmd = new SQLiteCommand();
sqCmd.Connection = sqConn;
}
if (sqConn.State == ConnectionState.Closed)
{
bool dbExsit = System.IO.File.Exists(dbPath);
sqConn.Open();
/// 如果数据库不存在,sqlite会创建一个空的数据库,在此创建一个无用的表,填充数据库
if (!dbExsit)
{
ExecuteNonQuery("create table Liang ( id nvarchar(1) ) ");
}
}
m_Result = true;
return true;
}
catch (System.Exception ex)
{
m_LastError = ex.Message;
return false;
}
}
public void Dispose()
{
Close();
}
public void Close()
{
if (sqConn != null)
{
if (sqConn.State == ConnectionState.Open)
{
sqConn.Close();
sqConn = null;
sqCmd = null;
}
}
System.Data.SQLite.SQLiteConnection.ClearAllPools();
}
#endregion
/// <summary>
/// 执行不带返回结果的命令
/// </summary>
/// <param name="sqlCmd">查询语句</param>
/// <returns></returns>
public bool ExecuteNonQuery(string sqlCmd )
{
m_LastError = null;
m_Result = false;
try
{
sqCmd.CommandText = sqlCmd;
sqCmd.ExecuteNonQuery();
m_Result = true;
}
catch (System.Exception ex)
{
m_LastError= ex.Message;
return false;
}
return true;
}
/// <summary>
/// 执行SQL命令,并返回Read,Read使用完毕,必须关闭
/// </summary>
/// <param name="sqlCmd"></param>
/// <returns></returns>
public SQLiteDataReader ExecuteQuery(string sqlCmd)
{
m_LastError = null;
m_Result = false;
try
{
sqCmd.CommandText = sqlCmd;
SQLiteDataReader read = sqCmd.ExecuteReader();
m_Result = true;
return read;
}
catch (System.Exception ex)
{
m_LastError = ex.Message;
return null;
}
}
/// <summary>
/// 执行SQL命令,并返回Read,Read使用完毕,必须关闭
/// </summary>
/// <param name="sqlCmd"></param>
/// <returns></returns>
public bool ExecuteQueryTable(string sqlCmd, out DataTable dt)
{
m_LastError = null;
m_Result = false;
dt = new DataTable("liang");
try
{
// 执行查询命令
SQLiteDataReader read = ExecuteQuery(sqlCmd);
if ( m_Result)
{
m_Result = false;
if ( read==null )
{
m_LastError = "sqlite error:未查询到数据!";
return false;
}
/// 添充表
for( int i=0; i<read.FieldCount;i++)
{
dt.Columns.Add(new DataColumn(i.ToString()));
}
while (read.Read())
{
DataRow row= dt.NewRow();
for( int i=0; i<read.FieldCount;i++ )
{
row[i]=read.GetValue(i).ToString();
}
dt.Rows.Add(row);
}
read.Close();
m_Result = true;
return true;
}
return false;
}
catch (System.Exception ex)
{
m_LastError = ex.Message;
return false;
}
}
/// <summary>
/// 执行SQL命令,并返回第一行记录的第一列值
/// </summary>
/// <param name="sqlCmd"></param>
/// <returns></returns>
public object ExecuteScalar( string sqlCmd )
{
m_LastError = null;
m_Result = false;
try
{
sqCmd.CommandText = sqlCmd;
object ob= sqCmd.ExecuteScalar();
if ( ob!=null )
{
m_Result = true;
}
else
{
m_LastError = "sqlite error:未查询到数据";
}
return ob;
}
catch (System.Exception ex)
{
m_LastError = ex.Message;
return null;
}
}
/// <summary>
/// 按照内存表的结构创建表及索引;如果表已经存在,将直接返回
/// </summary>
/// <param name="dt">在创建的表</param>
/// <param name="strIndexField">索引字段,多个字段以逗号分隔</param>
/// <returns></returns>
public bool CreateTable(ref DataTable dt, string strIndexField )
{
try
{
m_Result = false;
if ( dt==null )
{
return false;
}
// 查询表有没有存在
string sql = "select count(*) from sqlite_master where tbl_name='" + dt.TableName + "' and type='table'";
object ob = ExecuteScalar(sql);
if (!m_Result)
{
return false;
}
if (Convert.ToInt32(ob) == 1)
{
m_Result = true;
return true;
}
string strSql="", strCmdSql="";
strCmdSql = " CREATE TABLE " + dt.TableName + " ( ";
for (int i = 0; i < dt.Columns.Count; i++ )
{
strSql += dt.Columns[i].ColumnName + " nvarchar(30) ";
if ( i<dt.Columns.Count-1)
{
strSql += ", ";
}
}
strCmdSql += strSql + " )";
if (!ExecuteNonQuery(strCmdSql))
{
return false;
}
if ( strIndexField!=null && strIndexField.Trim().Length>0 )
{
string[] strIndex = strIndexField.Split(',');
for (int i = 0; i < strIndex.Length; i++)
{
strCmdSql = "CREATE INDEX " + dt.TableName + "_index" + i.ToString() +" ON " + dt.TableName + " ( " + strIndex[i] + " )";
if (!ExecuteNonQuery(strCmdSql))
{
return false;
}
}
}
m_Result = true;
return true;
}
catch (System.Exception ex)
{
m_LastError = ex.Message;
return false;
}
}
/// <summary>
/// 删除表及表的索引
/// </summary>
/// <param name="tablename"></param>
/// <returns></returns>
public bool DropTableAndIndex( string tablename )
{
m_Result = false;
try
{
// 查询表及索引有没有存在
string sql = "select count(*) from sqlite_master where tbl_name='" + tablename + "' and type='table'";
object ob= ExecuteScalar(sql);
if (!m_Result)
{
return false;
}
if ( Convert.ToInt32(ob)==0 )
{
m_Result=true;
return true;
}
string cmdSql = "drop table " + tablename ;
if ( !ExecuteNonQuery(cmdSql) )
{
return false;
}
m_Result = true;
return true;
}
catch (System.Exception ex)
{
m_LastError = ex.Message;
return false;
}
}
/// <summary>
/// 将内存表插入相应的表中
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public bool InsertTable( ref DataTable dt)
{
m_Result = false;
if (dt == null)
{
return false;
}
if ( dt.Rows.Count==0 )
{
m_Result = true;
return true;
}
int i = 0;
string sql = "insert into " + dt.TableName + " values( ";
string sqlData = "", strCmdSql = "";
BeginTransaction();
foreach (DataRow row in dt.Rows)
{
sqlData = "";
for (i = 0; i < dt.Columns.Count; i++)
{
sqlData += "'" + row[i].ToString() + "'";
if (i < dt.Columns.Count - 1)
{
sqlData += ", ";
}
}
strCmdSql = sql + sqlData + " )";
if (!ExecuteNonQuery(strCmdSql))
{
Rollback();
return false;
}
}
Commit();
m_Result = true;
return true;
}
/// <summary>
/// 删除指定表的数据
/// </summary>
/// <param name="tableName">表名</param>
/// <returns></returns>
public bool DeleteTableData( string tableName )
{
m_Result = false;
string sql = "select count(*) from sqlite_master where tbl_name='" + tableName + "' and type='table'";
object ob= ExecuteScalar(sql);
if (!m_Result)
{
return false;
}
m_Result = false;
if ( Convert.ToInt32(ob)==0 )
{
m_LastError = "被删除数据的表不存在!";
return false;
}
sql = "delete from " + tableName;
if ( ExecuteNonQuery(sql) )
{
m_Result = true;
return true;
}
else
{
return false;
}
}
#region 事务操作
public void BeginTransaction()
{
transaction = sqConn.BeginTransaction();
}
public void Commit()
{
transaction.Commit();
}
public void Rollback()
{
transaction.Rollback();
}
#endregion
}
}
分享到:
相关推荐
SQLite3 c# 很好用的封装访问类,直接导入dll使用非常方便!
2. 用数据库类库 DC.CommonDbLiteLib针对SqlServer,MySQL,SQLite,Oracle,ODBC,OleDb,Firebird,PostgreSql,DB2,Informix,SqlServerCe连接进行了封装,一般情况下只需要调用一个IDatabaseInfo接口即可使用,...
ios上sqlite的类库,把在ios上对sqlite的操作封装成一个类,非常方便,供有需要的人使用。
该工程文件中包含有C#工程对NPOI.dll的的读写进行封装成类库的操作,主要是使用C#编写读写Excel的操作函数; 2、OperateExcel工程: 该工程是C++工程主要是为了便于后续在C++项目中广泛的使用NPOI库进行操作Excel...
简化对sqlite的操作,更加方便我们的开发,使用起来简单。
cocos2d-x封装的sqlite3开源库,简便很多
提供数据库连接以及数据增删改查的函数封装
你知道,一些类库把常用的操作封装起来,以后可以直接调用,就节省了普通开发人员的大量精力. 对于CN 大多数公司都是开发MIS系统 说白了就是数据库系统 使用数据访问类库,必将节省大量代码 网上有个通用数据访问类库 ...
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了...
c#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle)
C#.NET万能数据库访问封装类(ACCESS、...这个类封装成dll后,相关数据库连接可在,引用该dll项目的app.config文件中写,如果是web程序,这需要修改代码,将构造函数中获取app.config的信息换成获取web.config的信息。
iphone学习数据库的时候学习的小例子,很简单清晰~使用的是sqlite3,封装类库
二、创建一个实体person类并且给字段和封装 三、创建一个业务类对SQL的CRUD操作 1.getWritableDatabase()和getReadableDatabase()的区别 ,两个方法都可以获取一个用于操作数据库的SQLiteDatabase实例 2.execSQL...
1.数据库操作类支持orm操,支持sqlserver、oracle、access、sqlite, 2.网络通信库可直接在项目中使用,不需要处理粘包等问题; 3.excel操作简单; 4.这些代码陆续维护了10多年; 5.自我感觉这些代码有些用,希望能...
SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库。iOS SDK很早支持了SQLite,在使用时,只需要加入 libsqlite3.dylib 依赖以及引入 sqlite3.h 头文件即可。但是,原生的SQLite API在使用上...
自己封装的sqlite操作库,有使用实例,在vs2013中无异常,有添加类库的说明。
这就需要数据库类库来隐藏不同数据库之间的差异(封装差异),以便我们可以轻松地切换数据库。 该库当前支持MySQL,Firebird和Interbase,PostgreSQL,SQLite3,Oracle,Microsoft SQL Server,Foxpro ODBC,...
ReactiveCocoa简称RAC,就是基于响应式编程思想的Objective-C实践,它是Github的一个开源项目,你可以在这里找到它。 采用MKNetworkKit 网络框架,修改了部分功能,底层支持网络缓存,轻松控制是否启用缓存。 ...
又做了一个javascript直连Sql数据的类库 后来,又想到其实还可以用SQL语句来操作HTML DOM模型 再再再后来,又看到了HTML5中对web DB的实现 所以对webDB,就是chrome和safari中的sqlite的封装 于是乎就有了: 1....
17.4.5 创建一个有范围限制的Cookie 292 17.4.6 删除Cookie 292 17.4.7 浏览器重定向 292 17.4.8 Cookie的常见问题 293 17.5 Cookie应用实例——登录验证 293 17.5.1 HTML表单的设计 293 17.5.2 验证页面的编写 294 ...