2015-04-23 3 views
0

В настоящее время я работаю в приложениях с формой окна vb.net с обратным концом sql. В настоящее время у меня проблема с попыткой выставить какой-то код. У меня есть combobox, привязанный к sql-запросу. Я пытаюсь настроить событие для изменения выбора, которое будет выполняться sql-запросом и вставить строку, зависящую от выбранного значения combobox. Я знаю способ сделать это, что заставит меня повторить фактическое заявление sql 6 раз, но я хотел сделать это в более короткой ручной версии. Вот мой код:Изменить sql-параметр на основе общедоступной переменной из оператора if

Dim MachineEnd as string 
     'declare machine end string 
    If Combobox.SelectedValue = 5 Then 
     MachineEnd = "StringA" 
    ElseIf Combobox.SelectedValue = 6 Then 
     MachineEnd = "StringB" 
    ElseIf Combobox.SelectedValue = 7 Then 
     MachineEnd = "StringC" 
    ElseIf Combobox.SelectedValue = 8 Then 
     MachineEnd = "StringD" 
    ElseIf Combobox.SelectedValue = 18 Then 
     MachineEnd = "StringE" 
    ElseIf Combobox.SelectedValue = 15 Then 
     MachineEnd = "StringF" 
     End if 

     'load quick view 
     Using conn1 As New SqlConnection(connstring) 
      conn1.Open() 
      Using comm1 As New SqlCommand("SELECT " _ 
              & "RIGHT('0' + CAST(DATEPART(M, ColA) AS varchar), 2) " _ 
              & "+ RIGHT ('0' + Cast(DATEPART(DD, ColA) AS varchar), 2) " _ 
              & "+ RIGHT('0' + CAST(DATEPART(HH, ColA) AS varchar), 2) " _ 
              & "+ RIGHT('0' + CAST(DATEPART(MINUTE, ColA) AS varchar), 2) AS 'ColNumber', BuildOrder, TimeStamp " _ 
              & "from table1 Where Machine = @Machine AND @MachineFinish IS NULL " _ 
              & "AND Col1 IS NOT NULL", conn1) 
      comm1.Parameters.AddWithValue("@Machine", CBMachine.SelectedValue) 
      comm1.Parameters.AddWithValue("@MachinEFinish", MachineEnd) 
      Dim dt As New DataTable 
      Dim sql As New SqlDataAdapter(comm1) 
      sql.Fill(dt) 
      Datagridview.DataSource = dt 
     End Using 
      conn1.Close() 
     End Using 

Моя проблема возникает в переменной «MachineEnd». В связи с тем, что оператор if не включает sql-запрос, я оставил переменную «MachineEnd» в инструкции параметра undefined. Тем не менее, если я переведу свой конец, если оператор включить sql-запрос, мне пришлось бы скопировать инструкцию sql 6 раз, и я хочу попробовать и сделать это за меньшее количество строк. Я думаю, мне нужно либо сделать MachineEnd общедоступной, либо использовать другой тип команды vb.net, может быть, оператор select case. Причина, по которой я делаю это, состоит в том, что у меня есть разные имена столбцов, которые соответствуют строкам, stringB и т. Д. И т. Д., И мне нужно объявить их как null при загрузке datagridview.

-------------- Опубликовать Редактировать ------------------------- Произведено изменение к соответствию дан. Я попробовал это, и похоже, что он работает, однако я получаю сообщение об ошибке, в котором говорится, что переменная «machineEnd» используется до того, как ей присвоено значение, и может привести к dbnull. Но, когда я запускаю код и добавляю часы к переменной, он говорит, что правильная строка привязана к переменной. Но мой datagridview не заполняется правильно. Я поместил свой код sql в студию управления сервером sql, и код работал правильно. Я не уверен, что с этим происходит.

------------------- Редактировать 2 ------------------------- --------- Я узнал, что использование инструкции параметра addwithvalue приводит к возврату datagridview. Если я использую & MachineEnd & в моей инструкции sql, код действительно работает. учитывая, что combobox является привязкой к базе данных. Я уверен, что инъекция sql-инъекций довольно маловероятна.

+0

Я не использовал VB в то время, но в большинстве языков, если экземпляр переменной вне если утверждение, это будет собственно сфера. Попробуйте добавить 'MachineEnd =" "' перед операторами if. – dan08

+0

Нравится это ?? MachineEnd = "StringA" Если Combobox.SelectedValue = 5 – Cheddar

+0

Ум, мой комментарий неправильный, позвольте мне добавить ответ, который будет более понятным. – dan08

ответ

1

Вы должны создать экземпляр переменной вне конструкции IF, чтобы она была в правильном объеме. Затем используйте оператор присваивания var = "val" внутри если заявления:

Dim MachineEnd As String 
    'declare machine end string 
If Combobox.SelectedValue = 5 Then 
    MachineEnd = "StringA" 
ElseIf Combobox.SelectedValue = 6 Then 
    MachineEnd = "StringB" 
ElseIf Combobox.SelectedValue = 7 Then 
    MachineEnd = "StringC" 
... 
    End if 
... 
+0

См. Мой отредактированный пост, комментарии на этом внизу. – Cheddar

+0

Что делать, если вы изменили объявление на «Dim MachineEnd As String =" "? – dan08

+0

Это не работает, однако кажется, что проблема возникает из моего выражения параметра под моей операцией sql. Если я не использую параметр и использую что-то вроде этого «& MachineEnd &», он работает. Тем не менее, оставляя такой код, заставляет меня беспокоиться о SQL-инъекции, – Cheddar

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