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
)?
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? –
Nun, um Befehl auszuführen :), Was soll ich dann anrufen? – Kafus
@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) –