导入到 SQL Server 后在数据库中显示额外的行

Posted

技术标签:

【中文标题】导入到 SQL Server 后在数据库中显示额外的行【英文标题】:Showing extra rows in database after importing to SQL Server 【发布时间】:2019-09-30 04:19:16 【问题描述】:

我正在构建一个需要以下功能的程序:

将 Excel 文件导入数据库 -- 勾选 避免重复 --- 处理它 忽略 Excel 文件标题和底部的一些行 --- 这就是我想问你们的问题

这是我的代码

protected void Upload_Click(object sender, EventArgs e)

    string excelPath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.PostedFile.FileName);

    string filepath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.FileName);
    string filename = Path.GetFileName(filepath);

    FileUpload1.SaveAs(excelPath);

    string strConnection = @"Data Source=PEDRO-PC\SQLEXPRESS;Initial Catalog=costumizado;Persist Security Info=True;User ID=sa;Password=1234";
    string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO,IMEX=1;\"";

    OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
    excelConnection.Open();

    DataTable schema = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    string sheetName = schema.Rows[0]["TABLE_NAME"].ToString();

    OleDbCommand cmd = new OleDbCommand("Select * from [" + sheetName + "]", excelConnection);
    OleDbDataReader dReader;
    dReader = cmd.ExecuteReader();

    using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
    
        sqlBulk.ColumnMappings.Add(0,0);
        sqlBulk.ColumnMappings.Add(1,1);
        sqlBulk.ColumnMappings.Add(2,2);
        sqlBulk.ColumnMappings.Add(3,3);
        sqlBulk.DestinationTableName = "Dados";

        sqlBulk.WriteToServer(dReader);
    

    excelConnection.Close();

而我正在苦苦挣扎的是,我需要在我的代码中找到 excel 中的列并忽略我不需要的行......

我认为这行足以胜任这项工作:

sqlBulk.ColumnMappings.Add(0,0);
sqlBulk.ColumnMappings.Add(1,1);
sqlBulk.ColumnMappings.Add(2,2);
sqlBulk.ColumnMappings.Add(3,3);
sqlBulk.DestinationTableName = "Dados";

这是我要导入的表:

【问题讨论】:

欢迎来到 ***!了解您尝试导入的表格的结构将有助于回答您的问题(您当然可以匿名化单元格,但它应该足够详细,以便人们可以看到页眉、页脚和数据区域)。 您已经删除了足够多的重复帖子 Pedro/OverKnown/Holmes,知道您需要在这里做什么。制作重复帐户以避免站点/模组强制执行的警告、限制等是违反规则的。为避免出现标题,只需指定您的文档在连接字符串中包含标题(将 HDR=NO 更改为 HRD=YES)。如果您想从第 14 行开始(应该在您的问题中),请将您的 SELECT 更改为 "Select * from [" + sheetName + ":$A14:S]" 其中 AS 是您要导入的列。如果您想忽略空白单元格,请添加 WHERE @Larnu 谢谢Larnu!但是我无法识别单元格,我必须对列进行本地化,因为想象一下,如果客户想要放置相同的表模式但在开始时有更多单元格? 如果你不能标准化工作表,你怎么能希望标准化代码呢?如果你不能做一个,你可以做另一个。 you 如何知道标题何时开始,如果标题实际上可以在任何地方?如果你不能回答这个问题,那么这里的其他人也不能。 @Larnu 已经尝试将 ``` HDR =NO``` 改为 ``` HDR =YES```` 没有发生任何事情 【参考方案1】:

处理波动的源文件很棘手。也许尝试将文件作为一个整体加载到原始表中,然后在加载表后调用 proc 以仅将与完整行匹配的列移动到您的产品或最终表中。例如,仅在 Data Mov、Data Valor、Descricao do Movimento 和 Valor em EUR 不为空的情况下从 raw 中选择。如果需要,您可以根据需要添加更多验证,例如检查前两列的日期格式和最后一列的数值。我只是认为在 SQL 中比在 .NET 代码中更容易。

【讨论】:

以上是关于导入到 SQL Server 后在数据库中显示额外的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 导入后在数据库中找不到表

sqlserver数据库备份后在哪儿

把csv文件导入到SQL Server表中

将excel数据导入sql server数据库表并在gridview中显示

如何远程把sql server中的数据导入到本地sql server中?

想将300M+的SQL文件导入SQL Server2008中,显示“存储空间不足”,求问题分析和解决方法,谢谢