2015-07-10 1 views
0

Я не могу найти хороший пример этого онлайн. То, что я хочу сделать, - передать все значения многосетевого списка в хранимую процедуру SQL, чтобы записать их в таблицу.Передача многозадачных выбранных элементов в SQL Server 2008

Я знаю, что если я хочу передать одно выбранное значение в 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 является мультиселекцией?

EDIT

У меня есть 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) 

Просто нужна помощь, дополняющая SQL-часть двумя дополнительными полями, которые мне нужно включить; UserID и MatchField.

+5

Вы хотите изучить структурированные параметры в ADO.NET и эквивалентные значения табличных параметров в SQL Server SP. В основном это позволяет вам нажимать строго типизированный список объектов на SQL Server SPs/query. Множество примеров здесь и в Интернете. –

+0

Итак, как это сделать с двумя дополнительными полями, которые мне нужно добавить в таблицу SQL (UserID и MatchField)? –

+1

В качестве побочного примечания вам следует избегать префикса sp_, поскольку он зарезервирован для Microsoft и может вызвать некоторые проблемы с производительностью. http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix Или лучше, просто отбросьте префикс целиком. –

ответ

1
  1. Не префиксов проки с sp_ (это отрицательно сказывается на производительности, поскольку это приводит к SQL Server, чтобы посмотреть в [master] БД первого)
  2. Использование SqlDbType.VarChar
  3. Укажите длину макс (-1 для MAX, но я очень сомневаюсь, что вам нужно даже 8000 символов)
  4. Введите определение параметров для @UserPreferences должны иметь соответствующие максимальную длину (опять же, нет никаких оснований использовать MAX)
  5. не делать перейдите в @UserName, чтобы вы могли посмотреть его. Вместо этого перейдите в @UserID. Посмотрите его заранее и сохраните на сеансе или в ViewState, если вы используете его на нескольких страницах, иначе получите его при загрузке начальной страницы.
  6. Почему вы создаете экземпляр DataAdapter?
  7. Ваша функция разделения SQL не создает параметр таблицы. Он просто возвращает набор результатов.
INSERT INTO SchemaName.tmpUserMatch (
    UserID, 
    MatchField, 
    MatchValue 
) 
SELECT 
    @UserID, 
    'MatchPreferences', 
    csv.SplitVal 
FROM dbo.SplitCSV(@UserPreferences) csv; 
+0

Это сработало для меня. Благодаря! –

0

Получить список из множественного выбора:

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))) 

Я думаю, что это может вам помочь.

 Смежные вопросы

  • Нет связанных вопросов^_^