[習題]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

線上課程教學,遠距教學 (Web Form 約 51hr)  https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015

線上課程教學,遠距教學 (ASP.NET MVC 約 140hr)  https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab

 

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

 (1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A 

 (2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I 

[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm  。 https://mis2000lab.medium.com/%E5%AD%B8%E5%93%A1%E6%84%9F%E8%A8%80-mis2000lab%E8%AA%B2%E7%A8%8B%E8%A9%95%E5%83%B9-asp-net-mvc-webform-77903ce9680b  


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 MVC  => .NET Core MVC 線上教學  ...... 第一天課程 完整內容 "免費"讓您評估 / 試聽

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講   事先錄好的影片,並非上課側錄!   觀看時,有如「一對一」面對面講課