0

我正在将 Excelsheet 导入到 sql server 数据库中,我需要在导入工作表之前检查某些内容,例如我有一个名为 passport 的列,它的值必须仅以字母开头,并且必须将其余字符作为数字(仅)。

   DataTable dt7 = new DataTable();
            dt7.Load(dr);
            DataRow[] ExcelRows = new DataRow[dt7.Rows.Count];
            // Bulk Copy to SQL Server

            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
            {
                bulkCopy.DestinationTableName = "ExcelTable";
                dt7.Rows.CopyTo(ExcelRows, 0);

                for (int i = 0; i < ExcelRows.Length; i++)
                {
                    if (ExcelRows[i]["data"] == DBNull.Value)
                    {
                        // Include any actions to perform if there is no date
                        //ExcelRows[i]["data"] = Convert.ToString(0);
                    }
                    else
                    {
                        DateTime oldDate = Convert.ToDateTime(ExcelRows[i]["data"]).Date;
                        DateTime newDate = Convert.ToDateTime(oldDate).Date;
                        ExcelRows[i]["data"] = newDate.ToString("yyyy/MM/dd");
                    }



                }
                bulkCopy.WriteToServer(ExcelRows);
4

3 回答 3

1

不,你不能。您可以做的是在批量操作之前执行验证。

于 2012-10-31T09:55:22.807 回答
0

您想在上传 excel 表时执行 excel 单元格值的验证。两种方式:

  1. 将 Excel 数据放入数据表中,并通过它进行验证并记录差异。完成验证后,向用户显示错误,或者如果没有更多错误,请执行 sqlbulkcopy。所有这些都是在 c# 级别完成的。

  2. 在 sql 方面,将 Excel 数据放入数据表中,直接在数据库中的临时表中执行 sqlbulkcopy。然后调用一个存储过程,它将验证批量上传的数据并发送错误。如果有错误提醒用户,则进行批量复制或调用存储过程将数据从临时表中提取到真实表中。

你选。

于 2012-11-01T07:41:49.903 回答
0

简单的答案是'NO'。执行 SqlBulk 操作时无法验证。您可以做的是Datatable在执行 SqlBulk 操作之前验证。

private bool Validate(Datatable dt)
{
     //Perform your validation
     // return true/false 
}

        DataTable dt7 = new DataTable();
        dt7.Load(dr);
        DataRow[] ExcelRows = new DataRow[dt7.Rows.Count];
        // Bulk Copy to SQL Server

        // Perform your validation here. If not validated then skip with some message.
        if(!Validate(dt7))
        {
             //Show Message
             return;
        }            

        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
        {
            bulkCopy.DestinationTableName = "ExcelTable";
            dt7.Rows.CopyTo(ExcelRows, 0);

            for (int i = 0; i < ExcelRows.Length; i++)
            {
                if (ExcelRows[i]["data"] == DBNull.Value)
                {
                    // Include any actions to perform if there is no date
                    //ExcelRows[i]["data"] = Convert.ToString(0);
                }
                else
                {
                    DateTime oldDate = Convert.ToDateTime(ExcelRows[i]["data"]).Date;
                    DateTime newDate = Convert.ToDateTime(oldDate).Date;
                    ExcelRows[i]["data"] = newDate.ToString("yyyy/MM/dd");
                }



            }
            bulkCopy.WriteToServer(ExcelRows);
于 2012-10-31T09:53:17.517 回答