在数据库中,我的user_details表有"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()) + "'"
正如斯科特所提到的(考虑到没有提到正在为您进行参数化的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 注入的影响,但编写这样的代码将帮助您养成坏习惯并可能在未来产生问题。 我的第一个示例是推荐的方法。
我发现数据库表声明异常的问题。正如我在问题中提到的,我的数据库表 UserId 字段是 varchar,这导致了问题当我将其更改为唯一标识符时,它表示有效。
表中,您应该将 [UserId] 声明为 [Uniqueindetifier],这与 GUID [全局唯一标识符] 相同,并且在选择查询中只需将唯一标识符作为字符串在引号内发送,如下所示:
"SELECT * FROM UserDetails WHERE UserId = '" + UserId.ToString() + "'"
或
不要在查询中引入新的 Guid 对象,因为查询只是一个简单的字符串,不能在查询中 parce 对象:
更改此设置:
"SELECT * FROM UserDetails WHERE UserId = '" + new Guid(userId.ToString()) + "'"
为此:
"SELECT * FROM UserDetails WHERE UserId = '" + userId.ToString() + "'"
你必须像这样使用:
SELECT * FROM UserDetails WHERE UserId = '" + Giud.UserId + "'"
,然后为用户 ID 选择一种类型。例如 int
更新
public Guid {
public static string UserId {get;set;}
public static string Email {get;set;}
public static string Gender {get;set;}
}
然后,例如,如果您有一个文本框,您将插入的文本将存储在 Guid.UserId
中。比你像我上面说的那样进行查询。