[英]Passing multiselect selected items into SQL Server 2008
我似乎在網上找不到很好的例子。 我想要做的是將多選列表框的所有值傳遞到SQL存儲過程中,以將它們寫入表中。
我知道如果我想將一個選定的值傳遞給SQL,我會這樣做:
C#:
using (SqlCommand cmd = new SqlCommand("sp_RegisterUser", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
cmd.Parameters.Add("@UserPreferences", SqlDbType.Char).Value = MatchPrefs.SelectedValue;
cmd.Parameters.Add("@UserName", SqlDbType.Char).Value = UserName.Text;
conn.Open();
cmd.ExecuteNonQuery();
SQL:
ALTER PROCEDURE [dbo].[sp_RegisterUser]
@UserPreferences varchar(max),
@UserName varchar(25)
AS
BEGIN
INSERT INTO tmpUserMatch (
UserID,
MatchField,
MatchValue
)
VALUES (
(SELECT Top 1 UserID FROM tmpUsers WHERE UserName = @UserName),
'MatchPreferences',
@UserPreferences
)
END
但是,如果MatchPrefs是多選的,我該怎么辦?
編輯
我將C#部分替換掉了,方法是:
cmd.Parameters.Add("@UserPreferences", SqlDbType.Char).Value = MatchPrefs.SelectedValue;
與:
var selectedInterests = MatchPrefs.Items.Cast<ListItem>().Where(item => item.Selected).Select(item => item.Value).ToList();
string strInterests = String.Join(",", selectedInterests).TrimEnd();
cmd.Parameters.Add("@UserPreferences", SqlDbType.Char).Value = strInterests;
在SQL端,我有一個函數將創建一個表值參數:
SELECT * FROM dbo.CSVToTable(@UserPreferences)
只需一些幫助即可完成我需要包括的2個其他字段的SQL端; UserID和MatchField。
sp_
(這會降低性能,因為這會導致SQL Server首先在[master]
DB中查找) SqlDbType.VarChar
-1
表示MAX
,但我非常懷疑您是否需要8000個字符) @UserPreferences
輸入參數定義應具有匹配的最大長度(再次,沒有理由使用MAX
) @UserName
以便您可以查找它。 而是@UserID
。 如果在多個頁面上使用它,請事先進行查找並將其存儲在Session或ViewState中,否則在加載初始頁面時會獲取它。 DataAdapter
? INSERT INTO SchemaName.tmpUserMatch (
UserID,
MatchField,
MatchValue
)
SELECT
@UserID,
'MatchPreferences',
csv.SplitVal
FROM dbo.SplitCSV(@UserPreferences) csv;
從多選中獲取列表:
private string GetList(ListItemCollection list)
{
string separadosporcoma = "";
if (list.Count > 0)
{
foreach (ListItem item in list)
separadosporcoma += item.Value + ",";
separadosporcoma = separadosporcoma.TrimEnd(',');
}
return separadosporcoma;
}
在SQL Server中,我使用此表值函數:
ALTER function [dbo].[fn_ParseCSVString]
(
@CSVString varchar(8000) ,
@Delimiter varchar(10)
)
returns @tbl table (s varchar(1000))
as
begin
declare @i int ,
@j int
select @i = 1
while @i <= len(@CSVString)
begin
select @j = charindex(@Delimiter, @CSVString, @i)
if @j = 0
begin
select @j = len(@CSVString) + 1
end
insert @tbl select substring(@CSVString, @i, @j - @i)
select @i = @j + len(@Delimiter)
end
return
end
在存儲過程的where子句中,我這樣調用sql函數:
ALTER PROCEDURE [dbo].[GetValuesWithList]
@MyList AS VARCHAR(1000)
SELECT values
FROM MyTable
WHERE items in (SELECT * FROM dbo.fn_ParseCSVString(@MyList, ',') fn_ParseCSVString)))
我認為這可能對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.