【问题标题】:C# : return dbnull.value or system.type from function?C#:从函数返回 dbnull.value 或 system.type?
【发布时间】:2011-05-08 12:24:34
【问题描述】:

我想创建一个函数(c#):

int PutInt (int? x)
{
    if (x.HasValue)
        return x.Value;
    else
        return DBNull.Value;
}

但没有从 int 到 DBNull.Value 的强制转换。 有没有办法创建这样的功能?

【问题讨论】:

  • 你想做什么?这和数据库有什么关系?
  • 我只想将 int\dbnull 放入 DB 并使用小算法构建一个函数,该算法可以选择我需要放入 DB 的内容)
  • 也许你有设计问题。为什么一个名为 PutInt 的方法实际上返回一个 int?

标签: c# types dbnull system.type


【解决方案1】:

假设您的 DBMS 是 SQLServer,您可以将函数转换为

object PutInt (int? x)
{
    if (x.HasValue)
        return (object)x.Value;
    else
        return (object)DBNull.Value;
}

因为 SQLParamater Value 属性假定类型为 object。希望我能回答你的问题。

【讨论】:

  • return x ?? (object)DBNull.Value; 呢?
【解决方案2】:

这本质上是不可能的——值类型不能为空。

您需要使用可空类型 (int?),这会使您的函数完全无用。

【讨论】:

  • 即使你使用int?,我仍然认为它不会起作用,因为DBNull 不是int? 类型
【解决方案3】:

不,您不能将 int 转换为 DBNull.Value。这用于评估数据库字段的内容,而不是可以为空的类型。可空类型的值就是null

比您定义的函数更好的选择是使用null coalescing operator (??)。

它的逻辑与您尝试在函数中构建的逻辑非常相似。考虑以下代码行:

// Declare a nullable int, and set it to null
int? x = null;

// Assign int y to x, unless x is null, in which case, set y = -1
int y = x ?? -1;

// The variable y now has a value of -1
Console.WriteLine(y);

【讨论】:

  • 现在我再看一遍这个问题,我想你已经明白他想要什么了。
  • @Bolt:关于为什么它可能被否决的任何理论,那么?我最近在阅读提问者的想法方面做得不太好。花费了我很多代表......
  • 呸。看起来我们俩当时都搞砸了。
【解决方案4】:

如果你只是赋值给对象变量类型,我建议你忘记使用方法,只使用条件赋值

 object obj = (x.HasValue? x.Value : DBNull.Value);

【讨论】:

  • 这可以重写为x ?? DBNull.Value。漂亮多了,嗯?
  • 不,你不能,请参阅下面我对 SLaks 的评论。
  • 我刚刚启动了 VS 并尝试了它并证明你不能。如果你尝试使用??,你会得到一个编译错误“Operator '??'不能应用于“int”和“System.DBNull”类型的操作数”
  • 像这样:x ?? (object)DBNull.Value
  • 您上面的建议仍然无效。在 VS 中试一试,看看你得到了什么。另外,如果您必须明确开始拳击等。我个人认为它看起来不漂亮
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多