nchar从DB中检索为Null

时间:2016-06-12 18:56:00

标签: c# sql sql-server

我正在从数据库中检索一行以显示公民。我有一个婚姻状态列,在数据库中定义为nchar(1),并在模型中定义为char?

[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" }};
        }
}

在构造函数中,我执行了以下操作:

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

调试时我注意到mrtlStt总是以null的形式返回,这就是下拉列表始终显示“请选择婚姻状况”而不是实际婚姻状况的原因。创建新的Citizen时,婚姻状况列会正确更新。

我试图在存储过程中使用.ToString(),cast(char?),CAST,但无济于事。读者功能也没有多大帮助。

我可以将数据类型更改为nvarchar(1)并完成,但我无法在任何情况下都知道为什么mrtlStt被检索为null。< / p>

我在这里缺少什么?

更新:这是存储过程。

SELECT ctznId, ctznLname, ctznFname, ctznDob, ctznHgt, ctznEml, ctznPhone, ctznNumchilds,
            ctznLivestat, ctznMrtlStt, ctznCtcod, ctznNote
    FROM tblCitizens 
    WHERE tblCitizens.ctznId=@id

更新:存储新创建的公民

 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
     {

     }

创作程序:

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

1 个答案:

答案 0 :(得分:2)

喜欢编程!

只是其中一个小转换与投射和混乱的数据类型。

所以,

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

应该是

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

就是这样。它没有被检索为null,当对象不是同一类型时,在转换中使用as会返回null。

非常感谢在这篇文章中发表的评论,非常感谢那些编辑我的帖子以使其更清晰的人。