【问题标题】:Divide Rows of DataTable分割数据表的行
【发布时间】:2015-08-25 08:51:37
【问题描述】:

我在表格中插入Excel 工作表的记录。问题是 Excel 工作表包含在某些列中具有 duplicate 值的行。但由于我正在阅读DataTable 中的整个 Excel,所有这些行都加载到我的 DataTable 中,因此当我插入 SQL Table 时,我得到了重复的记录。任何人都可以提出任何解决方案吗?我怎样才能避免这种重复。我是否必须以某种方式将 DataTable 分成几行?

C# 代码:读取 Excel 并在 DataTable 中插入行

        DataTable dt = new DataTable();
        dt.Columns.AddRange(new DataColumn[42] { new DataColumn("Template", typeof(string)),
                new DataColumn("Cust_Name", typeof(string)),
                new DataColumn("Invoice_No", typeof(int)),
                new DataColumn("InvoiceDate",typeof(DateTime)),
                new DataColumn("SR_No", typeof(int)),
                .
                .
                .
                new DataColumn("ContactTel3", typeof(string))});

        foreach (GridViewRow row in GridView1.Rows)
        {
            int rowIndex = row.RowIndex;
            if (rowIndex > 0)
            {
                string Template = row.Cells[0].Text;
                string Cust_Name = row.Cells[1].Text;
                int Invoice_No = int.Parse(row.Cells[2].Text);
                //DateTime InvoiceDate = DateTime.ParseExact(row.Cells[3].Text, "d-MMM-yy", CultureInfo.InvariantCulture);
                string InvoiceDate = (row.Cells[3].Text);
                int Sr_No = int.Parse(row.Cells[4].Text);
                .
                .
                .
                string ContactTel3 = (row.Cells[41].Text);
                dt.Rows.Add(Template, Cust_Name, Invoice_No, InvoiceDate, Sr_No, Description1, Description2, Description3, Description4, Description5,
                    CurrencyCode, Amount, Subject, Reference, CustomerAddress1, CustomerAddress2, CustomerAddress3, CustomerAddress4, CustomerAddress5,
                    CustomerAddress6, CustomerTelephone, EmailIdTo, EmailIdCC, BankName, AccountTitle, AccountNo, CurrencyCode1, BankAddress1,
                    BankAddress2, BankAddress3, BankAddress4, SwiftCode, IBAN, ContactName1, ContactEmail1, ContactTel1, ContactName2, ContactEmail2,
                       ContactTel2, ContactName3, ContactEmail3, ContactTel3);
            }
        } 

将数据表传递给存储过程的C#代码

string consString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
                SqlConnection con = new SqlConnection(consString);
                using (SqlCommand cmd = new SqlCommand("[spInsertExcel]"))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection = con;
                        cmd.Parameters.AddWithValue("@tblInvoice", dt);
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();

这是我的存储过程:

Create PROCEDURE [dbo].[spInsertExcel]
@tblInvoice [tblInvoiceType] READONLY
AS
BEGIN
      SET NOCOUNT ON;
      IF NOT EXISTS(Select Invoice_No from Invoice)
      Begin
        INSERT into Invoice([Template],[Cust_Name],[Invoice_No] ,[InvoiceDate],[Sr_No] ,[CurrencyCode] ,[Subject] ,[Reference],[CustomerAddress1] ,
        [CustomerAddress2] ,[CustomerAddress3] ,[CustomerAddress4] ,[CustomerAddress5] ,[CustomerAddress6] ,[CustomerTelephone],[EmailIdTo] ,
        [EmailIDCC] ,[BankName] ,[AccountTitle] ,[AccountNo] ,[Bankcurrency] ,[BankAddress1] ,[BankAddress2] ,[BankAddress3] ,[BankAddress4] ,
        [SwiftCode],[IBAN],[ContactName1],[ContactEmail1],[ContactTel1],[ContactName2],[ContactEmail2],[ContactTel2],[ContactName3],[ContactEmail3],[ContactTel3])

        Select [Template],[Cust_Name],[Invoice_No],[InvoiceDate],Sr_No, 
        CurrencyCode,[Subject], Reference,CustomerAddress1,CustomerAddress2,CustomerAddress3,CustomerAddress4 ,
        CustomerAddress5,CustomerAddress6,CustomerTelephone,EmailIdTo , EmailIDCC,BankName, AccountTitle,
        AccountNo , Bankcurrency,BankAddress1,BankAddress2,BankAddress3,BankAddress4,SwiftCode,IBAN,ContactName1,ContactEmail1,ContactTel1,
        ContactName2 ,ContactEmail2,ContactTel2,ContactName3 ,ContactEmail3,ContactTel3 from @tblInvoice
    END
    Else
        Raiserror('You have already uploaded this file',16,1)
