2015-05-11 3 views
0

Я пытаюсь заполнить выпадающий список из базы данных, но параметр (Div) имеет несколько значений. Я пытаюсь использовать цикл foreach, но он не работает. Действительно ли это возможно или есть другое решение для этого? Может быть, я должен положить его в таблицу и заселить из него? Поистине буду признателен за любые идеи и предложения.Population dropdownlist from database with multiparameter

вот мой код до сих пор:

//strDiv is generated from another table in database, has multiple value and 
for each Div, it will have many product model 

DCmdInquiry.CommandText = "Select SG.DivCode from Staff as ST, StaffGroup as SG " + 
            " where UserName = @UName and ST.SGroupID = SG.SGroupID"; 

     SqlParameter UName = new SqlParameter("@UName", SqlDbType.VarChar); 
     UName.Value = strTmpName; 
     DCmdInquiry.Parameters.Add(UName); 

     DRInquiry = DCmdInquiry.ExecuteReader(); 

     while (DRInquiry.Read()) 
     { 
      strDiv = DRInquiry["DivCode"].ToString().Split(','); 
     } 

     ddlModelName.AppendDataBoundItems = true; 

     SqlConnection DbConn = new SqlConnection(); 
     SqlCommand DCmdInquiry2 = new SqlCommand(); 

     DbConn.ConnectionString = ConfigurationManager.ConnectionStrings["LDSTestConnectionString"].ConnectionString; 

     DCmdInquiry2.Connection = DbConn; 
     DbConn.Open(); 

     DCmdInquiry2.CommandText = "Select ModelName from ProductModel where Div= @Div"; 

     foreach (string x in strDiv) 
     { 
      SqlParameter Div = new SqlParameter("Div", SqlDbType.VarChar); 
      Div.Value = x; 
      DCmdInquiry2.Parameters.Add(Div); 

      ddlModelName.DataSource = DCmdInquiry2.ExecuteReader(); 
      ddlModelName.DataTextField = "ModelName"; 
      ddlModelName.DataValueField = "ModelName"; 
      ddlModelName.DataBind(); 
     } 

Edit- Мой обновленный код, как предложил Тим Schmelter:

foreach (string x in strDiv) 
{ 
    Div.Value = x; 
    DCmdInquiry2.Parameters.Add(Div); 

    ddlModelName.Items.Add((string)DCmdInquiry2.ExecuteScalar()); 
    DCmdInquiry2.Parameters.Clear(); 
} 
ddlModelName.DataBind(); 

Спасибо.

Update:

После принятия во внимание мнения Джона P и делает много проб и ошибок, я пришел с этим SQL заявление:

select distinct PD.DivCode, PM.ModelName, ST.UserName from ProdDiv as PD 
Join Staff as ST on PD.ProdGroup = ST.SGroupID 
Join ProductModel as PM on PD.DivCode = PM.Div 
where ST.Username = '@UName' 

, который соединяет 3 таблицы, чтобы получить результат. Это работает, но я не уверен, что это лучший способ сделать это.

Я до сих пор не могу понять, как заполнить выпадающий список, используя многопараметрический параметр, который дает более одного результата. Способ работы Тима Шмельтера работает только в одной строке (потому что он использует ExecuteScalar), и мне нужно предоставить все доступные строки.

Поскольку у меня заканчивается время, я просто придерживаюсь вышеуказанного SQL. Возможно, это единственный «правильный» способ сделать это.

+0

Какая ошибка/исключение вы получаете и в какой момент в вашем опубликованном коде? –

+0

Вы привязываете коллекцию к 'dropdownlist' в цикле, который стирает предыдущие данные каждый раз, когда происходит привязка. –

+0

@HarveySpecter это то, что я получил в ExecuteReader(): Имя переменной «@Div» уже объявлено. Имена переменных должны быть уникальными в рамках пакета запросов или хранимой процедуры. – nf91

ответ

0
  • Вы добавляете один и тот же параметр несколько раз в foreach, что вызывает исключение. Либо создайте команду в цикле, используйте SqlCommand.Parameters.Clear, либо меняйте Value каждый раз.
  • Вы также должны указать DataBind ddl после цикла или добавить элементы один за другим.
  • Кроме того, используйте @Div в качестве имени параметра вместо Div.
  • Наконец, вы можете использовать ExecuteScalar вместо ExecuteReader, если вы можете получить только один результат обратно:

SqlParameter Div = new SqlParameter("@Div", SqlDbType.VarChar); 
DCmdInquiry2.Parameters.Add(Div); 
foreach (string x in strDiv) 
{ 
    Div.Value = x; 
    ddlModelName.Items.Add((string)DCmdInquiry2.ExecuteScalar()); 
} 

также использовать using заявление для всего реализующего IDisposable, F.E. ваше соединение. Это гарантирует, что все неуправляемые ресурсы будут удалены, и соединение будет закрыто даже при ошибке.

+0

Я попробую это прямо сейчас спасибо! – nf91

+0

Это как-то работает (я получил первый ряд Product Model для каждого Div), но для каждой модели Div для нескольких моделей возвращается несколько строк. Как я могу заполнить каждую строку? Я попробовал executeReader, но это дает мне ошибку: уже есть открытый DataReader, связанный с этой Командой, который должен быть закрыт первым. Спасибо! – nf91