2011-05-08 54 views
1

我想创建一个函数(C#):C#:从函数返回dbnull.value或system.type?

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

但没有从int到DBNull.Value演员。 有什么办法可以创建这样的功能?

+1

你到底想干什么?这与数据库有什么关系? – BoltClock 2011-05-08 12:27:04

+0

我只想把int \ dbnull放到数据库中,并用小算法构建函数,选择我需要在数据库中放入的数据) – dilix 2011-05-08 12:41:12

+0

也许你有设计问题。为什么名为* PutInt *的方法实际返回一个int? – Juliet 2011-05-08 14:28:29

回答

2

让我们假设你的DBMS是SQLServer的,你可以将你的函数

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

因为SQLParamater值属性假定类型的对象。希望我回答你的问题。

+1

'return x ?? (object)DBNull.Value;'? – Andrey 2011-05-08 12:49:42

3

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

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

+0

即使你使用'int?',我仍然认为它不会工作,因为'DBNull'不是'int?'类型 – 2011-05-08 12:28:00

+0

@Fadrian:正确。 – SLaks 2011-05-08 12:29:22

1

不,你不能投intDBNull.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); 
+0

现在我再次看到这个问题,我认为你很清楚他想要什么。 – BoltClock 2011-05-08 12:30:43

+0

@Bolt:那么为什么它可能会被低估的任何理论呢?最近我还没有做出如此出色的阅读思考者的想法。为我付出很多代价... – 2011-05-08 12:43:28

+0

Bah。看起来我们都搞砸了。 – BoltClock 2011-05-08 12:45:59

1

如果你是刚分配到对象变量的类型,我建议你只是忘记了使用方法,只是使用有条件分配

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

这可以重写为'x? DBNull.Value'。更漂亮了吧? – Andrey 2011-05-08 12:32:25

+0

不,你不能,看到我的评论下面的SLaks。 – 2011-05-08 12:34:27

+0

我刚刚开启了VS并尝试一下,证明你不能。如果你尝试使用??,你会得到一个编译错误“运营商”??不能应用于类型'int'和'System.DBNull'的操作数“ – 2011-05-08 12:35:57