2012-03-25 18 views
2

フォームがロードされるとデータベースに接続され、ボタンをクリックするとデータベースに新しい行が挿入されますが、クリックした後は表示されません私のテーブルの変更を参照してください。C#sqlデータベースにデータを挿入できません

namespace database 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     SqlConnection con; 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      con = new SqlConnection(); 
      con.ConnectionString = 
       "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
      con.Open(); 
      MessageBox.Show("OPEN!"); 
     } 

     private void label1_Click(object sender, EventArgs e) 
     { 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      int x; 
      SqlCommand thiscommand = con.CreateCommand(); 
      thiscommand.CommandText = 
       "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery(); /* I used variable x to verify 
                that how many rows are 
                affect, and the return is 1. 
                The problem is that I don't 
                see any changes in my table*/ 
      MessageBox.Show(x.ToString()); 
      con.Close(); 
     } 
    } 
} 
+0

レコードが挿入されたかどうかを確認するために何を使用していますか? SQL Server管理スタジオ? –

+0

質問を投稿するためにユーザー名とパスワードを残しましたか?それとも、コードにまったく入っていませんか? – mowwwalker

+3

なぜForm_Loadで接続を開いていますか?必要な場所で接続を開いて、使用し、閉じます(おそらく処分する)。 –

答えて

9

添付のDbファイルを使用しています。つまり、Project-buildはBinフォルダにコピーを作成し、Dbの2つの異なるバージョンを扱っています。あなたはおそらくオリジナルをチェックインしています。

これは実際には非常に便利です(毎回新鮮なコピー)。そうでない場合は、DbファイルのCopy-whenプロパティを変更します。

+1

+1 *実際の問題ですが良い点があるかどうか分かりません:) – Tigran

+0

ありがとうございました。 これを行うには、適切で効率的な方法は何でしょうか? 私は正常に挿入したようですが、私は正しいdbファイルを表示していないので、 私はdbをオンラインでアップロードする必要がありますか? 申し訳ありませんが、私はこれに新しいです。 –

+0

結果をプログラム自体で表示したり、コピーを制限したり、bin \ debugフォルダーからプロジェクトルートにバージョンを(時々)コピーすることができます。 –

1

データベースに値が表示されない理由を十分に把握するには十分な詳細はありませんが、コードの実行方法を変更して再テストしてできるだけ詳しく説明することをお勧めします物事がどこで失敗しているかについて正確に。あなたはもっと早くあなたが(あなたが必要以上に長く、貴重なリソースを保持することを意味する)する必要があり、接続またはコマンドをクリーンアップしていないよりも、あなたの接続を開く練習

コーディング

。 IDisposableを実装しているため、Dispose()を呼び出す必要があります。これを行う最も簡単な方法はusingステートメントです。

 
Executes a Transact-SQL statement against the connection and returns 
the number of rows affected.

あなたは戻り値として1を取得する場合は、1つのレコードが挿入されている必要があります

推奨リライト:MSDNに次のように

// Remove initialization of the SqlConnection in the form load event. 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = new SqlConnection()) 
    { 
     con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
     con.Open(); 
     // Optional: MessageBox.Show("OPEN!"); 
     int x; 
     using (SqlCommand thiscommand = con.CreateCommand()) 
     { 
      thiscommand.CommandText = "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery();  /*I used variable x to verify that how many rows are affect, and the return is 1. The problem is that i dont see any changes in my table*/ 
      // Optional: MessageBox.Show(x.ToString()); 
     } 
    } 
} 
+0

'using'sに同意しますが、configからConnStringも取得します。 –

+0

'IDisposableS'は削除する必要はありません。また、接続を閉じると、usingステートメントに重複しているものが削除されます(disposeは暗黙に閉じます)。 +1とにかく –

+0

@Tim:con.Close()(更新された答え)を冗長に呼び出さないことについて合意しました。あなたのコメントの最初の部分はどういう意味ですか? –

0

ExecuteNonQuery方法が説明されています。

テーブルを再クエリーするのを忘れましたか?新しいレコードはアプリケーションに自動的に表示されません。

+0

あなたの時間に感謝します。 –

+0

新しいレコードがアプリケーションに自動的に表示されない場合は、クエリが機能するかどうかを確認するにはどうすればよいですか。 これを行うにはもっと良い方法がありますか?オンラインdbまたはSQL管理スタジオを使用するように??? 申し訳ありません私は全く新しいです。 –

+0

NVMでは、mysqlを使用することはsqlserverよりはるかに簡単です。 問題は解決しました。皆さんのおかげでよかったです。 –

0

実際にデータベースに送信されているものを確認するためにSQLプロファイラを実行することを検討できます。 SQLをキャプチャしてから、そのコードをデータベースに対して直接実行してみることができます。

「player_id」は、挿入が失敗した場合にこれがプライマリキーであることを示します。

他の人のように、「使用する」スタイルに変更することをお勧めします。これはリソースを管理し、接続を「ぶら下げない」ようにするためです。

関連する問題