2016-07-13 9 views
-1

Ich habe ein Formular mit Schaltfläche, die Datensätze aus Oracle-Datenbank finden sollte. Ich habe drei Textfelder auf demselben Formular, und wenn Text mit Werten in Feldern von DB übereinstimmt, sollte Datagrid mir diese Datensätze anzeigen. Hier ist mein Code:Dynamische SQL - Abrufen von Oracle

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     'connect to oracle DB 
     Dim oradb As String = "Data Source=orcl;User Id=Lucky;Password=Example;" 
     Dim conn As New OracleConnection(oradb) 
     conn.Open() 

     Dim SQL As String 

     SQL = "SELECT * FROM MyTable WHERE 1=1" 

     'SQL statement for 1st textbox 
     If Not TxtName.Text = "" Then 
      SQL = SQL & " AND USER_NAME =" & TxtName.Text 
     End If 

     'SQL statement for 2nd textbox 
     If Not TxtSurname.Text = "" Then 
      SQL = SQL & " AND USER_SURNAME =" & TxtSurname.Text 
     End If 

     'SQL statement for 3rd textbox 
     If Not TxtAddress.Text = "" Then 
      SQL = SQL & " AND USER_ADDRESS=" & TxtAddress.Text 
     End If 

     'select SQL statements and retrieve data using ExecuteReader 
     Dim cmd As New OracleCommand(SQL, conn) 
     cmd.CommandType = CommandType.Text 
     Dim dr As OracleDataReader = cmd.ExecuteReader() 

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

     End Sub 

Was mache ich falsch, passiert nichts beim Klicken auf die Schaltfläche?

+0

Sie über die Parameter für Ihre Eingabewerte werden sollen. Entferne auch das 'wo 1 = 1', es dient keinem Zweck. –

+0

Hallo Andrew. Welche Parameter, ich bin VB.NET-Neuling? "Where 1 = 1" dient in Access und einige DB, dachte ich auch hier, werde es entfernen. – LuckyLuke82

+0

@ LuckyLuke82 er meint, verketten Sie nicht Ihren Wert zu Ihrer Frage. Jemand könnte ein Sonderzeichen in das Textfeld schreiben und Ihre Datenbank vermasseln. –

Antwort

2

Dies ist eine nicht-untersuchte Probe der Richtung, die Sie könnten versuchen:

Private Sub populateDataGridView() 

     'connect to oracle DB 
     Const connectionString As String = "Data Source=orcl;User Id=Lucky;Password=Example;" 

     Using conn As New OracleConnection(connectionString) 

      conn.Open() 

      Using cmd As New OracleCommand() 

       Dim SQL As String = "SELECT * FROM testtable " 
       Dim conjunction As String = " Where " 
       'SQL statement for 1st textbox 
       If Not TxtName.Text.Length = 0 Then 
        SQL = String.Concat(SQL, conjunction, " USER_NAME like :username") 
        cmd.Parameters.Add(New OracleParameter("username", String.Concat("%", TxtName.Text, "%"))) 
        conjunction = " and " 
       End If 

       'SQL statement for 2nd textbox 
       If Not TxtSurname.Text.Length = 0 Then 
        SQL = String.Concat(SQL, conjunction, " user_surname like :usersurname") 
        cmd.Parameters.Add(New OracleParameter("usersurname", String.Concat("%", TxtSurname2.Text, "%"))) 
        conjunction = " and " 
       End If 

       'SQL statement for 3rd textbox 
       If Not TxtAddress.Text.Length = 0 Then 
        SQL = String.Concat(SQL, conjunction, " user_address like :useraddress") 
        cmd.Parameters.Add(New OracleParameter("useraddress", String.Concat("%", TxtAddress.Text, "%"))) 
       End If 

       'select SQL statements and retrieve data using ExecuteReader 
       cmd.Connection = conn 
       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 
     End Using 
    End Sub 
+0

Andrew, ok jetzt sehe ich, was Sie dachten. Obwohl immer noch nichts passiert, genauso wie zuvor - wenn ich auf die Schaltfläche klicke, wird nur ein weiteres leeres Datagrid angezeigt. Datagrid ist ein geteilter Container, ich habe nur It hinzugefügt und Spalten erstellt - muss ich noch etwas mit Datagrid machen? – LuckyLuke82

+0

Ist der ExecuteReader erfolgreich? I.e. Hast du Zeilen im Ergebnis? Sie müssen keine Spalten erstellen, da sie die Spalten aus der Datentabelle übernehmen sollen. –

+0

Ich habe Spalten entfernt. Jetzt bekomme ich Zeilen im Ergebnis, aber leer, wie zuvor. – LuckyLuke82