2012-04-02 8 views
0

私のリストをデータベースに書き込もうとしていて、iveさんにはいくつか質問がありました。まず何のデータベースに保存されますように思われるが、SOFARクラッシュを引き起こすと私は、コードのこの作品は、私のために過去に働いているという事実を知っているだろう何のエラーをtheresの:<T>をデータベースに戻してもう一度

public void saveToDb(int var1, string var2) 
    { 
     SqlCommand cmd = new SqlCommand("Insert into [table] (col1, col2) VALUES (@param1, @param2)", conn); 

     cmd.Parameters.AddWithValue("@param1", var1); 
     cmd.Parameters.AddWithValue("@param2", var2); 
     cmd.Connection.Open(); 
     cmd.ExecuteNonQuery(); 
     cmd.Connection.Close(); 
    } 

私が持っています3つの部分のレイヤー、Ui、ロジックとDALが続きます。まず第一に、DALクラスライブラリのデータベースとapp.configファイルで作業しなかったので、それらはメインクラスライブラリに移動され、既存のデータベースについての泣き言ではなく、接続文字列が見つかりました。

は、このようにそれをやって、この方法イムにデータを送信するには:

for (int i = 0; i < myList.Count; i++) 
     { 
      da.saveToDb(myList.val1, myList.val2); 
     } 

その私のコードのエラーを与えるが、何も保存されていないようにみえたり、私はプログラムを停止するが、私はいけないときresettedされていませんどちらを知っているのですが、変数を挿入する前に変数を正しく渡すことができるので、Dbがリセットされていると思いますか?私のdbをデバッグフォルダーに入れて、毎回何かをフラッシュしていますか?

もう一つは、これはフォームだったので、一度に1つのインサートになるはずだったのですが、今はオブジェクトのリストには1から多くのオブジェクトが含まれる可能性があります。私のリストの中のオブジェクトごとに一度db接続を開いたり閉じたりしますか?一括挿入はどのように行いますか?データセットについて読んだことがありますが、それらはすべてデータベースからの読み込みではなく、それについてはわかりません。私は、Datasetとアダプタを使って別のプロジェクトのデータベースから読んだので、問題はないはずですが、テーブルにリストを一括して送るにはどうしたらいいですか?それは私がそれらをループし、それぞれのプロパティを追加する必要があるので、私はちょっと難しいabitを作るために私はちょうど10のpropertys 8が1つのテーブルに行くつもりと残りの2は2番目のテーブルに行くため、リスト全体を変換することはできませんそれぞれのデータセット(または使用するもの)。

編集

まあIVEは現在、二つの方法とその作品のどれをしようといくつかの調整とイムを行っていないが、どちらもイライラなっているエラーのいずれかを提供します。

最初の方法:

public void saveToDb(int val1, string val2) 
    { 
     SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString); 
     SqlCommand cmd = new SqlCommand("Insert into [table] (val1, val2) VALUES (@param1, @param2)", conn); 

     cmd.Parameters.AddWithValue("@param1", val1); 
     cmd.Parameters.AddWithValue("@param2", val2); 
     cmd.Connection.Open(); 
     cmd.ExecuteNonQuery(); 
     cmd.Connection.Close(); 
    } 

そして、私はテーブルをsqlbulkcopyしようとする第二:

public void SaveToDb() 
    { 

     using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString)) 
     { 
      conn.Open(); 

      using (SqlBulkCopy bulk = new SqlBulkCopy(conn)) 
      { 
       bulk.ColumnMappings.Add("col1", "col1"); 
       bulk.ColumnMappings.Add("col2", "col1"); 
       bulk.DestinationTableName = "[table]"; 

       System.Diagnostics.Debug.Print("Open"); 
       bulk.WriteToServer(tab); 
       foreach (DataRow row in tab.Rows) 
       { 
        foreach (var item in row.ItemArray) 
        { 
         System.Diagnostics.Debug.Print(item.ToString()); 
        } 
       } 
       System.Diagnostics.Debug.Print("sending"); 
      } 
      System.Diagnostics.Debug.Print("closing"); 
     } 
    } 

テーブルを持つテーブルとまったく同じ列が含まれているので、私はそれをマッピングする必要があるはずの同じ名前(大文字/小文字)ですが、インクリメントするプライマリキーで変わってしまいますので、インクリメントを自動的に追加する必要がありますが、何も挿入されないので、十分に印刷されていますが、 nullを指定できないというエラーエド(それは本当です私のテーブルはnullsを取るだろう)しかし、その値は、そこにテーブルからヌルではないはずですか?

+0

私は、これらのレコードが挿入されていないことを確認するためにデータベースを調べたと仮定しています。 –

+0

グローバル接続を使用せず、 'connection'の代わりに' using-statement'を使用し、暗黙的に接続を閉じる 'SqlCommand'を使用してください。これは例外の場合にも機能します。あなたの接続は開いたままになります。 –

+0

私はdbを見ましたが、Timさんに感謝の言葉があります。 – nejs

答えて

3

インデックスを忘れてしまったようです。

for (int i = 0; i < myList.Count; i++) 
    { 
     da.saveToDb(myList[i].val1, myList[i].val2); 
    } 
+0

さて、私はそれに気がついたが、ここにコードを入力したときにそのコードを見逃してしまった:p。 – nejs

0

あなたは接続オブジェクトが不足していると思います。 var cn = new SqlConnection()。 次に、接続オブジェクトでopenを呼び出します。

connection.commandコマンドオブジェクトにアクセスできます。

+0

接続オブジェクトはグローバルですが、Timsのコメントとこれに従ったものです。 – nejs

関連する問題