[習題]SqlDataSource的參數,搭配 SQL指令的 Select ...IN...

摘要:[習題]SqlDataSource的參數,搭配 SQL指令的 Select ...IN...

 

初學者可以先看看這 2篇文章,把基礎的 SqlDataSource精靈設定學習一下

 

 

===============================================================

有一位讀者想要做一個功能,但他講得不太清楚

 

      我猜測是一個類似搜尋、或是兩個控制項連動的功能。

      但他堅持SQL指令(Select),必須使用 IN。

 

 

Select * from 資料表 Where 學號 IN ('m111', 'm222', 'm333')


其實,上面的SQL指令,跟下面的SQL指令是一樣的。

Select * from 資料表 Where 學號 = 'm111' or 學號 = 'm222' or 學號 = 'm333'


.......................................................................................................................................

問題來了


直接使用 (畫面上)SqlDataSource的設定精靈,我做不到這樣的功能。
需要撰寫後置程式碼。


 

但我發現一件事:

SqlDataSource會自動在參數前後,加上單引號(')
例如:

1 SqlDataSource2.SelectParameters.Add("u_title", 輸入的值)
2
3   SqlDataSource2.SelectCommand = "SELECT * FROM [test資料表] WHERE [title] IN (@u_title)"



出來的結果,會變成 ----

      SELECT * FROM [test資料表] WHERE [title] IN ('@u_title參數裡面的字串')

 

所以說,
如果我們輸入多個字串,想要做成
      SELECT * FROM [test資料表] WHERE [title] IN ('字串1', '字串2', '字串3')


 

那麼,好心的、雞婆的 SqlDataSource,前後還會自動幫我們加上「單引號(')」
如此一來,畫蛇添足,

就變成  SELECT * FROM [test資料表] WHERE [title] IN (' '字串1', '字串2', '字串3' ')

 

.............................................................................................................................................

以下是我的作法,後來還是回歸到「字串組合、字串相連」的方法來解

 

HTML畫面 ---

01         選取文章 --
02         <asp:ListBox ID="ListBox1" runat="server"
03             DataSourceID="SqlDataSource1" DataTextField="title" DataValueField="title"
04             SelectionMode="Multiple"></asp:ListBox>
05   (可<span class="style1">複選</span>)<asp:Button ID="Button1" runat="server" Text="Button" /><br />
06
07
08 <asp:SqlDataSource ID="SqlDataSource1"
09             runat="server"
10             ConnectionString="<%$ ConnectionStrings:testConnectionString1 %>"
11             SelectCommand="SELECT [id], [title] FROM [test]"></asp:SqlDataSource>
12    
13
14    
15     <hr />
16         <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
17             DataKeyNames="id" >
18             <Columns>
19                 <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False"
20                     ReadOnly="True" SortExpression="id" />
21                 <asp:BoundField DataField="test_time" HeaderText="test_time"
22                     SortExpression="test_time" />
23                 <asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />
24                 <asp:BoundField DataField="summary" HeaderText="summary"
25                     SortExpression="summary" />
26             </Columns>
27
28         </asp:GridView>

 

 

 

後置程式碼 --

Imports System
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient

01     Protected Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
02         Dim u_Input As String = Nothing
03
04         For i As Integer = 0 To (ListBox1.Items.Count - 1)
05             If ListBox1.Items(i).Selected Then
06                 u_Input = u_Input & "'" & ListBox1.Items(i).Text & "',"
07                 '== .Text 才能取得 test資料表的 Title欄位
08             End If
09         Next
10
11           u_Input = Left(u_Input, Len(u_Input) - 2)    '== 去除最後的單引號(') 與逗號(,)
12         u_Input = Right(u_Input, Len(u_Input) - 1)  '== 去除最前面的的單引號(')
13         Response.Write(u_Input & "<br>")
14
15
16
17         '//============================================
18
19         Dim SqlDataSource2 As SqlDataSource = New SqlDataSource
20         '== 連結資料庫的連接字串 ConnectionString  ==
21         SqlDataSource2.ConnectionString = "連結資料庫的連接字串"
22
27
28         '//== 最後,合併成完整的SQL指令 ==
29         SqlDataSource2.SelectCommand = "SELECT [id], [test_time], [title], [summary] FROM [test] WHERE [title] IN ('" & u_Input & "')"
30
31         '//== 執行SQL指令 .select() ==
32         Dim dv As DataView = SqlDataSource2.Select(New DataSourceSelectArguments)
33
34         GridView1.DataSource = dv
35       GridView1.DataBind()
36
37
38     End Sub

 

 

原本想用這種方法來作,但成果一直不太滿意

      SqlDataSource2.SelectParameters.Add("u_title", u_Input)

      SqlDataSource2.SelectCommand = "SELECT [id], [test_time], [title], [summary] FROM [test] WHERE [title] IN (@u_title)"

複選時,一直會有狀況。唯有單選會成功。....殘念!

.....................................................................................................................................

 

2010/7/22 補充:

有位好朋友針對上面的程式,提出了一些建議。

您如果參考這個範例,也請補強我的缺失:

1.  若都一個選項都沒勾選,u_Input會是空的

     那麼到了Left() , Right()時會error,必需先判斷才行



2.  要截斷前後,可以考慮用mid(), 或.net 內建的string.SubString()

     就不必叫用Left(),Right()二次



3.  您組出來的字串,忘了顧慮是否有單引號的問題?



4.  For I as integer =0 to (ListBox1.Items.Count -1)

    雖然可以,但是用 Foreach, 印象中效能好像會好一些

 

感謝網友Alan留言並分享了這個好範例:
 

 

 

相關的文章:

[轉 貼] SqlDataSource的參數,不可以是"資料表名稱" - MIS2000 Lab.的 ...

 

 

 

 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

寫信給我,不要私訊 --  mis2000lab (at) yahoo.com.台灣  或  school (at) mis2000lab.net



ASP.NET遠距教學、線上課程(Web Form + MVC)。 第二門 課程「四折」-- 以MVC課程 作優惠。
第一天課程, "完整" 試聽。  如不滿意  全額退費!
................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ

*********************************************************************************************

*** ASP.NET MVC線上課程 第一天 免費看 (5.5小時) *** 

************************************************************(歡迎索取,免費申請)*****

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

......................................................................................................................................................

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

ASP.NET MVC 5 線上教學

累積時數約 75小時...... 第一天(5.5小時)完整內容,"免費"讓您評估

    MIS2000 Lab.  線上教學影片(YouTube) **免費觀賞**