我們可能會在SQL語法中使用CASE WHEN來判斷當某些條件下,顯示Y/N 或者 1/0 或者 True / False,而這樣的結果如果透過GridView來顯示,那麼使用CheckBox Field來做還蠻容易理解的。但是卻遇到【字串未被辨認為有效的Boolean】這樣的錯誤訊息,該如何來解決與避免呢??
緣起
我們可能會在SQL語法中使用CASE WHEN來判斷當某些條件下,顯示Y/N 或者 1/0 或者 True / False,而這樣的結果如果透過GridView來顯示,那麼使用CheckBox Field來做還蠻容易理解的。但是卻遇到【字串未被辨認為有效的Boolean】這樣的錯誤訊息,該如何來解決與避免呢??
CheckBox Field 配合的型態
首先我們要去理解 CheckBox Field所展現的是一個CheckBox,而這個特別適合用來顯示True/False這樣的布林(Boolean)型態,而在資料庫的型態中,可以展現布林(Boolean)的型態是【bit】的型態。Bit型態只有兩種結果:【0 / 1】
測試
我們在畫面上安排一個GridView與一顆按鈕,然後用北風資料庫來做測試。
畫面的程式碼如下:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="LG20" HeaderText="LG20" />
</Columns>
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="Button" />
按鈕按下去後,進行資料繫結
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Dt As New DataTable
Dim ConnStr As String = ConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString
Using Conn As New SqlConnection(ConnStr)
Dim SqlTxt As String
SqlTxt = ""
SqlTxt += " SELECT ProductID, UnitPrice "
SqlTxt += " , Case "
SqlTxt += " When UnitPrice > 20 Then 1 "
SqlTxt += " Else 0 "
SqlTxt += " End AS LG20 "
SqlTxt += " FROM dbo.Products "
Using Cmmd As New SqlCommand(SqlTxt, Conn)
Dim Da As New SqlDataAdapter(Cmmd)
Da.Fill(Dt)
End Using
End Using
Me.GridView1.DataSource = Dt
Me.GridView1.DataBind()
End Sub
結果
SQL判斷給值
我們可能會很自然的,在透過Case When判斷後,直接給值 0 / 1,就像下面這樣
SELECT ProductID, UnitPrice
, Case
When UnitPrice > 20 Then 1
Else 0
End AS LG20
FROM dbo.Products
這樣看起來的結果似乎如我們所預期的,大於20的就顯示1,小於等於20的就顯示0
但是將LG20這個欄位與CheckBox Field結合後,卻會顯示【字串未被辨認為有效的Boolean】。這個原因是因為SQL並不會用bit型態來顯示您所給的 0 / 1 的值。
透過Convert轉換輸出的型態為bit
因此我們需要讓輸出的 0 / 1 是bit型態,我們修改SQL語法變成如下:
SELECT ProductID, UnitPrice
, Case
When UnitPrice > 20 Then Convert(bit, 1)
Else Convert(bit,0)
End AS LG20
FROM dbo.Products
這樣就能夠正確的顯示我們想要的結果了!!
以下是簽名:
- 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
- 小喵大部分的文章會以小喵熟悉的語言VB.NET撰寫,如果您需要C#的Code,也許您可以試著用線上的工具進行轉換,這裡提供幾個參考
Microsoft MVP Visual Studio and Development Technologies (2005~2019/6) | topcat Blog:http://www.dotblogs.com.tw/topcat |