2016-06-12 2 views
-1

私は市民を表示するためにDBから行を取得しています。私はmrtlSttことに気づいデバッグ中ヌルとしてDBからncharを取得

ctzn = new Citizen 
       { 
        //additional properties 
        mrtlStt = dr["ctznMrtlStt"] as char?, 
        //additional properties 
       }; 

[DisplayName("Marital Status")] 
public char? mrtlStt { get; set; } 

public IEnumerable<SelectListItem> mrtlSttOptns 
{ 
    get { 
     return new[] { new SelectListItem {Value="m", Text="Married" }, 
         new SelectListItem {Value="d", Text="Divorced" }, 
         new SelectListItem {Value="s", Text="Single" }, 
         new SelectListItem {Value="w", Text="Widow" }, 
         new SelectListItem {Value="u", Text="Unknown" }}; 
     } 
} 

コンストラクタで、私は次のようでした:私はnchar(1)としてDBに定義され、モデルでchar?として配偶者の有無の列を持っていますnullとして常に返されます。そのため、ドロップダウンリストには常に「婚姻状況を選択してください」と表示され、実際の婚姻ステータスは表示されません。新しいCitizenを作成すると、婚姻状態の列が適切に更新されます。

ストアドプロシージャ内でキャスト(char?)、CAST、.ToString()を使用しようとしましたが、役に立たなくなりました。読者の機能はあまり役に立たなかった。

データタイプをnvarchar(1)に変更して完了することができますが、どうしてもmrtlSttnullとして取得された理由を知ることができず、またできません。

私はここで何が欠けていますか?

更新:これはストアドプロシージャです。

SELECT ctznId, ctznLname, ctznFname, ctznDob, ctznHgt, ctznEml, ctznPhone, ctznNumchilds, 
      ctznLivestat, ctznMrtlStt, ctznCtcod, ctznNote 
    FROM tblCitizens 
    WHERE [email protected] 

UPDATE:

ALTER PROCEDURE [dbo].[addCitizen] 
... 
@fmlstt as nchar(1)=N'u', 
... 
AS 
BEGIN 
    begin try 
    INSERT INTO tblCitizens(... ,ctznMrtlStt, ...) 
     VALUES (..., @mrtlStt, ...) 
    return @@rowcount 
end try 
begin catch -- if ID exists 
    return 0 
end catch  
END 
+0

検索の問題とデータがデータベースに正しく格納されていますか? – Shaharyar

+0

@marc_sええ、それについて申し訳ありません:( –

+0

@Shaharyar私はそれが検索段階にあると確信しています。私はブレークポイントを置き、すべてのプロパティを上回ったときに、それぞれはそれぞれの正しい値を 'mrtlStt' –

答えて

2

お奨めのプログラミングが大好き:新しく作成された市民

public static bool addCitizen(//additional properties, char? mrtlStt, //additional properties) 
{ 
    bool rslt = false; 
    SqlConnection cnctn = new SqlConnection(Models.DataModels.DataGlobals.cnctnstrng); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = cnctn; 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "addCitizen"; 
    //adding parameters 
    cmd.Parameters.Add("@mrtlStt", System.Data.SqlDbType.NChar, 1); 
    //adding parameters; 
    try 
    { 
     cnctn.Open(); 
     ... 
     cmd.Parameters["@mrtlStt"].Value = mrtlStt; 
     ... 
     int rc = cmd.ExecuteNonQuery(); 
     if (rc == 1) 
      rslt = true; 
    } 
    catch 
    { 

    } 

作成手順を保存します!

キャストとデータ型を混乱させているだけの小さな変換の1つです。

ので、

mrtlStt = dr["ctznMrtlStt"] as char?, 

はそれだ

Convert.ToChar(dr["ctznMrtlStt"]), 

であるべき。 nullとして取得されませんでした。オブジェクトが同じ型でない場合、キャスト時にasを使用するとnullが返されます。

この投稿にコメントしてくれてありがとうと、投稿を編集してくれた方々に感謝しています。

関連する問題