如何只将excel表中的新行插入数据库

时间:2011-08-17 09:17:45

标签: c#

我正在努力将数据从excel表导入到database.i能够成功地将数据从excel导入到database.i想知道如何在不添加以前数据的情况下,只将excel表中的新行添加到数据库。 / p>

            for (int i = 0; i < exceltable.Rows.Count; i++)
            {
                if (i > 1)
                {
                    DataRow row = exceltable.Rows[i];
                    object ID = row[0].ToString();


                    if (ID != null && !String.IsNullOrEmpty(ID.ToString().Trim()))
                    {
                        Int16 CustID = Convert.ToInt16(ID);
                        string CustName = row[1].ToString();
                        string CardScheme = row[2].ToString();
                        string Outlet = row[3].ToString();
                        string TerminalNum = row[4].ToString();
                        Int32 Terminal = Convert.ToInt32(TerminalNum);

                        string Date1 = row[5].ToString();
                        DateTime Date = Convert.ToDateTime(Date1);

                        string Time = row[6].ToString();
                        DateTime DateTime = Convert.ToDateTime(Time);

                        string Amount1 = row[7].ToString();
                        double Amount = Convert.ToDouble(Amount1);

                        string columnNames = "CustID,CustName,CardScheme,Outlet,TerminalNum,TranDate,TranDateTime,Amount";
                        string query1 = String.Format("insert into customer({0})values ('{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')", columnNames, CustID, CustName, CardScheme, Outlet, Terminal, Date, DateTime, Amount);
                        SqlCommand com = new SqlCommand(query1, connection);
                        com.ExecuteNonQuery();

                    }
                    **// else if (i==exceltable.Rows[exceltable.Rows.Count-1]-1)
                    //{
                    //   DataRow Newrow = exceltable.NewRow();
                    //   Newrow["CustID"] = row[0].ToString();
                    //   Newrow["CustName"] = row[1].ToString();
                    //   Newrow["CardScheme"] = row[2].ToString();
                    //   Newrow["Outlet"] = row[3].ToString();
                    //   Newrow["TerminalNum"] = row[4].ToString();
                    //   Newrow["TranDate"] = row[5].ToString();
                    //   Newrow["TranDateTime"] = row[6].ToString();
                    //   Newrow["Amount"] = row[7].ToString();
                    //   exceltable.Rows.Add(Newrow);
                    //   exceltable.AcceptChanges();

                    //}**

                }

            }


                DataRow lastrow=exceltable.Rows[exceltable.Rows.Count-1];
                if(!String.IsNullOrEmpty(lastrow.ToString().Trim()))
                {
                  string Count = lastrow[4].ToString();
                  Int16 TotalRows = Convert.ToInt16(Count);
                  string Sum = lastrow[7].ToString();
                  double TotalAmount = Convert.ToDouble(Sum);

                  SqlCommand cmd = new SqlCommand("insert into tblExcel(TotalRows,TotalAmount) values('"+TotalRows+"','"+TotalAmount+"')",connection);
                  cmd.ExecuteNonQuery();
                }                

                return true;
        }

现在我想要一些指导..上面代码将数据从excel表插入数据库..现在我想知道我是否需要添加代码以在此代码中插入新行或者我是否需要添加其他地方和我也尝试过使用我在评论中标注的数据表的NewRow()方法,因为我对它有所怀疑......我正朝着正确的方向前进。指导我。

4 个答案:

答案 0 :(得分:2)

您需要根据数据库中的内容检查数据。 应该有一个Key,使该行唯一。

var row = RowFromExcel(); //Row from Excel
var uniqueKey = row.Key;

if (!FindRowInDbWithKeyExists(uniqueKey))
{
    //If not found in Db then insert new row.
}

答案 1 :(得分:1)

您没有指定正在使用的数据库,您可以选择在插入时忽略重复记录,您的表必须具有主键。

对于oracle(11g),您可以对insert语句使用ignore_row_on_dupkey_index提示。
对于SQL Server,您需要使用IGNORE_DUP_KEY创建索引
对于MySQL,您可以使用IGNORE提示插入语句。

您每次都必须处理整个Excel工作表,但只会在表格中插入新行。

答案 2 :(得分:0)

AFAIK没有直接的解决方案。你必须对此提出一些技巧。 我可能会这样做,知道到目前为止我已经插入到DB中的记录数量(假设最后插入了新记录),然后将该数字中的任何记录添加到数据库中。

答案 3 :(得分:0)

为什么不将数据表上传到Temp表。只需运行delete语句即可删除主数据库表中已有的行。然后,您可以插入剩余的新行。