END

已编辑 正如用户在这里回答的那样,我包含了以下代码行

DataTable distinctDt = dt.DefaultView.ToTable(true, "Template", "Cust_Name"...);

但我仍然得到同一张桌子。附上distinctDt在Debug时的图片

我想在Invoice 表中插入重复的列,如TemplateCust_NameInvoice_No 等,在另一个表中插入非重复的列,如AmountDescription1。但是这样Invoice表将有多个记录。我怎样才能实现它?

【问题讨论】:

    标签: c# sql-server datatable duplicates sql-insert


    【解决方案1】:

    您可以通过在 DataRow 集合上调用 Distinct 方法将相似的记录添加到 DataTable 后进行过滤:

    var distinct = dataTable.AsEnumerable().Distinct(DataRowComparer.Default);
    

    或者您可以在添加到 DataTable 之前过滤它们,如下所示:

    GridView1.Rows.Select(x=> new 
    {
                    Template = row.Cells[0].Text;
                    Cust_Name = row.Cells[1].Text;
                    Invoice_No = int.Parse(row.Cells[2].Text);
                    InvoiceDate = DateTime.ParseExact(row.Cells[3].Text, "d-MMM-yy", CultureInfo.InvariantCulture);
                    nvoiceDate = (row.Cells[3].Text);
                    Sr_No = int.Parse(row.Cells[4].Text);
    }).Distinct();
    

    【讨论】:

      【解决方案2】:

      您可以在将表 dt 转储到数据库之前从表中选择不同的值。使用下面的代码。

      DataTable distinctDt = dt.DefaultView.ToTable(true, "Template", "Cust_Name"...);
      

      现在使用distinctDt 将不同的数据转储到数据库中。 有关这方面的更多信息,请参阅MSDN

      【讨论】:

      • 你是对的。但问题是,并非 Excel 工作表中的所有列都包含多行的相同数据,因此正如预期的那样,这将给出不同的行。我想要的是,在Invoice 表中插入重复的列,在其他表中插入非重复的列,例如AmountDescription。有没有什么方法可以根据几列而不是整个表列进行过滤?
      • ToTable 还需要字符串列列表,只需在其中提及 AmountDescription 列,您将获得不同的 amountdescription 值。
      • distinct 将在您在 ToTable 方法中指定的每一列上运行。在您在编辑中提供的片段中,很明显description1 对于每一行都是不同的,这就是它们被拉起的原因。
      • 同意,你的解决方案在这个意义上是完美的。也许我没有正确发布我的问题,所以现在我已经编辑它以明确我真正想要实现的目标
      【解决方案3】:

      我认为您的invoice 表中需要有一个IDENTITY 列。
      如果您添加 IDENTITY(1, 1) 字段,请说 ID 您可以以索引方式对其进行自定义操作。
      现在您可以使用另一个存储过程将数据从invoice 表复制到otherTable,如下所示:

      INSERT INTO [otherTable]
      SELECT 
          [Amount], [Description]
      FROM
          [invoice]
      GROUP BY
          [Amount], [Description]
      

      【讨论】:

        猜你喜欢
        • 2019-04-18
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-09
        • 2017-01-21
        • 2020-07-03
        相关资源
        最近更新 更多