2013-10-23 121 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

你能發佈你的數據的實際模式嗎?你使用什麼數據庫/服務器? –