2017-01-30 7 views
0

DataTableオブジェクトのコレクションDataRowsを使用してAccessテーブルにデータを追加しようとしていますが、ビューアにはデータセットが豊富ですが、 43回。パラメータを間違って設定しているのですか、間違っていますか?DataTableからOLE型テーブルに追加するC#

private void PopulateDB(DataTable dtDB) 
    { 
     lblDataStatus.Text = "populating master table..."; 
     this.Refresh(); 
     progressBar1.Visible = true; 
     progressBar1.Value = 1; 
     progressBar1.Maximum = dtDB.Rows.Count; 
     string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\path\fname.accdb"; 
     using (OleDbConnection conn = new OleDbConnection (strConn)) 
     { 
      using (OleDbCommand cmd = new OleDbCommand()) 
      { 
       foreach (DataRow dr in dtDB .Rows) 
       { 
        progressBar1.PerformStep(); 
       try 
       { 
        cmd.CommandText = "INSERT INTO PMADocMaster(PN, PNNewRev, PN8Digit, ECO, Mon, SupNum, URL) VALUES (?,?,?,?,?,?,?)"; 
        cmd.Parameters.Add("@pn", OleDbType.VarChar).Value = dr.Field<string>("PNFullNum"); 
        cmd.Parameters.Add("@rev", OleDbType.VarChar).Value = dr.Field<string>("PNNewRev"); 
        cmd.Parameters.Add("@pn8", OleDbType.VarChar).Value = dr.Field<string>("PN8Dig"); 
        cmd.Parameters.Add("@eco", OleDbType.VarChar).Value = dr.Field<string>("ECO"); 
        cmd.Parameters.Add("@mon", OleDbType.VarChar).Value = dr.Field<string>("Mon"); 
        cmd.Parameters.Add("@supnum", OleDbType.VarChar).Value = dr.Field<string>("SupNum"); 
        cmd.Parameters.Add("@url", OleDbType.VarChar).Value = dr.Field<string>("URL"); 
        cmd.Connection = conn; 
        conn.Open(); 
        cmd.ExecuteNonQuery(); 
        conn.Close(); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show("Error: " + e.Message); 
        lblDataStatus.Text = e.Message; 
        return; 
        // duplicates are happening, will check veracity of data afterwards 
       } 
       } 
       progressBar1.Visible = false; 
      } 
     } 
    } 
+1

.. cmd.Parameters.clearを(使用)以下のようなコードを最適化することができます。 DBに送信するためにDataTableからデータを引き出すのはむしろ奇妙です – Plutonix

答えて

1

あなたがデータアダプターを使用する場合、それはあなたのためのすべての更新を行います

private void PopulateDB(DataTable dtDB) 
    { 
     lblDataStatus.Text = "populating master table..."; 
     this.Refresh(); 
     progressBar1.Visible = true; 
     progressBar1.Value = 1; 
     progressBar1.Maximum = dtDB.Rows.Count; 
     string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\path\fname.accdb"; 
     using (OleDbConnection conn = new OleDbConnection(strConn)) 
     { 
      using (OleDbCommand cmd = new OleDbCommand("INSERT INTO PMADocMaster(PN, PNNewRev, PN8Digit, ECO, Mon, SupNum, URL) VALUES (?,?,?,?,?,?,?)",conn)) 
      { 
       try 
       { 
        cmd.Parameters.Add("@pn");, OleDbType.VarChar); 
        cmd.Parameters.Add("@rev", OleDbType.VarChar); 
        cmd.Parameters.Add("@pn8", OleDbType.VarChar); 
        cmd.Parameters.Add("@eco", OleDbType.VarChar); 
        cmd.Parameters.Add("@mon", OleDbType.VarChar); 
        cmd.Parameters.Add("@supnum", OleDbType.VarChar); 
        cmd.Parameters.Add("@url", OleDbType.VarChar); 
        conn.Open(); 
        foreach (DataRow dr in dtDB.Rows) 
        { 
         progressBar1.PerformStep(); 

         cmd.Parameters["@pn"].Value = dr.Field<string>("PNFullNum"); 
         cmd.Parameters["@rev"].Value = dr.Field<string>("PNNewRev"); 
         cmd.Parameters["@pn8"].Value = dr.Field<string>("PN8Dig"); 
         cmd.Parameters["@eco"].Value = dr.Field<string>("ECO"); 
         cmd.Parameters["@mon"].Value = dr.Field<string>("Mon"); 
         cmd.Parameters["@supnum"].Value = dr.Field<string>("SupNum"); 
         cmd.Parameters["@url"].Value = dr.Field<string>("URL"); 
         cmd.ExecuteNonQuery(); 
        } 

        conn.Close(); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show("Error: " + e.Message); 
        lblDataStatus.Text = e.Message; 
        return; 
        // duplicates are happening, will check veracity of data afterwards 
       } 
       progressBar1.Visible = false; 
      } 
     } 
    } 
関連する問題