摘要:[習題]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 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 補充:
有位好朋友針對上面的程式,提出了一些建議。
您如果參考這個範例,也請補強我的缺失:
那麼到了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 約 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.主講 事先錄好的影片,並非上課側錄! 觀看時,有如「一對一」面對面講課。