[ASP.NET]解決GridView使用CheckBox Field遇到【字串未被辨認為有效的Boolean】問題

我們可能會在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

結果

x002

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

x001

但是將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

這樣就能夠正確的顯示我們想要的結果了!!

x003

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6)