由于 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 时,它表示正在工作。
在数据库中,我的 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 时,它表示正在工作。