2015-06-04 3 views
0

Я пытаюсь импортировать документ excel в базу данных.Импорт Excel в базу данных

Я успешно сделал это, однако проблема заключается в том, что данные, которые я пытаюсь вставить, вставляются четыре раза, а не один раз.

Вот мой код:

private void upload_button_Click(object sender, EventArgs e) 
{ 
    if ((tick.Visible != true)|(string.IsNullOrWhiteSpace(cat_combobox.Text))|(string.IsNullOrWhiteSpace(subcat_combobox.Text))) 
    { 
     MessageBox.Show("Select an excel file.", "Error: Missing Excel Data", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    else 
    { 
     try 
     { 
      FileStream fs = File.Open(filepath, FileMode.Open, FileAccess.Read); 
      IExcelDataReader excelreader = ExcelReaderFactory.CreateOpenXmlReader(fs); //'97-03 USE: CreateBinaryReader, 07+ USE: CreateOpenXmlReader 
      //CREATE COLUMN NAMES FROM FIRST ROW 
      excelreader.IsFirstRowAsColumnNames = true; 
      DataSet ds = excelreader.AsDataSet(); 
      DataTable dt = new DataTable(); 
      dt = ds.Tables[0]; 
      while (excelreader.Read()) 
      { 
       foreach (DataRow row in dt.Rows) 
       { 
        if ((!(row["Item"].Equals(DBNull.Value))) | (!(row["Quantity"].Equals(DBNull.Value))) | (!(row["Date"].Equals(DBNull.Value)))) 
         importtodb(Convert.ToInt32(this.cat_combobox.SelectedValue), this.subcat_combobox.Text.ToString(), row["Item"].ToString(), Convert.ToInt32(row["Quantity"]), row["Date"].ToString()); 
       } 
      } 
      excelreader.Close(); 
      this.DialogResult = DialogResult.OK; 
      this.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

} 

private void importtodb(int catid, string subcat, string item, int quantity, string date) 
{ 
    using (var sqlcmd = new SqlCommand("INSERT INTO inventory_table (categoryid, Subcategory, Item, Quantity, Date) VALUES(@catid, @subcat, @item, @quantity, @date)", sqlconnection)) 
    { 
     sqlcmd.Parameters.AddWithValue("@catid", catid); 
     sqlcmd.Parameters.AddWithValue("@subcat", subcat); 
     sqlcmd.Parameters.AddWithValue("@item", item); 
     sqlcmd.Parameters.AddWithValue("@quantity", quantity); 
     sqlcmd.Parameters.AddWithValue("@date", date); 
     sqlcmd.ExecuteNonQuery(); 
    } 
} 

Примечание: Я использую ExcelDataReader.

Как я могу исправить проблему дублирования данных, вставленных в базу данных из кода?

+1

Как только у вас есть данные в DataSet, вы больше не должны использовать ExcelDataReader - данные уже загружены в DataSet. Кроме того, нет смысла использовать 'new DataTable()', поскольку вы перезаписываете это значение на следующей строке. –

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+1

Я согласен с Джоном Сондерсом, попробуйте удалить время до цикла foreach. –

ответ

0

Как только у вас есть данные в DataSet, вы больше не должны использовать ExcelDataReader - данные уже загружены в DataSet.

Кроме того, нет смысла использовать новый DataTable() при замене этого значения на следующей строке.

Смежные вопросы