2017-05-11 8 views
2

In meiner Anwendung es eine Tabelle und importiert Daten erstellt und schreibt dann in die Datenbank, wie unten in einem Teil des Codes angezeigt:basierend auf ungültige Tabellenauswahl erzeugen

private void button3_Click(object sender, EventArgs e) 
{ 
    if (textBox2.Text.Contains(" ")) 
    { 
     MessageBox.Show("Name cannot be blank or contain spaces!"); 
    } 
    else 
    { 
     if (string.IsNullOrEmpty(textBox2.Text)) 
     { 
      MessageBox.Show("Name cannot be blank or contain spaces!"); 
     } 
     else 
     { 
      MessageBox.Show("Currently importing " + textBox2.Text + "...\nA confirmation will be displayed when finished"); 

      string connectionString = "Data Source=bidb;Initial Catalog=STAGING;Integrated Security=True"; 
      string query = "CREATE TABLE [dbo].[" + textBox2.Text + "](" + "[Code] [varchar] (13) NOT NULL," + 
      "[Description] [varchar] (255) NOT NULL," + "[NDC] [varchar] (255) NULL," + 
      "[Supplier Code] [varchar] (38) NULL," + "[Supplier Description] [varchar] (255) NULL, " + "[UOM] [varchar] (8) NULL," + "[Size] [varchar] (8) NULL," + "[Progress][varchar](2) DEFAULT '0')"; 
} 

Aktualisierte Code von oben:

private void button1_Click(object sender, EventArgs e) 
    { 
     if (textBox1.Text.Contains(" ")) 
     { 
      MessageBox.Show("Name cannot be blank or contain spaces!"); 
     } 
     if (string.IsNullOrEmpty(textBox1.Text)) 
     { 
      MessageBox.Show("Name cannot be blank or contain spaces!"); 
     } 
     else 
     { 
      string connectionString = "Data Source=bidb;Initial Catalog=STAGING;Integrated Security=True"; 
      string query = "CREATE TABLE [dbo].[" + textBox1.Text.Replace("'", "''") + "](" + "ID int IDENTITY (1,1)," + "[Code] [varchar] (13) NOT NULL," + 
      "[Description] [varchar] (255) NOT NULL," + "[NDC] [varchar] (50) NULL," + 
      "[Supplier Code] [varchar] (50) NULL," + "[Supplier Description] [varchar] (255) NULL," + "[UOM] [varchar] (8) NULL," + "[Size] [varchar] (8) NULL,)"; 


      using (SqlConnection connection = new SqlConnection(connectionString)) 
      { 
       SqlCommand command = new SqlCommand(query, connection); 
       command.Connection.Open(); 
       command.ExecuteNonQuery(); 
      } 
      MessageBox.Show("Table Created in Database successfully!"); 
      this.Close(); 

     } 
    } 
} 

Danach speichert es in einer Datenbank wie zuvor erwähnt. Nachdem es erstellt wurde. In einem anderen Teil meines Codes lädt es ein ComboBox der Tabelle, die erstellt wurde, die die Spalte "Fortschritt" auf einen Standardwert von Null aktualisiert. Um besser zu verstehen hier, dass der Code-Snippet ist:

{ 

    if (string.IsNullOrEmpty(comboBox4.Text)) 
    { 
     MessageBox.Show("Cannot reset previous value on an empty record,\n please load a table!"); 
    } 
    else 
    { 
     comboBox2.SelectedIndex -= 1; 
     string connectionString2 = "Data Source=bidb;Initial Catalog=STAGING;Integrated Security=True"; 
     string query2 = "UPDATE dbo.[" + comboBox4.Text + "] SET Progress= '0' where code = '" + comboBox2.Text + "'; "; 

Code, der mit den jeweiligen Tabellen füllt:

private void FillCombo() 
    { 



     comboBox4.Items.Clear(); 



     try 
     { 

      string connectionString = "Data Source=bidb;Initial Catalog=STAGING;Integrated Security=True"; 
      using (SqlConnection con2 = new SqlConnection(connectionString)) 
      { 
       con2.Open(); 
       string query = "SELECT * FROM INFORMATION_SCHEMA.TABLES "; 
       SqlCommand cmd2 = new SqlCommand(query, con2); 

       SqlDataReader dr2 = cmd2.ExecuteReader(); 
       while (dr2.Read()) 
       { 
        int col = dr2.GetOrdinal("TABLE_NAME"); 
        comboBox4.Items.Add(dr2[col].ToString()); 
        //con2.Close(); 
       } 
       // comboBox4.SelectedIndex = 0; 

      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

    } 

Ok, das ist gut und in Ordnung, aber mein Problem ist, dass es ja die Tabelle lädt aus Die ComboBox lädt aber auch andere Tabellen aus der Tabelle. Dies ist der Punkt, an dem das Problem auftritt. Wenn ich irgendeine andere Tabelle innerhalb dieser ComboBox listhen, stürzt die Anwendung ab. Dies liegt daran, dass der Code, der die Fortschrittsspalte auf einen Standardwert von Null setzt, nicht existiert, wie es in den anderen Tabellen von der Datenbank erwartet wird. Es wäre nur in der Tabelle, die ich ursprünglich aus meiner Anwendung erstellt habe. Wie würde ich diesen Fehler behandeln, so dass, wenn der Benutzer eine andere als die ursprünglich in meiner Anwendung erstellte Tabelle auswählt, er ihnen sagen kann, dass "die Tabellenauswahl ungültig ist". Grundsätzlich eine solche Fehlermeldung. Wie würde ich das angehen?

+0

Aber wie füllt man diese Combobox4? Der Punkt ist hier. Füllen Sie nur gültige Namen mit der Methode connection.GetSchema aus und überprüfen Sie, welche Tabelle die gültigen Spalten enthält. Als zweite Notiz. Ihr Code ist eine Party für jeden Praktizierenden von Sql Injection – Steve

+1

'1. lernen, parametrisierte Abfrage zu erstellen und oder erstellen Sie Ihre Update-Anweisung und wählen Sie Anweisung und Erstellen von Anweisungen innerhalb einer separaten gespeicherten Prozedur "2. Speichern der Verbindungszeichenfolge in app.config oder web.config file''3. Zeigen oder zeigen Sie uns die genaue Fehlermeldung " – MethodMan

+1

@MethodMan notiert. Wird diese Vorschläge üben. Was die Fehlermeldung betrifft, gibt es keine. Die Anwendung friert nur ein, weil ich eine andere Tabelle ausgewählt habe als die, die zuvor erstellt wurde –

Antwort

1

Wie bereits mehrfach im obigen Kommentar erwähnt, weist Ihr Code viele Probleme auf, die von SQL Injection bis zur fehlenden Validierung korrekter Namen reichen.
Das Lösen all dieser Probleme könnte diese Antwort auf einen ganzen Artikel eskalieren, also beschränke ich mich darauf, Ihnen eine einfache Methode zur Verfügung zu stellen, die nur die Tabellen enthält, die die zwei von Ihrem endgültigen Code benötigten Felder enthalten.

Mit diesem Code können Sie die Combobox4 nur mit gültigen Tabellennamen füllen.
(IE Tabellen, die sowohl den Spalt Fortschritt und die Spalte-Code haben)

SqlDataAdapter da = new SqlDataAdapter(@"SELECT table_name, count(table_name) 
             FROM INFORMATION_SCHEMA.COLUMNS 
             WHERE column_name = 'Progress' OR 
               column_name = 'Code' 
             GROUP BY table_name 
             HAVING count(table_name) > 1", 
         connection); 
DataTable dt = new DataTable(); 
da.Fill(dt); 
combobox4.DataSource = dt; 
combobox4.DisplayMember = "table_name"; 

Achten Sie darauf, zumindest die beteiligten Combobox nicht vom Endbenutzer editierbar sein.

+0

Vielen Dank. Ich werde mir das ansehen und mit meinem Feedback auf Sie zurückkommen. Nebenbei habe ich meinen Post mit dem Code aktualisiert, der die Tabellen lädt. Ich weiß nicht, ob Sie einen Blick darauf werfen wollen und ja die ComboBoxen sind nicht editierbar –

+1

Nun, Sie können einfach die Abfrage mit der oben genannten ändern und es sollte funktionieren. – Steve

Verwandte Themen