簡體   English   中英

將多選選定項傳遞到SQL Server 2008中

[英]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。

  1. 不要在procs前面加上sp_ (這會降低性能,因為這會導致SQL Server首先在[master] DB中查找)
  2. 使用SqlDbType.VarChar
  3. 指定最大長度( -1表示MAX ,但我非常懷疑您是否需要8000個字符)
  4. @UserPreferences輸入參數定義應具有匹配的最大長度(再次,沒有理由使用MAX
  5. 不要只傳遞@UserName以便您可以查找它。 而是@UserID 如果在多個頁面上使用它,請事先進行查找並將其存儲在Session或ViewState中,否則在加載初始頁面時會獲取它。
  6. 為什么要實例化DataAdapter
  7. 您的SQL拆分函數不會創建表值參數。 它只是返回結果集。
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM