2010-08-20 54 views
0

我有一个SQL存储过程,它将数据集返回给ASP.NET v3.5数据集。数据集中的一列被称为Attend,并且是SQL表中的一个可为空的位列。在选择该列是这样的:数据集列总是返回-1

CASE WHEN Attend IS NULL THEN -1 ELSE Attend END AS Attend

当我在查询分析器中执行的SP值返回,因为他们应该行 - 为参加值为-1是一些行,其他0,另外1人。但是,当我调试C#代码并检查数据集时,Attend列始终包含-1。

如果我选择任何其他列或常量值来参加结果总是正确的。它只是上面的SELECT字段行为奇怪。我怀疑它与的类型有关。因此,为了测试这个,我选择了“CONVERT(int,Attend)”,但行为是一样的。

我已经尝试使用ExecuteDataset检索数据,并且我还创建了一个带有TableAdapter和DataTable的.NET数据集架构。仍然没有运气。

有没有人知道这里有什么问题?

回答

0

和你一样,我怀疑数据类型。如果您可以更改参加的数据类型,请将其更改为支持负数的smallint。如果不是,请尝试将Attend的别名从Istend更改为IsAttending(或适合该列的任何内容)。

此外,您还可以让你的查询更加简洁使用这种替代的情况下:

ISNULL(Attend, -1) 
+0

Attend列中不存在任何负数,只是NULL,True和False。另外,更改别名没有帮助。感谢您的想法。 – Dewey 2010-08-21 22:42:38

+0

更改数据类型的想法是尝试让您的DataSet像int列那样对待Attend列而不是位列。 – 2010-08-21 23:13:30

0

你建议。参加现场是有点,但它包含3个值(-1,0, 1)。但是,有一点只能保存两个值。当转换为整数时,通常为(-1,0),但也可能为(0,1),具体取决于BIT是否被认为是有符号的(2的恭维)或无符号的(恭维)。

如果您的客户端(ASP代码)将该字段的所有值转换为BIT类型,那么-1和1都可能显示为相同的值。所以,我将确保两两件事:
- 该SQL返回INTEGER
- 客户未进行转换,为一个BIT

[虽然这并不能说明没有0的]

一需要谨慎使用类型的隐式转换。如果没有明确指定,请仔细检查注意事项。或者,可以肯定的是,明确指定每种类型...

只是出于兴趣,使用以下内容时会得到什么?

CASE [table].attend 
    WHEN NULL THEN -2 
    WHEN 0 THEN 0 
    ELSE   2 
END