由于 GUID,C# 模型不支持 sql 查询

C# model is not supporting sql query because of GUID

在数据库中,我的 user_details table 有 "UserId (varchar 255)"。我的模型如下:

    public Guid UserId { get; set; }
    public string Email { get; set; }
    public string Gender { get; set; }

问题是当我通过 UserId 查询它时,我收到关于字符串到 guid 转换的无效转换异常。 这是查询:

SELECT * FROM UserDetails WHERE UserId = '" + new Guid(userId.ToString()) +     "'"

你必须这样使用:

SELECT * FROM UserDetails WHERE UserId = '" + Giud.UserId + "'"

然后为 UserId 选择一个类型..int 例如

更新

public Guid {
  public static string UserId {get;set;}
  public static string Email {get;set;}
  public static string Gender {get;set;}
}

然后,例如,如果您有一个文本框,您要插入的文本将存储在 Guid.UserId 中。比你能像我上面说的那样进行查询。

我认为在您的 table 中,您应该将 [UserId] 声明为 [Uniqueindetifier],它与 GUID [Global Unique Identifier] 相同,并且在 select 查询中只需发送 Unique标识符作为引号内的字符串,如下所示:

"SELECT * FROM UserDetails WHERE UserId = '" + UserId.ToString() + "'"

不要在查询中实例化新的 Guid 对象,因为查询只是一个简单的字符串,您不能在查询中解析对象:

改变这个:

"SELECT * FROM UserDetails WHERE UserId = '" + new Guid(userId.ToString()) + "'"

为此:

"SELECT * FROM UserDetails WHERE UserId = '" + userId.ToString() +  "'"

正如 Scott 提到的(并且考虑到没有提到为您进行参数化的 ORM),使用参数,既可以提高安全性,又可以提高性能。

var sql = "SELECT * FROM UserDetails WHERE UserId = @UserId";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(sql, connection);
    command.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier);
    command.Parameters["@UserId"].Value = userId.ToString();

    // Execute query and return data
}

为了完整起见,如果您只是想内联转换您的 userId(类似于您当前正在做的事情),您可以使用以下内容:

"SELECT * FROM UserDetails WHERE UserId = '" + userId.ToString() +  "'"

但是,我强烈建议不要这样做。在这种情况下,你有一个 Guid 类型,所以你应该不会受到 Sql 注入,但是像这样编写代码会帮助你养成坏习惯,并可能在未来产生问题。我的第一个例子是推荐的方法。

我在数据库 table 声明的异常上发现了问题。正如我在问题中提到的,我的数据库 table UserId 字段是 varchar,这是导致问题的原因当我将其更改为 uniqueidentifier 时,它表示正在工作。