开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

System.Data.SQLite 中GUID的处理

简介: 原文:System.Data.SQLite 中GUID的处理 项目中正好用到System.Data.SQLite,在手持上使用这个数据库,因为要做数据同步,所以表中的主键都是Guid的数据类型。
+关注继续查看
原文: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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SAP Repository Information System查找Message ID的一个小技巧
SAP Repository Information System查找Message ID的一个小技巧
0 0
Using Big Data to Build Customer Loyalty
Building customer loyalty is essential to any successful business. By understanding the needs of the consumer and tailoring your offerings towards t
1477 0
在 System.Data.OleDb.OleDbException 中第一次偶然出现的“System.Data.dll”类型的异常
C#使用OleDB操作ACCESS插入数据时提示: 在 System.Data.OleDb.OleDbException 中第一次偶然出现的“System.Data.dll”类型的异常 这个错误是在执行: int rlt = updateCmd.ExecuteNonQuery(); 时产生的,但这个信息是在控制台中输出的,而抛出的异常信息通常是:标准表达式中数据类型不匹配。
604 0
csharp:SQLite and Access using C# code read data
SQLite sql script: CREATE TABLE BookKindList ( BookKindID INTEGER PRIMARY KEY AUTOINCREMENT, BookKindName varchar(500) not null, BookKindCode varchar(100) null, BookKindPa
1119 0
csharp: using OleDb Getting the identity of the most recently added record
/// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="SQLString">SQL语句</param> /// <returns>影响的记录数</returns>
835 0
'System.Data.DataRow.DataRow(System.Data.DataRowBuilder)' is inaccessible due to its protection leve
今天声明一个DataRow如下: public DataRow vsDr = new DataRow();在使用的时候提示下面的错误:'System.Data.DataRow.DataRow(System.Data.DataRowBuilder)' is inaccessible due to its protection level 将代码修改为: private DataRo
850 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Building Data Products on
立即下载
Big Data at your Desk with KNIME
立即下载
OPEN SOURCE IN A DATA-DRIVEN WORLD
立即下载