当我从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表中复制数据后
答案 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)