1

私は C# を使用したビジュアル スタジオである Web ページに取り組んでおり、以下の列を新しい作成者のコレクションにまとめています。

私は取得し続けSpecified Cast Is Not Valid errorます。私の教授は、id が int ではなく nvarchar であるデータベースを提供してくれたので、そのように変換する必要があります。以下はコードです:

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

コントラクトの場合、ビットがブール値になることはわかっています。また、char は文字列であると確信しています。したがって、エラーがIDに関係していることはほぼ確実です。正しくキャストする方法がわかりません。助言がありますか?

4

2 に答える 2

2

データベースで au_id 型が nvarchar の場合、列挙された両方の変換で失敗します (例: "abc" は int に変換できません)。失敗した場合に false を返す int.tryparse を試すことができ、代替 ID を提供できます。

于 2013-03-17T16:13:26.133 に答える
1

Attila Kuruczが提案するように、列のデータ型をau_id整数 (または関連するデータ型) に変更するか、値を c# の文字列として解析する必要があります。

contractまたはau_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
于 2013-03-17T15:59:06.180 に答える