从字符串转换为唯一标识符时转换失败
本文关键字:转换 失败 标识符 字符串 唯一 | 更新日期: 2023-09-27 18:33:56
当我在调试时运行代码时,出现此错误:
从字符串转换为唯一标识符时转换失败
这是代码:
public class UserObject
{
private string m_name = string.Empty;
public UserObject(string id)
{
#region Internal Logic
try
{
using (SqlConnection cn = new SqlConnection(SiteConfig.ConnectionString))
{
string sSQL = "SELECT [UserName] FROM [aspnet_users] WHERE [UserID] = @UserID";
using (SqlCommand cm = new SqlCommand(sSQL, cn))
{
cm.Parameters.AddWithValue("@UserID", id);
cn.Open();
using (SqlDataReader rd = cm.ExecuteReader())
{
while (rd.Read())
{
m_name = rd[0].ToString();
}
rd.Close();
}
cn.Close();
}
}
}
catch (Exception ex)
{
}
#endregion Internal logic
}
}
您在评论中对该问题的评论中说,id
在传递到方法中时没有值。从数据库的角度来看,uniqueidentifier
可以null
(DBNull
C# 中),但要实现这一点,您必须省略参数或显式设置DBNull.Value
。
在 C# 中,Guid
不能null
- 因此您必须在调用 AddWithValue
时提供Guid.Empty
或可转换为Guid
的字符串。
编辑
示例代码如下: 请注意,给定您使用的 SQL 语句,除非您的用户 ID 仅包含 0
s,否则您不会得到Guid.Empty
情况的任何结果。我建议你更改 SQL 语句的 where
子句,如下所示:
WHERE [UserId] = ISNULL(@UserID, [UserId])
这样,当您通过null
时,您将获得所有用户。
public UserObject(string id)
{
try
{
using (SqlConnection cn = new SqlConnection(SiteConfig.ConnectionString))
{
string sSQL = "SELECT [UserName] FROM [aspnet_users] WHERE [UserID] = @UserID";
using (SqlCommand cm = new SqlCommand(sSQL, cn))
{
if (id.Length == 0)
cm.Parameters.AddWithValue("@UserID", Guid.Empty);
else if (id == null)
cm.Parameters.AddWithValue("@UserID", DBNull.Value);
else
cm.Parameters.AddWithValue("@UserID", Guid.Parse(id));
cn.Open();
using (SqlDataReader rd = cm.ExecuteReader())
{
while (rd.Read())
{
m_name = rd[0].ToString();
}
rd.Close();
}
cn.Close();
}
}
}
catch (Exception ex)
{
}