私は(教育目的のために)SQLクエリを構築する簡単なアプリケーションを持っています。 私はユーザーがSQLにコマンドを書き込める場所にtextareaを作成し、プログラムはそれを実行するか、Sqlexeptionをキャッチしなければなりません。私は安全などについて知っていますが、そのokユーザーはすべてを削除できます:)SQL C#、command(query)が2回実行されています
ok。イムしようとしたときに、今
クエリ=テキストのtextareaから(そのSQLコマンド)
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");
}
}
そして:
SELECT * FROM test
その[OK]を、ここでのコードです。データを表示するGridView。
slleeeccct * from testsste
OK - エラーを示しています。
INSERT INTO test (col1) VALUES ('aaa')
NOT OK-プログラムスローエラーSystem.IndexOutOfRangeException: cannot find table 0
BUTコマンドが正しく実行されました。BUT TWICE。
今私は疑問を持っている:なぜコマンドがTWICE excecuting(2倍DB内の同じデータ)と、なぜfinding table 0
に関するエラーが発生しているが(それはGridViewのmaybe-カントについてですinsert into
でGVを埋めますか)?
ようにそれから読み取るしようとする前に、IF文のチェックはさてあなたは 'SqlCommand.ExecuteScalar'を呼んでいると、あなたは、同じコマンドを使用していることができます'SqlDataAdapter'を呼び出し、そのアダプタにデータセットを埋めるように要求します。それはコマンドを再度実行することになるでしょう。なぜExecuteScalarを呼び出すのですか? –
まあ、コマンドを実行する:)、私は何を呼び出す必要がありますか? – Kafus
@ Kafus、私はJonが 'ExecuteScalar'への呼び出しが恐らく偽であり、安全に削除される可能性があることを暗示していたと思います。 (彼が述べたように、 'SqlDataAdapter'はコマンド自体を実行します) –