原文:System.Data.SQLite 中GUID的处理

项目中正好用到System.Data.SQLite,在手持上使用这个数据库,因为要做数据同步,所以表中的主键都是Guid的数据类型。

在数据查询和插入的时候,正常的使用System.Data.SQLite来插入:
public bool Add(KingToon.Model.Users model)
{
StringBuilder strSql=new StringBuilder();
strSql.Append("insert into Users(");
strSql.Append("id,num,name,passw,class_id,profession,remark,authority_id)");
strSql.Append(" values (");
strSql.Append("@id,@num,@name,@passw,@class_id,@profession,@remark,@authority_id)");
SQLiteParameter[] parameters = {
new SQLiteParameter("@id", DbType.Guid,16),
new SQLiteParameter("@num", DbType.String,512),
new SQLiteParameter("@name", DbType.String,512),
new SQLiteParameter("@passw", DbType.String,512),
new SQLiteParameter("@class_id", DbType.Guid,16),
new SQLiteParameter("@profession", DbType.String,512),
new SQLiteParameter("@remark", DbType.String,1024),
new SQLiteParameter("@authority_id", DbType.Guid,16)};
parameters[0].Value = Guid.NewGuid();
parameters[1].Value = model.num;
parameters[2].Value = model.name;
parameters[3].Value = model.passw;
parameters[4].Value = model.class_id;
parameters[5].Value = model.profession;
parameters[6].Value = model.remark;
parameters[7].Value = model.authority_id;

int
rows=DbHelperSQLite.ExecuteSql(strSql.ToString(),parameters);
if (rows > 0)
{
return true;
}
else
{
return false;
}
}
这样插入到数据库中的数据类型其实是一个二进制的内容,如果用sql来查询,往往得不到正确的结果。
那么怎么在sql中进行guid字段的比较和查询呢?
看下面的例子你就明白了。

select * from users where class_id =x'D19A5F9A1DB6E44D863BF07B39F843E2';
select hex(id),hex(class_id),hex(x'9A5F9AD1B61D4DE4863BF07B39F843E2') from
users; 
select
 hex('{9A5F9AD1-B61D-4DE4-863B-F07B39F843E2}');
select hex(x'9A5F9AD1B61D4DE4863BF07B39F843E2');

其中:hex()函数是将二进制内容转换成,16进制的字符串。x'XXXXXXX'表示内容是16进制的二进制内容。

在C#中如何组合guid的字符串呢,看下面的代码就明白:
strWhere = " station_id in (select station_id from
StationAuthority where class_id = x'"
     
     
    +
BitConverter.ToString(KingToon.BLL.SystemsIni.G_UserInfo.class_id.ToByteArray()).Replace("-",
string.Empty) + "') and " + strWhere;
     
      return
dal.GetList(strWhere);

需要注意的是:这里一定要使用ToByteArray()方法,然后再转换成16进制字符串,原因是GUID的文本表示和二进制的存储顺序并不是完全一样,如果要知道具体的顺序,debug一下ToByteArray返回的结果就知道了。

另外一个相对而言更加简单的办法:
在连接字符串中加入参数控制,使用文本方式存储GUID。
BinaryGUID=0

System.Data.SQLite 中GUID的处理的更多相关文章

  1. C#里System.Data.SQLite中对GUID的处理

    string sqlstring = "select * from endpoint_policy where HEX([UserGuid]) ='" + CommonHelper ...

  2. System.Data.SQLite

    SQLite介绍 在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义.表.索引和数据本身 ...

  3. System.Data.SQLite数据库简介

    SQLite介绍 在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义.表.索引和数据本身 ...

  4. “System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确

    引用sqlite的程序集时,有时会报如下异常:  "System.BadImageFormatException"类型的未经处理的异常在 PurchaseDevices.Acces ...

  5. IIS中发布后出现Could not load file or assembly'System.Data.SQLite.dll' or one of its depedencies

    [问题]在我本机的开发环境c#连接sqlite3没有问题,可是release版本移植到其他的机器就提示Could not load file or assembly'System.Data.SQLit ...

  6. 网站部署中遇到的问题-未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项

    问题描述: 运行站点抛出错误:未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项 原因: 应用程序池没有启用32位程序. 解决方法: 找到站点对应的应用程序池,设置启用32 ...

  7. 启用SQLite的Data Provider 运行WECOMPANYSITE时遇到ERROR CREATING CONTEXT 'SPRING.ROOT': ERROR THROWN BY A DEPENDENCY OF OBJECT 'SYSTEM.DATA.SQLITE'

    从网上下载的源码WeCompanySite,运行时报错 Error creating context 'spring.root': Error thrown by a dependency of ob ...

  8. .Net4.0以上使用System.Data.Sqlite

    最近对Sqlite感兴趣,就尝试了一下用c#连接,我用的版本是vs2013,默认开发环境是.net4.5,,按照网上的教材,下载了System.Data.Sqlite,然后写了下面这个简单的测试代码, ...

  9. IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法

    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序.              说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈 ...

随机推荐

  1. iOS 项目的文件夹结构能看出你的开发经验

    近期有师弟去面试iOS开发,他谈论到,面试官既然问他怎么分文件夹结构的,并且还详细问到每一个子文件夹的文件名称. 文件夹结构确实非常重要.面试官问他这些无疑是想窥探他的开发经验.清晰的文件夹结构,可让 ...

  2. [TypeScript] Create a fluent API using TypeScript classes

    You can create an easy to chain API using TypeScript classes. Learn about the thisreturn type annota ...

  3. 简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法

    权限系统,Web开发常见标准子系统之一.结合自己的一些思考和实践,从本篇开始权限系统的设计与实现之路. 最近,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇,只是大致介绍下这个 ...

  4. Python爬虫突破封禁的6种常见方法

    转 Python爬虫突破封禁的6种常见方法 2016年08月17日 22:36:59 阅读数:37936 在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长.今天大众好像更倾向于用 ...

  5. 小强的HTML5移动开发之路(39)——jqMobi插件json格式ActionSheet

    在上一篇中我们学会了ActionSheet的使用,细心的朋友可能会发现其中创建列表的格式是HTML的,代码如下: function showCustomHtmlSheet() { $("#a ...

  6. 图片拉伸:IOS开发UIImage中stretchableImageWithLeftCapWidth

    意思就是用来创建一个内容可拉伸,而边角不拉伸的图片,需要两个参数,第一个是左边不拉伸区域的宽度,第二个参数是上面不拉伸的高度.那么接下来的一个像素会被拉伸.例如,leftCapHeight为6,top ...

  7. 增删改查 T-SQL最基本操作

    use test --操作test表 go --查询 select * from stu -- 查询stu里的所有数据 select top 3 * from stu -- 查询stu里前三行数据 s ...

  8. 【9206】 奖学金(NOIP2007)

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成 ...

  9. springboot内置tomcat验证授权回调页面域名

    springboot内置tomcat验证公众号授权回调页面域名 解决方法: 网上下载一个tomcat,在server.xml文件中修改端口为springboot内置tomcat的端口号,复制验证文件到 ...

  10. 配置ANDROID_HOME

    原文:配置ANDROID_HOME 1.在环境变量中设置一个名为ANDROID_HOME,变量值为SDK路径 2.添加至Path中 备注:ANDROID_HOME的变量值仅允许一个