Sqlite Subsonic C#:Guid使用SQL保存为Guid,但在使用代码时使用奇怪的字符

时间:2009-12-27 20:30:02

标签: c# sqlite subsonic

我正在使用带有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;

对此有任何意见吗?

3 个答案:

答案 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();