2010-08-20 140 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