2016-05-03 4 views
0

Ich habe eine POS-ähnliche Anwendung entwickelt und beim Testen mit 2 PCs hatte ich keine Probleme mit der Geschwindigkeit. Es ist nur ein einfaches LAN-Kabel-Setup zwischen zwei Computern. Aber als ich es in einem Client bereitgestellt habe, lief es langsam.C# - Warum ist MySQL Server in meiner Servermaschine langsam?

Der Client hat 1 PC als Admin und den Hauptserver, und es gibt 2 weitere PCs als Kassierer. Alle in einem Router verbunden. Die Kassierer sind mit dem Admin-PC (Hauptserver) verbunden, um Daten abzurufen, einzufügen, zu aktualisieren und zu löschen. Ich möchte nur fragen, ob es Prozesse gibt, die in MySQL ausgeführt werden müssen oder ob irgendetwas mit meinen Codes falsch ist, wenn ich mich mit der Datenbank verbinde.

Hier ist mein Beispielcode für die Verbindung mit der Datenbank, ich habe Zweifel, Probleme damit, wie dies der Standard bei der Verbindung zu einer Datenbank und Hinzufügen von Datensätzen war. Nur für den Fall, dass ich Sie mit Codes langweilen könnte, können Sie einfach zu dem zweiten Code springen, den ich gepostet habe. Ich habe dort einen Kommentar, ob die Initialisierung meiner Klasse korrekt ist. Danke allen!

class DBConnection 
{ 
    private MySqlConnection connection; 
    private MySqlCommand cmd; 
    private MySqlDataReader dr; 
    private DataTable tbl; 
    private MySqlDataAdapter da; 
    private DataSet ds; 
    private string connectionString; 
    private string server; 
    private string database; 
    private string uid; 
    private string password; 

    private frmNotifOk myNotification; 
    public DBConnection() 
    { 
     Initialize(); 
    } 
    private void Initialize() 
    { 
     server = "CASHIER"; 
     database = "sampledb"; 
     uid = "root"; 
     password = "samplepassword"; 
     connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";"; 
     connection = new MySqlConnection(connectionString); 
    } 

