2013-10-23 124 views
1

我对c#很陌生,并试图混淆事物的方式。我习惯于在iSeries(RPG)上编码,所以c#对我来说是一个非常不同的概念。从SQL Server存储过程中存储有用的数据

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

想象一下,我的表用户持有下列:

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

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

我已经创建了一个类,具有上面匹配的字段以及相应的get/set方法(即。public int UserId {get; set;}等)。

我已经使用了SqlDataReader和我试图从我与读者数据类加载每个领域,但我得到一个错误

“读者[‘用户名’]”引发了异常类型的

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

名,姓和用户名。他们(字符)是不是应该是字符串? – AJP

+0

我已经改变了他们,但仍然得到相同的问题 – lomie76

+0

尝试字符串与小写's'。 – AJP

回答

0

试试这个。

请注意:如果您的sproc返回多行,它将只采用最后一行。因为你只循环一个对象。如果您希望获得比使用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(); 
       } 
      } 
     } 
    } 
} 
1

我想问题可能是与铸造用户名作为char。 A char仅表示单个字符,一个字符串表示多个字符,因此您可能想要使用该字符!

那还是可能UserName没有正确套用?

+0

好吧 - 我已经改变了,我仍然得到相同的错误,我已经仔细检查了我的ot_User.cs,并且其中的字段也被定义为String(现在它们是反正)。 – lomie76

+1

''char''可能是错误的,但是演员不能是他报告的错误的来源,因为它发生在读取器读取数据之后。 – acfrancis

+0

你能发布你的数据的实际模式吗?你使用什么数据库/服务器? –