从Excel工作表批量复制到Sql表

时间:2014-04-03 08:08:51

标签: c# asp.net

当我从excel批量复制数据时,某些值在sql表中变为空。

void ImporttoDatatable()
{
    try
    {
        if (FlUploadcsv.HasFile)
        {
            string FileName = FlUploadcsv.FileName;

            string ext = Path.GetExtension(FlUploadcsv.FileName).ToLower();
            int filesize = FlUploadcsv.PostedFile.ContentLength;

            if (ext == ".xls" || ext == ".xlsx")
            {
                if (filesize < 52428800)
                {


                        string path = string.Concat(Server.MapPath("~/Document/" + FlUploadcsv.FileName));
                        FlUploadcsv.PostedFile.SaveAs(path);
                        OleDbConnection OleDbcon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;");
                        OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]", OleDbcon);
                        OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(command);
                        OleDbcon.Open();
                        // Create DbDataReader to Data Worksheet
                        DbDataReader dr = command.ExecuteReader();

                        // Bulk Copy to SQL Server 
                        using (SqlBulkCopy bulkInsert = new SqlBulkCopy(constr))
                        {
                            bulkInsert.DestinationTableName = "m_Details";

                            bulkInsert.WriteToServer(dr);
                            lblmsg1.Text = "Data updated successfully.";
                            dr.Close();
                            bulkInsert.Close();
                            OleDbcon.Close();




                        }

                }
                else
                {
                    lblmsg1.Text="File size cannot be greater than 2 MB";
                }
            }
            else
            {
                lblmsg1.Text = "Please select a Excel file only.";
            }
        }
        else
        {
            lblmsg1.Text = "Please select a file";
        }

        }

    catch (Exception ex)
    {
        lblmsg1.Text = ex.Message;

    }
}

我的Sql表是:

TABLE [dbo].[m_Details](
[n_AppNo] [varchar](max) NULL,
[n_PriortyNo] [varchar](max) NULL,
[v_remark] [varchar](50) NULL,
[v_RegName] [varchar](max) NULL,
[n_sector] [varchar](50) NULL,
[v_pocket] [varchar](50) NULL,
[n_plotNo] [varchar](50) NULL,
[v_blockNo] [varchar](50) NULL,
[v_locality] [varchar](100) NULL,
[n_Area] [varchar](50) NULL,
[v_PlotType] [varchar](50) NULL,
[v_CISL] [varchar](max) NULL,
[n_pages] [varchar](50) NULL,
[d_scanDate] [varchar](100) NULL,
[n_PC] [varchar](50) NULL,
[v_Department] [varchar](50) NULL

实际上我的n_AppNo列在Excel Sheet中有varios类型数据 请按照这些图像。 在excel中复制数据之前

http://i.imgur.com/XikSkn3.png

在sql表中复制数据后

http://i.imgur.com/dLbij1k.png

1 个答案:

答案 0 :(得分:2)

如果文本列包含可以解释为混合数据的数据(例如,表示十六进制数据的字母数字字符),则最初的几行确定使用的实际数据类型,后续行可以作为NULL传输。 此行为是Excel ISAM的设计。前8行确定列的数据类型。例如,如果前8行中的大多数包含数字字符,则列的数据类型为数字。不适合该数据类型的所有后续值都将返回为NULL。您可以找到更多详细信息:

修正:

  • 通过将IMEX = 1(导出导出模式)属性添加到连接字符串,excel正确读取数据。设置OleDbcon对象如下:

    OleDbConnection OleDbcon = new OleDbConnection(&#34; Provider = Microsoft.ACE.OLEDB.12.0; Data Source =&#34; + path +&#34 ;; Extended Properties = Excel 12.0; IMEX = 1;&# 34);

  • 第二个解决方案是编辑注册表设置并将TypeGuessRows属性设置为0,以便让excel驱动程序使用文件中的所有行通过对所有行进行采样而不是第一个8.此属性允许的值范围是0-16。因此,我们可以将1-16行或所有行作为允许的样本大小。

需要更改的密钥的位置如下:

HKEY_LOCAL_MACHINE -> SOFTWARE -> Wow6432Node -> Microsoft -> Jet -> 4.0 ->Engines -> Excel -> TypeGuessRows has the value 0. (It contains 8 by default)