    private bool OpenConnection() 
    { 
    try 
    { 
     connection.Open(); 
     return true; 
    } 
    catch (MySqlException ex) 
    { 
     switch (ex.Number) 
     { 
      case 0: 
       MessageBox.Show("Cannot connect to server."); 
       break; 
     } 
     return false; 
    } 
} 

private void CloseConnection() 
{ 
    try 
    { 
     connection.Close(); 
    } 
    catch (MySqlException ex) 
    { 
     MessageBox.Show("Error: " + ex.Message); 
    } 
} 

public void AddRecord(String DBQuery, bool showNotif) 
{ 
    string query = DBQuery; 
    bool notify = showNotif; 
    try 
    { 
     if (this.OpenConnection() == true) 
     { 
      cmd = new MySqlCommand(query, connection); 
      cmd.ExecuteNonQuery(); 
      if (notify) 
      { 
       MessageBox.Show("Item successfully added."); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error: " + ex.Message); 
    } 
    finally 
    { 
     this.CloseConnection(); 
    } 
} 

Und schließlich ist hier, wie ich die Methode in einem Formular verwenden:

public partial class frmNewCashier : Form 
{ 
    private DBConnection dbConnect; 
    string sampleDataSource= "SELECT * FROM SampleTable"; 

    public frmNewCashier() 
    { 
     InitializeComponent(); 
     //Is this the correct place of initializing my DBConnection class? 
     dbConnect = new DBConnection(); 
    } 

    private void frmCashier_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      dgvSearchItems.DataSource = dbConnect.DatabaseToDatagrid(dgvSearchItemsDataSource); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: " + ex.Message); 
     } 
    } 

} 

ich in public frmNewCashier() die Initialisierung von DBConnection Klasse setzen, dann ist dies der richtige Ort, oder sollte ich es in Load-Ereignis oder irgendwo? Ich denke, wenn das mit der Langsamkeit der Datenbank zusammenhängt. Abgesehen von dieser Frage, weißt du etwas, das ich vermisst habe, das die Langsamkeit verursacht?

Antwort

0

Versuchen Sie zuerst, vom Clientcomputer zum Server zu pingen, auf dem der SQL Server installiert ist. Wenn es zu lange dauert, gibt es ein Problem mit der Netzwerkverbindung.

Wenn nicht, setzen Sie einen Debug-Punkt und versuchen Sie das Debuggen, dann identifizieren Sie den Speicherort, der zu lange dauert. Dann wirst du eine Antwort bekommen.

Vergessen Sie auch nicht, jede db-Verbindung nach der Verwendung zu schließen.

+0

Ich schließe immer die Verbindung in das 'finally' von' try catch' ein, damit habe ich keine Probleme damit. Angenommen, der Debug-Punkt ist derselbe wie der Break-Point, was ich verwende, woher weiß ich, ob es zu viel Zeit in Anspruch nimmt? Gibt es eine Funktion im Haltepunkt, die die Zeit misst? Oder sollte ich es nur manuell überprüfen, wenn es Zeit braucht, etwas auszuführen? –

+0

hast du versucht, Server zu bedienen? Wie lange hat es gedauert? –

+0

gibt es eine Option ti Ausführungszeit für Methoden in Visual Studio zu überprüfen, was ist die Version von vs Sie verwenden? –

0

Klasse DBConnect { öffentliche MySqlConnection Verbindung; privater String-Server; private String-Datenbank; private Zeichenfolge UID; privates String-Passwort;

//Constructor 
    public DBConnect() 
    { 
     Initialize(); 
    } 

    //Initialize values 
    public void Initialize() 
    { 
     server = "localhost"; 
     database = "db_sea_horses"; 
     uid = "root"; 
     password = " " ; 
     //password = "123"; 
     string connectionString; 
     connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";"; 
     connection = new MySqlConnection(connectionString); 
    } 


    //open connection to database 
    public bool OpenConnection() 
    { 
     try 
     { 
      connection.Open(); 
      return true; 
     } 
     catch (MySqlException ex) 
     { //0: Cannot connect to server. 
      //1045: Invalid user name and/or password. 
      switch (ex.Number) 
      { 
       case 0: 
        MessageBox.Show("Cannot connect to server. Contact administrator"); 
        break; 

       case 1045: 
        MessageBox.Show("Invalid username/password, please try again"); 
        break; 
      } 
      return false; 
     } 
    } 

    //Close connection 
    public bool CloseConnection() 
    { 
     try 
     { 
      connection.Close(); 
      return true; 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
      return false; 
     } 
    } 

}


Klasse DBmethods: DBConnect { DataSet dataset2;

public void input_sql(string query) 
{ 
    try 
    { 
     //open connection 
     if (this.OpenConnection() == true) 
     { 
      //create command and assign the query and connection from the constructor 
      MySqlCommand cmd = new MySqlCommand(query, connection); 

      //Execute command 
      int x = cmd.ExecuteNonQuery(); 
       //close connection 
      this.CloseConnection(); 

     } 

    } 

    catch(MySqlException myex) 
    { 
       MessageBox.Show(ex.Message); 
    } 
} 

/////////////////////////////////////////////// 
///// select 
///////////////////////////////////////////// 

public DataSet output_sql(string query,String table_name) 
{ 


     //Open connection 
     this.OpenConnection(); 

     DataSet dataset = new DataSet(); 

     MySqlDataAdapter adapter = new MySqlDataAdapter(); 
     adapter.SelectCommand = new MySqlCommand(query, connection); 
     adapter.Fill(dataset, table_name); 
     //close Connection 
     this.CloseConnection(); 
     //return list to be displayed 
    return dataset; 


} 

} 

}


Methode aufrufen Beispiel

1) insert/update/delete Anweisung

DBmethods dbm = new DBmethods(); dbm.input_sql ("Sie können die Abfrage einfügen/aktualisieren/löschen");

2) SELECT-Anweisung

DataSet ds = dbm.output_sql ("select * from storage_bunkers wo LIKE '% + itemname.Text +" % JOB_ID "'", "storage_bunkers"); DataView myView = ((DataTable) ds.Tabellen ["storage_bunkers"]). DefaultView; dataGridView1.DataSource = myView;

+0

DBConnection-Klasse in öffentlichen FrmNewCashier(), das ist keine bewährte Methode –