我正在使用带有sqlCommand字符串的System.Data.SQLite,这会按预期保存Guid。
使用代码我奇怪的字符保存而不是Guid如下:ù“•»I = {E±gÒ§[,
似乎生成奇怪字符的代码(如SQLite管理员所示):
...
// Constructor in Class
public ProfileUserAssignment()
{
ID = Guid.NewGuid();
_IsNew = true;
SetDefaults();
}
...
...
// Save Method in same class
public ProfileUserAssignment Save()
{
if (_IsNew)
{
Made4Print.SQLite.Repository.Add(this);
}
else
{
Made4Print.SQLite.Repository.Update(this);
}
return Get(this.ID);
}
...
按预期保存Guids的代码:
// Create Administrator User
using (System.Data.SQLite.SQLiteConnection connection = new System.Data.SQLite.SQLiteConnection(Made4Print.SQLite.GetProvider().ConnectionString))
{
connection.Open();
using (System.Data.SQLite.SQLiteCommand sqlCommand = new System.Data.SQLite.SQLiteCommand(connection))
{
StringBuilder sqlQuery = new StringBuilder();
sqlQuery.Append("INSERT INTO [Users] ( ");
sqlQuery.Append("[ID], ");
sqlQuery.Append("[FirstName], ");
sqlQuery.Append("[LastName], ");
sqlQuery.Append("[Username], ");
sqlQuery.Append("[Password], ");
sqlQuery.Append("[Email], ");
sqlQuery.Append("[Phone], ");
sqlQuery.Append("[MobilePhone], ");
sqlQuery.Append("[LoginEnabledPropertyValue], ");
sqlQuery.Append("[SendEmailsPropertyValue], ");
sqlQuery.Append("[SystemPropertyValue] ");
sqlQuery.Append(" ) VALUES ( ");
sqlQuery.Append("'2bdcac4d-019f-4213-b635-86ae8f7d757e', ");
sqlQuery.Append("'Administrator', ");
sqlQuery.Append("'User', ");
sqlQuery.Append("'xxxxx', ");
sqlQuery.Append("'" + Security.HashPassword("xxxxx") + "', ");
sqlQuery.Append("'', ");
sqlQuery.Append("'', ");
sqlQuery.Append("'', ");
sqlQuery.Append("1, ");
sqlQuery.Append("1, ");
sqlQuery.Append("1 ");
sqlQuery.Append(" ) ");
sqlCommand.CommandText = sqlQuery.ToString();
sqlCommand.ExecuteNonQuery();
}
connection.Close();
}
使用SQLite管理员,我在一个表中看到了预期的Guids或在另一个表中看到了两个字符(没有尝试在一个表中同时进行)
发现新信息:
我刚刚在http://www.connectionstrings.com/sqlite
找到了这个将GUID存储为文本 通常,GUID以二进制格式存储。使用此连接字符串将GUID存储为文本。
Data Source = filename; Version = 3; BinaryGUID = False;
对此有任何意见吗?
答案 0 :(得分:0)
SQLite没有我所读过的“类型”的概念所以我的第一个猜测是它将值转换为字符串,而你的编码让它变得疯狂。那么,第一个问题:您的数据库上的默认编码和计算机上的默认编码是什么?
接下来 - 它不工作吗?有时候在不要求去看厨房的情况下享用香肠是个好主意。在这种情况下,SQLite正在做一些时髦的事情,但如果它返回值OK,那么人们可能会建议你不要看它们:)。
答案 1 :(得分:0)
看起来我需要将ID更改为字符串而不是Guids。
我似乎已经为bools做了这个,但这样做只是为了包装ID是没有意义的:
public int LoginEnabledPropertyValue { get; set; }
[SubSonicIgnore]
public bool LoginEnabled
{
get
{
return (LoginEnabledPropertyValue > 0 ? true : false);
}
set
{
LoginEnabledPropertyValue = (value ? 1 : 0);
}
}
答案 2 :(得分:0)
如果使用没有BinaryGUID = False的GUID;标记你必须使用AddWithValue方法构建查询, 我是这样做的:
string SQL = "select count(*) from Groups where ID = @id";
SQLiteCommand cmd = new SQLiteCommand(SQL);
cmd.Parameters.AddWithValue("@ID", groupId);
cmd.Connection = sql_con;
var ret = cmd.ExecuteScalar();