C# 如何仅将excel工作表中的新行插入数据库

C# 如何仅将excel工作表中的新行插入数据库,c#,C#,我正在将数据从excel工作表导入数据库。我能够成功地将数据从excel导入数据库。我想知道如何在不添加以前的数据的情况下仅将新行从excel工作表添加到数据库 for (int i = 0; i < exceltable.Rows.Count; i++) { if (i > 1) { DataRow row = exceltable

我正在将数据从excel工作表导入数据库。我能够成功地将数据从excel导入数据库。我想知道如何在不添加以前的数据的情况下仅将新行从excel工作表添加到数据库

            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;
        }
for(int i=0;i1)
{
DataRow row=exceltable.Rows[i];
对象ID=行[0]。ToString();
if(ID!=null&&!String.IsNullOrEmpty(ID.ToString().Trim())
{
Int16 CustID=转换为Int16(ID);
字符串CustName=行[1]。ToString();
字符串CardScheme=行[2]。ToString();
字符串出口=行[3]。ToString();
string TerminalNum=行[4]。ToString();
Int32 Terminal=Convert.ToInt32(TerminalNum);
字符串Date1=行[5]。ToString();
DateTime日期=Convert.ToDateTime(日期1);
字符串时间=行[6]。ToString();
DateTime DateTime=Convert.ToDateTime(时间);
string Amount1=行[7]。ToString();
双倍金额=换算成双倍(金额1);
string columnNames=“CustID、CustName、CardScheme、Outlet、TerminalNum、transdate、transdatetime、Amount”;
string query1=string.Format(“插入客户({0})值({1}、{2}、{3}、{4}、{5}、{6}、{7}、{8}”)、列名、客户ID、客户名称、CardScheme、出口、终端、日期、日期时间、金额);
SqlCommand com=新的SqlCommand(query1,连接);
com.ExecuteNonQuery();
}
**//else if(i==exceltable.Rows[exceltable.Rows.Count-1]-1)
//{
//DataRow Newrow=exceltable.Newrow();
//Newrow[“CustID”]=行[0]。ToString();
//Newrow[“CustName”]=行[1]。ToString();
//Newrow[“CardScheme”]=第[2]行。ToString();
//Newrow[“Outlet”]=第[3]行。ToString();
//Newrow[“TerminalNum”]=行[4]。ToString();
//Newrow[“TranDate”]=行[5]。ToString();
//Newrow[“TranDateTime”]=行[6]。ToString();
//新行[“金额”]=行[7]。ToString();
//exceltable.Rows.Add(Newrow);
//exceltable.AcceptChanges();
//}**
}
}
DataRow lastrow=exceltable.Rows[exceltable.Rows.Count-1];
如果(!String.IsNullOrEmpty(lastrow.ToString().Trim()))
{
字符串计数=最后一行[4]。ToString();
Int16 TotalRows=转换为Int16(计数);
字符串总和=最后一行[7]。ToString();
double TotalAmount=换算成两倍(总和);
SqlCommand cmd=new-SqlCommand(“插入tblExcel(TotalRows,TotalAmount)值(““+TotalRows+”,“+TotalAmount+”)”,连接);
cmd.ExecuteNonQuery();
}                
返回true;
}

现在我需要一些指导..上面的代码将数据从excel工作表插入数据库..现在我想知道我是否需要在代码中添加插入新行的代码,还是需要在其他地方添加代码,并且我也尝试过使用NewRow()datatable的方法,我在评论中对其进行了标记,因为我对此有疑问。我的方向是否正确。请指导我。

如果没有直接的解决方案。你得想出一些窍门。
我要做的是,知道到目前为止我已经在数据库中插入了多少条记录(假设在最后插入了新的记录),然后任何超出该数字的记录都将添加到数据库中。

您需要对照数据库中的数据检查数据。 应该有一个使该行唯一的键

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

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

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

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

对于oracle(11g),您可以在insert语句中使用
ignore\u row\u on\u dupkey\u index
hint。
对于SQL Server,您需要使用
IGNORE\u DUP\u键创建索引

对于MySQL,您可以在insert语句中使用
IGNORE
hint


每次都必须处理整个excel工作表,但只有新行会插入到表中。

您能解释一下RowFromExcel()和row.Key.是什么意思吗?Key.是一个属性吗?@Nazima,RowFromExcel()是一个返回类或值列表的方法,基本上就是excel行中的每个excel单元格。关键是哪个单元格使该行唯一。假设您正在返回一个列表字符串,使该行唯一的单元格是第二个单元格,您可以这样做。var uniqueKey=行[1];