2017-10-26 8 views
0

ユーザーの入力に基づいてテーブルに値を挿入したいとします。私はこれらの値をいくつかのテキストボックスから得る。私は私のSQLロジックの前にブレークポイントを置き、F10ですべての行を調べると、すべてうまく動作します。 SQLConnectionを開き、SQLCommandを作成して実行し、接続をもう一度閉じます。私はテーブルをリフレッシュし、そこにすべての値を持っています。しかし、私がブレークポイントを削除したり無効にしたりすると、プログラマーはこれらのコード行だけで動作しますが、機能しません。つまり、リフレッシュする頻度に関わらず、テーブルに値が追加されません。ここで SQL Insertデータが正しく機能しない

は私が参照してるのコードです:それは自分で実行すると

try 
{ 
    SqlConnection con = new SqlConnection("Server=...;Database=...;Integrated Security=true;"); 
    con.Open(); 

    SqlCommand com = new SqlCommand("INSERT INTO TestTable (Type,Serialnumber) VALUES('" + TypeText + "','" + SerText + "')", con); 
    //Debug.WriteLine(com.CommandText); 

    com.BeginExecuteNonQuery(); 

    con.Close(); 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+1

よりExecuteNonQueryを使用して使用するのが最良 – BugFinder

+0

@BugFinder限り変数が消毒されていることを、されている可能性があれば教えする方法はありません。とにかく、パラメータ化されたクエリを使用して良いアドバイスです;-) – bradbury9

答えて

1

、それはBeginExecuteNonQuery()を呼び出し、すぐ隣のライン接続が終了する非同期呼び出しを待たずに閉じられています。 F10を実行しているデバッガを使用している間、実行を完全に終了する時間を与えます。代わりにExecuteNonQuery()を使用することを検討してください。開始の欠如に注意してください。

+0

乾杯人!その1つの単語を削除すると、そのトリックは笑いました。 – spacebarisdefect

0

BeginExecuteNonQueryメソッドは、ステートメントの実行中に他のタスクを同時に実行できるように、Transact-SQLステートメントまたは行を返さないストアドプロシージャを非同期に実行するプロセスを開始します。ステートメントが完了したら、開発者はEndExecuteNonQueryメソッドを呼び出して操作を終了する必要があります。 BeginExecuteNonQueryメソッドはすぐに戻ります(CommandTimeoutはBeginExecuteNonQueryには影響しません)が、コードが対応するEndExecuteNonQueryメソッド呼び出しを実行するまでは、同じSqlCommandオブジェクトに対して同期または非同期の実行を開始する他の呼び出しを実行してはなりません。コマンドの実行が完了する前にEndExecuteNonQueryを呼び出すと、実行が終了するまでSqlCommandオブジェクトがブロックされます。

+1

ソースをコピーしたことがあります。https://msdn.microsoft.com/en-us/library/7b6f9k7k(v=vs.110).aspx – hage

0

DMLコードを書く前に、多くのことを考慮する必要があります。以下のリンクを参考にして、リソースを処理する方法を教えてください。

https://stackoverflow.com/a/12142911/6783279

0

SQLインジェクションの問題を検討してくださいBeginExecuteNonQuery

try 
      { 
       using (SqlConnection conn = new SqlConnection("your Connection string")) 
       { 
        conn.Open(); 

        using (SqlCommand cmd = conn.CreateCommand()) 
        { 
         cmd.CommandText = @"INSERT INTO TestTable 
               (Type,Serialnumber) 
               VALUES (@type,@serialnumber)"; 


         cmd.Parameters.AddWithValue("@type", type); 
         cmd.Parameters.AddWithValue("@serialnumber", serialnumber); 

         int rows = cmd.ExecuteNonQuery(); 

         if (rows == 0) 
          throw new Exception("Nothing Inserted into the DB"); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
      } 
関連する問題