2016-09-05 2 views
0

У меня есть имена и фамилии для извлечения из БД, но это не работает, как должно. Я получаю имена и фамилии из таблицы, где они находятся в отдельных столбцах. Имена/фамилии отображаются в комбинации combobox/textbox в моей форме. Теперь мне нужно получить эти данные, но в моей БД есть только 4 поля, потому что все имена/фамилии объединены в эти поля (пользовательский запрос). Мой код работает в течение 2 поисков в то время, но не для всех 4. Вот мой код:Динамически извлекать данные Oracle из двойного параметра?

EDIT (это теперь работает - я отделенные параметры и добавил кронштейн ИЛИ):

 Using con As New OracleConnection("Data Source=myDB;User Id=Lucky;Password=MyPassword;") 
       con.Open() 

       Using cmd As New OracleCommand() 
       Dim SQL As String = "Select * FROM MyTable " 
       Dim conca As String = " Where " 

       Dim Person1 As String 
       Person1 = CmbName.Text.Trim & " " & TxtSurname.Text.Trim 

        If Not CmbName.Text = "" Then 
         SQL = String.Concat(SQL, conca, " (USER1 = :user OR USER2 = :user1)")      
         cmd.Parameters.Add(New OracleParameter("user", Person1)) 
         cmd.Parameters.Add(New OracleParameter("user1", Person1)) 
         conca = " and " 
        End If 

       Dim Person2 As String 
       Person2 = CmbName1.Text.Trim & " " & TxtSurname1.Text.Trim 

        If Not CmbName1.Text = "" Then 
         SQL = String.Concat(SQL, conca, " (ADMINISTRATOR1 = :admin OR ADMINISTRATOR2 = :admin1)") 
         cmd.Parameters.Add(New OracleParameter("admin", Person2)) 
         cmd.Parameters.Add(New OracleParameter("admin1", Person2)) 
         conca = " and " 
        End If 

       'Retrieve data using execute reader 
       cmd.Connection = con 
       cmd.CommandText = SQL 
       cmd.CommandType = CommandType.Text 

       Dim dr As OracleDataReader = cmd.ExecuteReader() 
       Dim dt As New DataTable 
       dt.Load(dr) 
       DataGridView1.DataSource = dt 

     End Using 

Я попытался использовать скобки между «и» & «или», но это все еще не работает. Какие-либо предложения ?

ответ

0

Хотя мне не нравится ваш подход, вы должны отделить запросы или получить одну функцию для получения результатов для каждого запроса «Человек». Для вашего решения попробуйте удалить это: conca = " and " из первого и второго «if/else». Добавьте каждый результат в свой datatable, а затем загрузите gridview с помощью datatable.

Вы должны вызвать функцию, аналогичную этой функции, чтобы получить результаты в устройстве для чтения данных, а затем подать данные в формате datatable. Таким образом, вы можете отделить свои запросы. Трудная часть состоит в том, чтобы иметь элегантный способ загрузить ваше datagridview. Мое предложение - прекратить использование данных (они очень плохие). Вы должны использовать IEnumerable или List (Of Object), где вы можете добавить результаты по каждому запросу.

Public Shared Function GetMeDatareader(yourQuery As String) As OracleDataReader 
     Using con As New OracleConnection("Data Source=myDB;User Id=Lucky;Password=MyPassword;") 

      con.Open() 

      Using cmd As New OracleCommand() 
       Dim SQL As String = yourQuery 

       'Retrieve data using execute reader 
       cmd.Connection = con 
       cmd.CommandText = SQL 
       cmd.CommandType = CommandType.Text 

       Dim dr As OracleDataReader = cmd.ExecuteReader() 
       Return dr 
      End Using 
     End Using 
    End Function 
+0

благодарит за ответ. Я думаю, что я не могу удалить conca = "и", потому что это всего лишь моментальный снимок из кода, я больше конкатенации в Query. Взгляните на мой отредактированный вопрос, теперь это работает для меня. Если у вас есть лучшее предложение для меня - как писать короткий код, пожалуйста, дайте мне знать, как это сделать. – LuckyLuke82

+0

@ LuckyLuke82 Если он работает, тогда хорошо. Но вы должны создать динамическую функцию, которая извлекает результаты для вас, затем вы объединяете все в одну таблицу и представляете данные: dtAll = dtOne.Copy() dtAll.Merge (dtTwo) – alwaysVBNET

+0

У вас есть ссылка на любой пример это ? – LuckyLuke82