从SQL Server存储过程存储有用的数据

时间:2013-10-23 14:48:14

标签: c# sql sql-server

我对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;}等)。

我使用过SqlDataReader并尝试使用来自阅读器的数据从我的班级加载每个字段,但是我收到了错误

  

'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();
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

我认为问题可能是将UserName强制转换为charchar仅表示单个字符,字符串表示多个字符,因此您可能希望使用该字符!

那个或UserName没有正确套装?

答案 1 :(得分:0)

试试这个。

请注意:如果您的sproc返回多行,则仅使用最后一行。因为你只是在一个对象中循环。如果你期望更多的结果,你应该使用List或somekind一个集合对象。

 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();
                }
            }
        }
    }
}