2017-08-28 83 views
0

我不明白爲什麼我得到這個錯誤,我有一個數據表與列: 整數numeromesa,字符串狀態和整數valortotal。特定的演員表無效

當我嘗試導入帶有選擇查詢的數據到我的Pedido變量時,它會得到我的轉換錯誤。 這是將從表

public class Pedido 
{ 
    public int numeromesa { get; set; } 
    public int valorpedido { get; set; } 
    public string status { get; set; } 

} 

現在,這是我利用select查詢

public List<Pedido> listaPedido() 
    { 
     vsql = "SELECT * FROM pedidos"; 
     List<Pedido> bancoPedidos = new List<Pedido>(); 
     NpgsqlCommand objcmd = null; 
     objcmd = new NpgsqlCommand(vsql, con); 
       NpgsqlDataAdapter adp = new NpgsqlDataAdapter(objcmd); 
       DataTable dt = new DataTable(); 
       adp.Fill(dt); 
       foreach (DataRow row in dt.Rows) 
       { 
       //This is line 185 
        Pedido p = new Pedido 
        { 
         numeromesa = (int)row[1], 
         status = (string)row[2], 
         valorpedido = (int)row[3]        
        }; 
        bancoPedidos.Add(p); 

        return bancoPedidos; 
     } 
方法

這個問題似乎是與valorpedido變量,如果我把接收數據的類它代碼工作正常

**************例外文本************** System.InvalidCastException:指定的轉換不是有效。 PostgreSQL.cs:線185

+0

索引是從零開始的,因此除非結果集中有四列,否則它必須是行[0],行[1]和行[2]。更好地按列名稱進行索引。 「select * from ...」與基於序號的索引相關聯是一種非常脆弱的方法。 – dlatikay

+0

你確定你不應該從0而不是1索引? – juharr

+0

是否valortotal可以空?你在其他答案的評論中提到了「不能投向dbnull」。 – cost

回答

0

由於誤差是:

valorpedido = (int)row[3] 

的問題是,行[3]不是整數類型的,當涉及從數據庫中。

很有可能你偏離了一列,因爲它是一個基於零的數據行索引。

2

原始代碼按索引列地址列。索引從零開始,隨着模式更改,它們很容易發生錯位。
相反,使用名稱來訪問列:

var p = new Pedido 
{ 
    numeromesa = (int)row["numeromesa"], 
    status = row["status"].ToString(), 
    valorpedido = (int)row["valortotal"] 
}; 

此代碼假定既不status也不valortotal是空。如果他們成功了,你需要考慮的是,例如:

public class Pedido 
{ 
    public int numeromesa { get; set; } 
    public int? valorpedido { get; set; } 
    public string status { get; set; } 
} 

var p = new Pedido 
{ 
    numeromesa = (int)row["numeromesa"], 
    status = row["status"].ToString() 
}; 

if(row["valortotal"].Equals(DBNull.Value)) 
{ 
    p.valorpedido = null; 
} 
else 
{ 
    p.valorpedido = Convert.ToInt32(row["valortotal"]); 
} 

的名字,而不是順序查找值的性能損失是在這種情況下可以忽略不計(當我們」除重新談論數以萬計的記錄),並給你一個重要的優勢:如果由於pedidos表或視圖模式的修改而導致列順序發生變化,那麼你的代碼將繼續工作。就像它最初寫的那樣,它會破裂。

+0

索引不是問題,表中的[0]索引是自動遞增的ID,[3]索引是正確的。試圖改變名稱,我得到相同的錯誤,在那裏excacly我把該代碼來檢查它是否爲空? –

+0

我已經更新了顯示valortotal/valorpedido的答案。如果你不止一次地使用這種模式,寫一個效用函數來減少混亂。 – dlatikay

+0

Dbnull.Value不存在,只嘗試dbnull,也是null,都得到相同的錯誤「對象不能從dbnull轉換到其他類型 –