2016-11-14 4 views
0

Ich habe eine einfache App zum Erstellen von SQL-Abfrage (für Bildungszwecke). Ich habe Textbereich erstellt, wo der Benutzer seinen Befehl in sql schreiben kann, dann muss das Programm es ausführen oder Sqlexeption abfangen. Ich weiß über die Sicherheit usw., aber es ist okay, Benutzer kann alles löschen :)SQL C#, Befehl (Abfrage) wird zweimal ausgeführt

ok. hier ist der Code:

query = Text von Textfeld (dessen SQL-Befehl)

if (!String.IsNullOrEmpty(query) || !String.IsNullOrWhiteSpace(query)) 
{ 
    string conString = ConfigurationManager.ConnectionStrings["StudentDataBase"].ConnectionString; 

    try 
    { 
     using (SqlConnection SqlCon = new SqlConnection(conString)) 
     {     
      try 
      { 
       SqlCommand command = new SqlCommand(query, SqlCon); 
       SqlCon.Open(); 

       command.ExecuteScalar(); 

       int numOfRows = 0; 

       SqlDataAdapter adpt = new SqlDataAdapter(command); 
       DataTable dt = new DataTable(); 
       DataSet dset = new DataSet(); 
       adpt.Fill(dset); 
       dt = dset.Tables[0]; 
       if (dt.Rows.Count > 0) 
       { 
        numOfRows = dt.Rows.Count; 
        gridview_results.DataSource = dt; 
        gridview_results.DataBind(); 

        Sql_error = "Done. Results: " + numOfRows + " rows."; 
        container_sql_error.Style.Add("background-color", "#b9ffcb"); 
       } 
       else 
       { 
        Sql_error = "0 rows to show."; 
       }       

       SqlCon.Close(); 
      } 
      catch (SqlException ex) 
      { 
       Sql_error = "Error: " + ex.Message; 
       container_sql_error.Style.Add("background-color", "#ff9600"); 
      } 
     } 
    } 
    catch (SqlException ex) 
    { 
     Sql_error = "Error... " + ex.Message; 
     container_sql_error.Style.Add("background-color", "#ff9600"); 
    } 
} 

Und jetzt, wenn im Versuch:

SELECT * FROM test seine OK. GridView zeigt Daten an.

slleeeccct * from testsste ist in Ordnung - zeigt einen Fehler an.

INSERT INTO test (col1) VALUES ('aaa') es ist nicht OK-Programm wirft Fehler System.IndexOutOfRangeException: cannot find table 0 ABER Befehl wurde richtig ABER ZWEIMAL ausgeführt.

Jetzt habe ich eine Frage: Warum Befehl ist ZWEIMAL (2x gleiche Daten in DB) und warum gibt es einen Fehler über finding table 0 (ist es über GridView vielleicht - kann nicht füllen GV mit insert into)?

+1

Nun, Sie 'SqlCommand.ExecuteScalar' sind aufrufen und dann sind Sie mit dem gleichen Befehl mit ein 'SqlDataAdapter' und fragt diesen Adapter, um ein Dataset zu füllen. .. was es tun wird, führen Sie den Befehl erneut aus. Warum rufst du 'ExecuteScalar' überhaupt an? –

+0

Nun, um Befehl auszuführen :), Was soll ich dann anrufen? – Kafus

+1

@Kafus, ich glaube, Jon hat angedeutet, dass der Aufruf von 'ExecuteScalar' wahrscheinlich falsch ist und sicher entfernt werden kann. (wie er sagte, wird der 'SqlDataAdapter' den Befehl selbst ausführen) –

Antwort

1

Zu allererst Sie die Ausführung der Code zweimal

-> eine Zeit, die Sie ExecuteScalar und die andere verwenden Sie die SQLAdapter werden mit dem Datensatz mit zurückgegebenen Ergebnisse zu füllen, können Sie einfach nutzen es wie die folgenden:

1- dataset ds=new dataset(); 

2- adapter.fill(ds); 

3- return ds; 

und das ist es :)

In Bezug auf die inse rt-Abfragefehler, das ist auch normal, weil die INSERT-Anweisung, die Execute Scalar verwendet, die Abfrage ausführt und die erste Spalte der ersten Zeile in der von der Abfrage zurückgegebenen Ergebnismenge zurückgibt. Zusätzliche Spalten oder Zeilen werden ignoriert.

so, wenn Sie Insert-Anweisung verwenden, haben Sie einen Fehler, da entweder

1- der Befehl nicht erfolgreich ausgeführt wurde und hat einen Fehler zurückgegeben „Überprüfen Sie, ob databsae die eingefügten Zeile hat gerade eingegebenen“

2- Dataset-Tabellen keine Daten enthält, können Sie eine IF-Anweisung Prüfung vornehmen, bevor Sie versuchen, von ihm zu lesen wie

"If(ds.tables.count>0) {do something}" 
+0

Danke. Das ist genau das, was ich brauche. – Kafus

Verwandte Themen