2015-12-22 74 views
0

我想用這種方法消息錯誤「指定的轉換無效」

public List<gerant> getinfogerant() 
    { 
     List<gerant> gerer = new List<gerant>(); 
     string sql_gerant = "select CIN,NOM,PRENOM,ADRESS_PERSONNEL,NUM_TEL,MAIL,MOBILE,CP_GERANT,VILLE_GERANT,DATE_CIN from GERANT"; 
     connexion connect = new connexion(); 
     OleDbConnection connection = connect.getconnexion(); 
     connection.Open(); 
     OleDbCommand cmd = new OleDbCommand(sql_gerant, connection); 
     OleDbDataReader reader = cmd.ExecuteReader(); 
     while(reader.Read()) 
     { 
      gerer.Add(new gerant(reader.GetInt64(0), 
       reader.GetString(1), 
       reader.GetString(2), 
       reader.GetString(3), 
      reader.GetDouble(4), 
       reader.GetString(5), 
       reader.GetDouble(6), 
       reader.GetInt32(7), 
       reader.GetString(8), 
       reader.GetDateTime(9)) 
       ); 

     } 
     connection.Close(); 
     return gerer; 

    } 

擺脫數據庫訪問信息在我的數據庫訪問我定義字段cin爲長整型和格式化的「00000000」

但我在reader.GetInt64(0)得到一個錯誤:

指定的轉換是無效

我該如何解決?

+0

你是什麼意思格式化「0000000」?如果這是該語句的結果,則CIN是一個字符串。 – nabuchodonossor

+0

CIN字段可以爲空嗎? – adrianbanks

+0

你確定你在'reader.GetInt64(0)'中得到異常,而不是在整個'gerant'構造函數中? –

回答

0

請檢查DBNull的值,可能是你得到一個空值。

問候 Jasbeer辛格

0

我想,你要例外不在reader.GetInt64(0)但在gerant構造函數,所以它可能是任何列。

要檢查這個修改代碼如下

 while (reader.Read()) 
     { 
      var cin = reader.GetInt64(0); 
      var nom = reader.GetString(1); 
      var prenom = reader.GetString(2); 
      var addressPersonel = reader.GetString(3); 
      var numTel = reader.GetDouble(4); 
      var mail = reader.GetString(5); 
      var mobile = reader.GetDouble(6); 
      var cpGerant = reader.GetInt32(7); 
      var villeGerant = reader.GetString(8); 
      var dateCin = reader.GetDateTime(9); 

      gerer.Add(new gerant(cin, 
       nom, 
       prenom, 
       addressPersonel, 
       numTel, 
       mail, 
       mobile, 
       cpGerant, 
       villeGerant, 
       dateCin) 
       ); 
     } 

而且你會在真正的線得到例外。

我建議檢查NUM_TELMOBILE列的double號碼。

另外,請在讀取之前檢查非string列的DbNull值。 long,int,doubleDateTime不能爲空。

1

試試這個代碼

public List<gerant> getinfogerant() 
{ 
    List<gerant> gerer = new List<gerant>(); 

    try 
    { 
     connexion connect = new connexion(); 
     OleDbCommand cmd = new OleDbCommand(); 

     cmd.Connection = new OleDbConnection(connect.getconnexion()); 
     cmd.CommandType = CommandType.Text; 
     comd.CommandText = "select CIN,NOM,PRENOM,ADRESS_PERSONNEL,NUM_TEL,MAIL,MOBILE,CP_GERANT,VILLE_GERANT,DATE_CIN from GERANT"; 

     connection.Open(); 

     OleDbDataReader reader = cmd.ExecuteReader(); 

     while(reader.Read()) 
     { 
      gerant g = new gerant(); 

      if (!reader.IsDBNull(0)) g.CIN = int.Parse(reader.GetValue(0).ToString()); 
      if (!reader.IsDBNull(1)) g.NOM = reader.GetValue(1).ToString(); 
      if (!reader.IsDBNull(2)) g.PRENOM = reader.GetValue(2).ToString(); 
      if (!reader.IsDBNull(3)) g.ADRESS_PERSONNEL = reader.GetValue(3).ToString(); 
      if (!reader.IsDBNull(4)) g.NUM_TEL = Convert.ToDouble(reader.GetValue(4).ToString()); 
      if (!reader.IsDBNull(5)) g.MAIL = reader.GetValue(5).ToString(); 
      if (!reader.IsDBNull(6)) g.MOBILE =Convert.ToDouble(reader.GetValue(6).ToString()); 
      if (!reader.IsDBNull(7)) g.CP_GERANT = int.Parse(reader.GetValue(7).ToString()); 
      if (!reader.IsDBNull(8)) g.VILLE_GERANT = reader.GetValue(8).ToString(); 
      if (!reader.IsDBNull(9)) g.DATE_CIN = Convert.ToDateTime(reader.GetValue(9).ToString()); 

      gerer.add(g); 
     } 
     return gerer; 
    } 
    catch(Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     reader.Close(); 
     connection.Close(); 
    } 
} 

,並請調整你的類和方法的名稱: - 公開名單getinfogerant() - >公開名單getInfoGerant()

  • Connexion的連接=新的Connexion (); - >連接(不是x)
相關問題