我有一个SQL存储过程,它将数据集返回到ASP.NET v3.5数据集。数据集中的一列称为Attend,并且是SQL表中的可空位列。该列的SELECT是:
CASE WHEN Attend IS NULL THEN -1 ELSE Attend END AS Attend
当我在查询分析器中执行SP时,行值将按原样返回 - Attend的值为-1,某些行为0,其他行为0,其他行为1。但是,当我调试C#代码并检查数据集时,Attend列始终包含-1。
如果我选择任何其他列或常量值,则Attend结果总是正确的。只有上面的位字段SELECT表现得很奇怪。我怀疑它与 bit 的类型有关,导致了这种情况。所以为了测试这个,我改为选择“CONVERT(int,Attend)”,但行为是一样的。
我尝试使用ExecuteDataset来检索数据,我还使用TableAdapter和DataTable创建了一个.NET数据集模式。仍然没有运气。
有谁知道这里有什么问题?
答案 0 :(得分:0)
和你一样,我怀疑数据类型。如果您可以更改Attend的数据类型,请将其更改为smallint,它支持负数。如果没有,请尝试从Attend to IsAttending(或适合该列的任何内容)更改别名的名称。
此外,您可以使用此代替CASE来简化查询:
ISNULL(Attend, -1)
答案 1 :(得分:0)
您建议Attend字段有点,但它包含三个值(-1,0,1)。但是,有点只能容纳两个值。通常(-1,0)转换为整数时,也可能(0,1),这取决于BIT是被认为是签名(两个恭维)还是无符号(一个恭维)。
如果您的客户端(ASP代码)正在将该字段的所有值转换为BIT类型,那么-1和1都可能显示为相同的值。所以,我会确保两件事:
- SQL返回INTEGER
- 客户端未将其转换为BIT
[虽然这并不能解释0的缺席]
人们需要小心隐式转换类型。如果没有明确指定,请仔细检查预测。或者,确定,明确指定每种类型......
出于兴趣,使用以下内容后会得到什么?
CASE [table].attend
WHEN NULL THEN -2
WHEN 0 THEN 0
ELSE 2
END