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

3
当我在调试时运行代码,出现以下错误:

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

这是代码:
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
    }
}

1
你的表中的UserId是否是唯一标识符?如果是,当你调试时id的值是多少? - Jamiec
2
你尝试过使用 Guid.Parse(id) 吗? - daryal
8
你的代码中真的存在一个完全空的catch块,捕获了所有的异常吗?这不是一个好主意,很有可能会隐藏真正出现的问题。 - Jon Skeet
检查id是否为"string.empty"或"DBNull.Value",然后创建"guid.empty"并使用它。 - pvaju896
我在我的答案中添加了一些代码。这个代码处理了三种情况:id == nullid == ""id == valid Guid。这应该给你一些提示。 - Thorsten Dittmar
显示剩余7条评论
1个回答

4
您在评论中提到,当传递到该方法时,id没有值。从数据库角度来看,uniqueidentifier可以为null(在C#中为DBNull),但要实现这一点,您必须省略参数或显式设置DBNull.Value
在C#中,Guid不能为null - 因此,在调用AddWithValue时,必须提供Guid.Empty或可转换为Guid的字符串。
编辑: 以下是示例代码:请注意,根据您使用的SQL语句,除非您有一个ID仅包含0的用户,否则您将不会得到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)
    {

    }

Guid.Empty??不熟悉,我该如何使用它? - blanket
在我的代码中显示。基本上:Guid myGuid = Guid.Empty;。请注意,Guid.Empty00000000-0000-0000-0000-000000000000 - Thorsten Dittmar
非代码特定的答案在这里,但可能相关。 - B5A7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接