2016-11-14 43 views
0

私は(教育目的のために)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を埋めますか)?

+1

ようにそれから読み取るしようとする前に、IF文のチェックはさてあなたは 'SqlCommand.ExecuteScalar'を呼んでいると、あなたは、同じコマンドを使用していることができます'SqlDataAdapter'を呼び出し、そのアダプタにデータセットを埋めるように要求します。それはコマンドを再度実行することになるでしょう。なぜExecuteScalarを呼び出すのですか? –

+0

まあ、コマンドを実行する:)、私は何を呼び出す必要がありますか? – Kafus

+1

@ Kafus、私はJonが 'ExecuteScalar'への呼び出しが恐らく偽であり、安全に削除される可能性があることを暗示していたと思います。 (彼が述べたように、 'SqlDataAdapter'はコマンド自体を実行します) –

答えて

1

まず第一に、あなたは二回

コードを実行している - >あなたはあなただけ使用することができ、返された結果とのデータセットを埋めるためにSQLAdapterを使用しているは、ExecuteScalarを使用して、その他された1つの時間が inseについて

1- dataset ds=new dataset(); 

2- adapter.fill(ds); 

3- return ds; 

、それはそれだ:)

:以下のようなことrtクエリエラーです。これは通常の場合も同様です。Execute Scalarを使用するinsert文はクエリを実行し、クエリによって返された結果セットの最初の行の最初の列を返します。追加の列または行は無視されます。

[挿入ステートメントを使用するときに、あなたがエラーを持っているのいずれか

の1-コマンドが正常に実行され、エラーが返されていなかったため

「databsaeは、あなただけの入力した挿入された行を持っているかどうかを確認してください」

2 - データセットのテーブルデータがない、あなたは

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

ありがとうございます。これは私が必要とするものです。 – Kafus

関連する問題