В настоящее время я работаю в приложениях с формой окна 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-инъекций довольно маловероятна.
Я не использовал VB в то время, но в большинстве языков, если экземпляр переменной вне если утверждение, это будет собственно сфера. Попробуйте добавить 'MachineEnd =" "' перед операторами if. – dan08
Нравится это ?? MachineEnd = "StringA" Если Combobox.SelectedValue = 5 – Cheddar
Ум, мой комментарий неправильный, позвольте мне добавить ответ, который будет более понятным. – dan08