2016-04-09 14 views
0

現在私の教授は、ADO.NETを使用してSQL Serverにデータを保存するケーススタディを実装する必要があります。 SQL Serverでデータベースとテーブルを作成しましたが、C#ADO.NETによってVisual Studioでいくつかのフォームを作成しようとしています。私はYouTubeのビデオに従って書く。しかし、なぜデータをデータベースに正常に保存できないのかわかりません。ADO.NETプログラミングでエラーが発生しました - ExecuteNonQueryにはオープンで利用可能な接続が必要です

結果は次のようになります。

ご協力いただければ幸いです。

namespace casestudy 
{ 
    public partial class Form2 : Form 
    { 
     SqlConnection vcon2 = new SqlConnection(@"Data Source=SOPHIA-PC\SQLEXPRESS;Initial Catalog=casestudy;Integrated Security=True"); 

     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void Form2_Load(object sender, EventArgs e) 
     { 
      try 
      { 
       vcon2.Open(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("error.occured" + ex.Message); 
       this.Dispose(); 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string vsql = string.Format("insert into Calluser values ({0}, '{1}', '{2}', {3})", Int32.Parse(txtUserID.Text), txtFName.Text, txtLName.Text, Int32.Parse(txtZoneID.Text)); 
      SqlCommand vCom = new SqlCommand(vsql, vcon2); 
     try 
     { 
      vCom.ExecuteNonQuery(); 
      vCom.Dispose(); 
      MessageBox.Show("The User Information stored."); 
      txtZoneID.Text = ""; 
      txtLName.Text = ""; 
      txtFName.Text = ""; 
      txtUserID.Text = ""; 
      txtUserID.Focus(); 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show("error.occured" + ex.Message); 
      this.Dispose(); 
     } 
    } 
} 
} 
+0

あなたはは、ExecuteNonQueryからの結果で見ることができます。これがOKかどうかを見てください。値を保存したい列名をselect文 – BHuelse

+0

に追加してみてください。1. "late/close early"の原則に従ってください。つまり、クリックイベントハンドラで接続を開いたり閉じたりします。 2.オブジェクトを処分するのは一般的には好ましくない方法です。オブジェクトの「作成者」は廃棄を担当します。あなたの例で、クリックハンドラにエラーがあり、フォームがそれ自身を破棄した後、ユーザがボタンを再びクリックするとどうなりますか? 3.「SQLインジェクション」の記事を参照してください。 ""); go; drop table CallUser;あなたのユーザのタイプが " ? コードは問題なく表示されますが、どのようなエラーメッセージが表示されますか? –

答えて

0

接続が実際に開いており、アプリケーションまたはフォームを開くときExecuteNonQuery()

if (vcon2.State != ConnectionState.Open) 
{ 
    vcon2.Open(); 
} 
vCom.ExecuteNonQuery(); 
0

が接続を開く呼び出す直前にそれを再開しない場合は、おそらくいないかどうかを確認するためのチェックを追加することができます最高のアプローチ。 SQLを実行してできるだけ早くクローズする直前に接続を開きたいとします。

つまり、私はForm2_Loadイベントからコードを削除することをお勧めします。また、そこから呼び出すbutton1_Clickや他のメソッドのすべてを行います。アプリケーションのデータアクセスを行うクラスまたはコンポーネントを用意することがさらに効果的です。また、例外がスローされてもリソースが確実に処理されるように、usingステートメントを使用してください。

using (SqlConnection connection = new SqlConnection(@"Data Source=SOPHIA-PC\SQLEXPRESS;Initial Catalog=casestudy;Integrated Security=True");)) 
    { 
     SqlCommand command = new SqlCommand(vsql, connection); 
     command.Connection.Open(); 
     command.ExecuteNonQuery(); 
    } 

使用してステートメントのいくつかの情報:

http://www.dotnetperls.com/using

https://msdn.microsoft.com/en-us/library/yh598w02.aspx

関連する問題