从字符串转换为唯一标识符时转换失败

本文关键字:转换 失败 标识符 字符串 唯一 | 更新日期: 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 可以nullDBNull 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)
    {
    }