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
    }
}
4

1 回答 1

4

您在评论中对id传递给方法时没有价值的问题说。从数据库的角度来看,uniqueidentifiers 可以是nullDBNull在 C# 中),但要实现这一点,您必须省略参数或DBNull.Value显式设置。

在 C# 中,Guid不能null- 因此您必须提供Guid.EmptyGuid在调用AddWithValue.

编辑示例代码如下:请注意,给定您使用的 SQL 语句,除非您有一个 ID 仅包含s的用户,否则您
不会得到任何结果。我建议,您将SQL 语句的子句更改如下:Guid.Empty0where

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)
    {

    }
于 2012-05-11T11:52:04.503 回答