2013-03-17 112 views
1

我對網頁的工作是使用Visual Studio的C#和我拉下面的列到新作家的集合。指定的轉換無效,C#網頁

我總是收到Specified Cast Is Not Valid error。我認爲它與我的int「au_id」有關。我的教授給了我們一個數據庫,其中的id是一個nvarchar,而不是一個int,所以我需要將它轉換爲它。下面是代碼:

colauthors.Add(new authors(
    (int)reader["au_id"], 
    (string)reader["au_lname"], 
    (string)reader["au_fname"], 
    (string)reader["phone"], 
    (string)reader["address"], 
    (string)reader["city"], 
    (string)reader["state"], 
    (string)reader["zip"], 
    (bool)reader["contract"])); 

這是列如何在數據庫中的數據類型一起:

au_id nvarchar(50) 
au_lname nvarchar (50) 
au_fname nvarchar (50) 
phone char (12) 
address nvarchar (50) 
city nvarchar (50) 
state char (2) 
zip char (5) 
contract bit 

我知道合同的位將是一個布爾值,和我m很確定char是字符串。所以我幾乎積極,我的錯誤與ID有關,我只是無法弄清楚如何正確投射它。有什麼建議麼?

回答

2

如果的au_id類型是在db nvarchar的那麼它將兩個列舉的轉換失敗(例如:「ABC」不能被轉換爲int)。你可以嘗試int.tryparse,如果失敗返回false允許你提供一些替代ID。

+0

+1您是對的,我最初誤導OP對錶架構的描述 – 2013-03-17 16:23:01

+0

非常感謝! – newbie1 2013-03-17 16:30:21

1

必須更改au_id柱的一個整數(或相關的數據類型)的數據類型,或分析值作爲C#中的字符串作爲阿提拉Kurucz暗示。

如果contractau_id列是null,也可能會有問題。試試這個

(int)!reader.IsDbNull(reader.GetOrdinal("au_id")) && reader["au_id"] 
... 
(bool)!reader.IsDbNull(reader.GetOrdinal("contract")) && reader["contract"] 

或本(儘管它會要求你稍微調整你authors類)。

(int?)reader["au_id"] 
... 
(bool?)reader["contract"] 

要指定一列是事件的默認值null嘗試。

((int?)reader["au_id"]) ?? 0 
... 
((bool?)reader["contract"]) ?? false 
+0

謝謝你的迴應!當我註釋掉我的(int)閱讀器[「au_id」]行時,我終於明白了,所以我知道錯誤在那裏。 – newbie1 2013-03-17 16:12:29

+0

是的,你建議的第一個是我需要的!非常感謝! – newbie1 2013-03-17 16:30:55

+0

我使用的第一線二者的au_id和收縮,但現在我得到一個錯誤:「System.Data.SqlClient.SqlDataReader」不包含關於「IsDBNull以便」和沒有擴展方法的定義「IsDBNull以便」接受的第一個參數可以找到類型'System.Data.SqlClient.SqlDataReader'(你是否缺少使用指令或程序集引用?)。 – newbie1 2013-03-17 19:15:37