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

C# 从Excel工作表批量复制到Sql表,c#,asp.net,C#,Asp.net,当我从excel批量复制数据时,sql表中的某些值为空 void ImporttoDatatable() { try { if (FlUploadcsv.HasFile) { string FileName = FlUploadcsv.FileName; string ext = Path.GetExtension(FlUploadcsv.FileName).ToLower();

当我从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;

    }
}
)

实际上,我的n_AppNo列在Excel工作表中有varios类型的数据 请跟随这些图片。 在excel中复制数据之前

复制sql表中的数据后


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

修正:

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

    OleDbConnection OleDbcon=新的OleDbConnection(“Provider=Microsoft.ACE.OLEDB.12.0;数据源=“+path+”;扩展属性=Excel 12.0;IMEX=1;”

  • 第二种解决方案是编辑注册表设置并将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)

如果您在n_AppNo列的前8行中的一行中输入一个字符串值,就像缺少的字符串值一样,那么您的导入是否仍然不起作用?你能检查一下我在回答中给你的路径上的注册表中有什么吗?我通过使用循环修剪Excel的每一列来解决这个问题。谢谢你的回复
HKEY_LOCAL_MACHINE -> SOFTWARE -> Wow6432Node -> Microsoft -> Jet -> 4.0 ->Engines -> Excel -> TypeGuessRows has the value 0. (It contains 8 by default)