如何在C#3.0中的存储过程方法中传递char null?

And*_*nda 0 c# sql-server linq-to-sql

我正在努力让这个SP运行:

myDataContext.InsertEvent(codEvent, dateOfEvent, statusOfEvent);
Run Code Online (Sandbox Code Playgroud)

codEvent是一个int; dateOfEvent是一个DateTime; statusOfEvent是一个char.

问题是如果我传递statusOfEvent null,Visual Studio会抛出错误.并且,我的SP像我的桌子一样接受可空的字符.

我也尝试过这样做:

char? statusOfEvent= null;
      if (!String.IsNullOrEmpty(f["statusOfEvent"]))
           statusOfEvent= Convert.ToChar(f["statusOfEvent"]);
Run Code Online (Sandbox Code Playgroud)

但它也会引发错误......

谢谢!!

我试过这个三元表达式:

!String.IsNullOrEmpty(f["statusOfEvent"]) ? Convert.ToChar(f["statusOfEvent"]) : DBNull.Value
Run Code Online (Sandbox Code Playgroud)

但据说"char和DBNull之间没有隐式转换"

我还查看了'*.dbml'designer.cs文件,我的SP方法有这一行:

[Parameter(DbType="Char(1)")] System.Nullable<char> statusOfEvent
Run Code Online (Sandbox Code Playgroud)

Jef*_*tes 8

我相信你需要DBNull .Value而不是null.

更新
要使用,您可以将它传递给其他可能通过的地方null.因此,假设可以statusOfEvent为空,您可以执行以下操作.

myDataContext.InsertEvent(
    codEvent,
    dateOfEvent,
    statusOfEvent ?? DBNull.Value);
Run Code Online (Sandbox Code Playgroud)

但是,InsertEvent需要接受它作为此参数的有效输入.如果您正在使用某些.NET支持(如XSD数据集)来描述存储过程.您可以修改此改变参数接受char?char.然后你应该能够通过null,底层系统将为DBNull.Value你转换它.在这种情况下,您可以将呼叫保留为:

myDataContext.InsertEvent(
    codEvent,
    dateOfEvent,
    statusOfEvent);
Run Code Online (Sandbox Code Playgroud)

这也适用于Linq2Sql.要更改Linq2Sql对象中存储过程的表示形式,需要打开dbml并编辑存储过程的属性.