1

我对 c# 很陌生,并试图混淆我的方式。我习惯于在 iSeries (RPG) 上编码,所以 c# 对我来说是一个非常不同的概念。

我有一个存储过程,它根据匹配的行返回一行(或多行)数据。

想象一下我的表用户包含以下列:

UserId, CompanyId, FirstName, LastName, CompanyAdmin, AccountStatus, UserName.

我有一个存储过程,它返回所有这些列,其中有匹配的公司 ID(即.. Select * from users where CompanyId = 1)。

我已经创建了一个具有上述匹配字段和适当的 get/set 方法(即public int UserId {get; set;}等)的类。

我已经使用了 aSqlDataReader并且正在尝试使用来自阅读器的数据从我的类中加载每个字段,但是我收到了一个错误

'reader["UserName"]' 抛出类型异常

'System.InvalidOperationException' 对象

{System.InvalidOperationException}

我错过了什么?最终,我想要一个对象,它定义了我的所有字段,这些字段将与我的 SQL Server 存储过程中的结果集相匹配。

我的代码抛出错误看起来像这样..

    public partial class Admin : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DataSet ds = new DataSet("ot_Users");
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
            using (SqlCommand command = conn.CreateCommand())
            {
                command.CommandText = "dbo.ot_User_GetByUserName";
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("@UserName", Environment.UserName);

                conn.Open();

                SqlDataReader reader = command.ExecuteReader();

                ot_Users user = new ot_Users();

                while(reader.Read())
                {
                     user.CompanyId = (int) reader["CompanyId"];
                     user.UserId = (int) reader["UserId"];
                     user.FirstName = (String) reader["FirstName"];
                     user.LastName = (String) reader["LastName"];
                     user.CompanyAdmin = (bool) reader["CompanyAdmin"];
                     user.AccountStatus = (int) reader["AccountStatus"];
                     user.UserName = (String) reader["UserName"];
                }

                reader.NextResult();

                CompanyName.Text = user.FirstName.ToString();
            }
        }
    }
4

2 回答 2

1

我认为问题可能在于将 UserName 转换为char. Achar只代表一个字符,一个字符串代表多个字符,所以你可能想用那个来代替!

那或者可能UserName没有正确装箱?

于 2013-10-23T14:53:39.510 回答
0

试试这个。

请注意:如果您的存储过程返回多于一行,它将只取最后一行。因为你只循环一个对象。如果您期望的结果多于您应该使用 List 或某种集合对象。

 public partial class Admin : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DataSet ds = new DataSet("ot_Users");
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
            {
                using (SqlCommand command = conn.CreateCommand())
                {
                command.CommandText = "dbo.ot_User_GetByUserName";
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("@UserName", Environment.UserName);

                conn.Open();

                SqlDataReader reader = command.ExecuteReader();

                ot_Users user = new ot_Users();

                while(reader.Read())
                {
                     user.CompanyId = reader["CompanyId"] != DBNull.Value ? (int)reader["CompanyId"] : 0 ;
                     user.UserId = reader["UserId"] != DBNull.Value ? (int)reader["UserId"] : 0 ;
                     user.FirstName = reader["FirstName"] != DBNull.Value ? reader["FirstName"].ToString() : string.Empty;
                     user.LastName = reader["LastName"] != DBNull.Value ? reader["LastName"].ToString() : string.Empty;
                     user.CompanyAdmin = reader["CompanyAdmin"] != DBNull.Value ? (bool)reader["CompanyAdmin"] : false ;
                     user.AccountStatus = reader["AccountStatus"] != DBNull.Value ? (int)reader["AccountStatus"] : 0 ;
                     user.UserName = reader["UserName"] != DBNull.Value ? reader["UserName"].ToString() : string.Empty;
                }

                if (user != null)
                {
                    CompanyName.Text = user.FirstName.ToString();
                }
            }
        }
    }
}
于 2013-10-23T15:29:16.703 回答