我正在从数据库中检索一行以显示公民。我有一个婚姻状态列,在数据库中定义为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
答案 0 :(得分:2)
喜欢编程!
只是其中一个小转换与投射和混乱的数据类型。
所以,
mrtlStt = dr["ctznMrtlStt"] as char?,
应该是
Convert.ToChar(dr["ctznMrtlStt"]),
就是这样。它没有被检索为null,当对象不是同一类型时,在转换中使用as
会返回null。
非常感谢在这篇文章中发表的评论,非常感谢那些编辑我的帖子以使其更清晰的人。