摘要:[習題]SqlDataSource的參數,搭配 SQL指令的 Select ...IN...
初學者可以先看看這 2篇文章,把基礎的 SqlDataSource精靈設定學習一下
===============================================================
有一位讀者想要做一個功能,但他講得不太清楚
我猜測是一個類似搜尋、或是兩個控制項連動的功能。
但他堅持SQL指令(Select),必須使用 IN。
其實,上面的SQL指令,跟下面的SQL指令是一樣的。
.......................................................................................................................................
問題來了
直接使用 (畫面上)SqlDataSource的設定精靈,我做不到這樣的功能。
需要撰寫後置程式碼。
但我發現一件事:
SqlDataSource會自動在參數前後,加上單引號(')
例如:

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畫面 ---
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

02

03

04 For i As Integer = 0 To (ListBox1.Items.Count - 1)
05

06

07

08

09

10

11 u_Input = Left(u_Input, Len(u_Input) - 2) '== 去除最後的單引號(') 與逗號(,)
12

13

14

15
16

17 '//============================================
18

19 Dim SqlDataSource2 As SqlDataSource = New SqlDataSource
20

21

22

27

28 '//== 最後,合併成完整的SQL指令 ==
29

30

31 '//== 執行SQL指令 .select() ==
32

33

34 GridView1.DataSource = dv
35

36

37
38

原本想用這種方法來作,但成果一直不太滿意
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 補充:
有位好朋友針對上面的程式,提出了一些建議。
您如果參考這個範例,也請補強我的缺失:
那麼到了Left() , Right()時會error,必需先判斷才行
2. 要截斷前後,可以考慮用mid(), 或.net 內建的string.SubString()
就不必叫用Left(),Right()二次
3. 您組出來的字串,忘了顧慮是否有單引號的問題?
4. For I as integer =0 to (ListBox1.Items.Count -1)
雖然可以,但是用 Foreach, 印象中效能好像會好一些
相關的文章:
[轉 貼] SqlDataSource的參數,不可以是"資料表名稱" - MIS2000 Lab.的 ...
我將思想傳授他人, 他人之所得,亦無損於我之所有;
猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson
線上課程教學,遠距教學 (Web Form 約51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約75~88hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
ASP.NET MVC線上課程 第一天 免費看 (5.5小時)
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.台灣 或 school (at) mis2000lab.net
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
................ facebook社團 https://www.facebook.com/mis2000lab ......................
................ YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講
事先錄製好的影片,並非上課時側錄! 觀看影片時,有如我「一對一」跟您面對面講課。

ASP.NET MVC 5 => .NET Core MVC 線上教學
累積時數約 95小時...... 第一天(5.5小時)完整內容,"免費"讓您評估
