C# 从Excel工作表批量复制到Sql表
当我从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();
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)