2011-12-05 7 views
2

私は出席システムを作成し、グリッドビューを使用してデータを挿入しています。グリッドには多くの行があります。すべてのことが順調で、データもうまくいっています。しかし、私はforループを使って各行をチェックしています。これにより、行数が増えるとパフォーマンスがかなり低下します。また、増加する行数でラウンドトリップが増加します。'for'ループを使用せずにグリッドビューに複数の行を挿入します。

誰でももっと良い解決策を提供できますか?

私はすべてのコードを変更しています.....しかし、今ではグリッドの最後の行を複数回挿入するだけで問題が発生しています......このコード以外は問題ありません。

MySqlDataAdapter myworkdatta = myworkdatta = new MySqlDataAdapter("SELECT CID,EID,TID,ATTENDENCE FROM EMPLOYEEATT ORDER BY AID DESC LIMIT 1", conn); 
            DataSet myworkdsatt = new DataSet(); 
            myworkdatta.Fill(myworkdsatt, "EMPLOYEEATT"); 

            int i; 
            for (i = 0; i < emplist_gv.Rows.Count; i++) 
            { 
             string tid = emplist_gv.Rows[i].Cells[6].Value.ToString(); 
             string eid = emplist_gv.Rows[i].Cells[0].Value.ToString(); 
             string atid = emplist_gv.Rows[i].Cells[7].Value.ToString(); 

             MySqlCommand cmdwk = new MySqlCommand("INSERT INTO EMPLOYEEATT (CID,EID,TID,ATTENDENCE) VALUES (@cid,@eid,@tid,@attendence)", conn); 
             MySqlParameter spcidatt = new MySqlParameter("@cid", calid); 
             MySqlParameter speid = new MySqlParameter("@eid", eid); 
             MySqlParameter sptid = new MySqlParameter("@tid", tid); 
             MySqlParameter spattendence = new MySqlParameter("@attendence", atid); 

             cmdwk.Parameters.Add(spcidatt); 
             cmdwk.Parameters.Add(speid); 
             cmdwk.Parameters.Add(sptid); 
             cmdwk.Parameters.Add(spattendence); 

             myworkdatta.InsertCommand = cmdwk; 

             DataRow drowk = myworkdsatt.Tables["EMPLOYEEATT"].NewRow(); 
             drowk["CID"] = calid; 
             drowk["EID"] = eid; 
             drowk["TID"] = tid; 
             drowk["ATTENDENCE"] = atid; 

             myworkdsatt.Tables["EMPLOYEEATT"].Rows.Add(drowk); 

            } 

            myworkdatta.Update(myworkdsatt, "EMPLOYEEATT"); 
+0

移動は、ループの後にループし、更新テーブル内のテーブルの変更を行い、ループの前に選択します。ループの1回の反復中に2回選択してデータを挿入するのは良い考えではありません。 – Reniuz

+0

Select Statementは、最後の行IDをフェッチし、通常のexpで1だけインクリメントするために必要です。 – Aaraadhana

+0

私は自分のコードをu ...に合わせて変更しましたが、今は問題が発生しているのは、グリッドの最後の行を複数回挿入しています......これ以外にコードは問題ありません。 – Aaraadhana

答えて

1

あなたの2を選択したSQL文を考慮すると、ループの外にそれを取ると、ちょうど十分に簡単にその値を使用することができ、特定の行に関連するものが含まれていないようです。

各行に挿入を行う必要があるため、理由を理解できません。そのため、データベースのヒットを削除するのは難しいようです。

あなたはバルクを行っている場合は、MySQL用のバルク挿入で見ることができる挿入:MySql Bulk insert

+0

この行をDatatableのtempに格納することはできません。後でデータベースに更新されます... – Aaraadhana

+0

私は最後の行IDを取得し、通常のexpで1ずつ増分するため、Select文が必要です。 – Aaraadhana

+0

ファイルに保存し、必要に応じてバックグラウンドでバッチ処理を実行できます。それはメモリやどこにでも保存することができないので、いくらかのディスク書き込みが行われます。おそらくDB書き込みよりもはるかに高速です。 –

0

あなたはSqlBulkCopyを使用することができ、それが使いやすいです。基本的にはデータテーブル(またはデータリーダー)を提供するだけで、そのソースから行先テーブルに行をコピーします。

まもなく、コードブロックは次のようになります。

DataTable dataTableInGridView = (DataTable)emplist_gv.DataSource; 
using (SqlConnection connection = 
      new SqlConnection(connectionString)) 
{ 
    using (SqlBulkCopy bulkCopy = 
        new SqlBulkCopy(connection)) 
    { 
     bulkCopy.DestinationTableName = 
      "dbo.BulkCopyDemoMatchingColumns"; 
     try 
     { 
      // Write from the source to the destination. 
      bulkCopy.WriteToServer(dataTableInGridView); 
     } 
     catch (Exception ex) 
     { 
      // Handle exception 
     } 
    } 
} 
+0

ありがとうございます。私は結果を更新しようとします... – Aaraadhana

+0

SqlBulkCopyはMySQlでサポートされていません – Aaraadhana

関連する問題