2015-06-26 39 views
1

我正在嘗試創建一個網格,其中包含某個票據的所有信息,這些票據具有很多狀態(表中的行),我需要放入網格中,是方法我使用:從表中檢索數據並向網格提供

調用方法來填充網格:

private void AssemblyGrid() 
     { 
      //Set Grid 
      gridTStatus.DataSource = null; 
      gridTStatus.DataBind(); 

      User loggedUser = (User)HttpContext.Current.Session[SESSIONNAME.LOGGEDUSER]; 
      // Checa se o usuario tem permissão para utilizar essa funcionalidade 
      if ((loggedUser.Login.ToUpper() != ConfigurationManager.AppSettings[APPSETTINGS.SUPPORTUSERS].ToUpper())) 
      { 
       Response.Redirect("AccessDenied.aspx"); 

      } 
      Clic objClic = GetClic(); 
      Status returnStatus = new Status(); 
      List<StatusClicComplete> lstClic = new List<StatusClicComplete>(); 
      lstClic = ClicManager.SelectStatusClic(objClic,out returnStatus); 




      //Set Grid 
      gridTStatus.DataSource = lstClic; 
      gridTStatus.DataBind(); 
     } 

檢索從DATEBASE信息的方法:

public List<StatusClicComplete> SelectStatusClicDB(Clic objClic , out Status returnStatus) 
     { 


      const string strStoredProcedure = "spSearchClicStatus"; 

      List<StatusClicComplete> complete = new List<StatusClicComplete>(); 

      try 
      { 


       Database database = DatabaseFactory.CreateDatabase(DATABASESETTINGS.CLICDB); 
       using (DbCommand dbCommand = database.GetStoredProcCommand(strStoredProcedure)) 
       { 
        database.AddInParameter(dbCommand, "@iClic", DbType.Int32, objClic.ID); 

        using (IDataReader dataReader = database.ExecuteReader(dbCommand)) 
        { 
         while (dataReader.Read()) 
         { 
          complete.Add(new StatusClicComplete() 
              { 
               iClic = dataReader.GetInt32(Convert.ToInt32("iClic")), 
               iStatus = dataReader.GetInt32(Convert.ToInt32("iStatus")), 
               dtDateCreated = dataReader.GetDateTime(Convert.ToInt32("dtDateCreated")), 
               iEDV = dataReader.GetInt32(Convert.ToInt32("iEDV")), 
               sComments = dataReader.GetString(Convert.ToInt32("sComments")) 

              } 
           ); 

         } 
         dataReader.Close(); 
         returnStatus = StatusBuilder.BuildStatus("Success", string.Format("{0} - {1}", MethodBase.GetCurrentMethod().Name), true); 

        } 
       } 
      } 
      catch(Exception exception) 
      { 

       returnStatus = StatusBuilder.BuildStatus("Error", string.Format("{0} - {1}", MethodBase.GetCurrentMethod().Name, exception.Message), false); 

      } 
      //TODO NAV8CA - Escrever tratativa de objeto nulo 
      return complete; 




     } 

的StatusClicClass,那就是列表類型

namespace RB.LA.TER.CLIC.TRANSPORT 
{ 
    [Serializable] 
    public class StatusClicComplete 
    { 
     public int iClic { get; set; } 
     public int iStatus { get; set; } 
     public DateTime dtDateCreated { get; set; } 
     public int iEDV { get; set; } 
     public string sComments { get; set; } 
    } 
} 

,並且過程:

PROCEDURE [dbo].[spSearchClicStatus] 


@iClic int = NULL 

AS 

SELECT 
     dtDateCreated, iEDV, sComments, sDescription, SC.iStatus 
    FROM 
     T_STATUS_CLIC SC INNER JOIN T_STATUS S 
      ON SC.iSTATUS = S.iSTATUS 
    WHERE 
     SC.iClic = @iClic 
    ORDER BY 
     dtDateCreated 



GO 

我試圖運行此代碼,但我得到一個錯誤,當輸入完成後它(輸入字符串的不正確的格式。)而有人知道我做錯了什麼?

enter image description here

+0

,您在函數'GetStoredProcCommand'指定'dbCommand.CommandType = CommandType.StoredProcedure'。錯誤在哪一行? – naveen

+0

錯誤是在從數據庫中檢索數據的方法中,當它進入while時,我得到錯誤並轉到異常,說輸入字符串的格式不正確。 –

回答

1

dataReader.GetInt32(Convert.ToInt32("iStatus")) 是錯誤的。它應該是

dataReader.GetInt32(4) 

dataReader.GetInt32(dataReader.GetOrdinal("iStatus")); 

在第一種情況,依次被直接指定。在第二種情況下,我們使用列名稱計算序數。此外,在使用此方法之前,您最好在檢查IsDBNull,否則您將獲得InvalidCastException。所以更優化的方法是,

iClic = objClic.ID, // we already have that 
iStatus = dataReader.IsDBNull(dataReader.GetOrdinal("iStatus")) ? dataReader.GetInt32(dataReader.GetOrdinal("iStatus")) : 0 

P.S:序數位置是SELECT子句中列的位置。它是一個基於零的索引。在你選擇查詢iClic具有5 位置,因此序號位置被給定爲4.

+0

現在我正在抓到IndexOutOfRangeException,在iClic –

+0

嘗試給4代替getOrdinal – naveen

+0

與4,我得到的輸入字符串沒有在正確的格式 –