2013-02-01 42 views
1

漂亮的直线前进进口:截断SqlBulkCopy的文本字符255使用SqlBulkCopy的

string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;\""; 
using (OleDbConnection excelConnection = new OleDbConnection(excelConnectionString)) 
{ 
    excelConnection.Open(); 
    OleDbCommand cmd = new OleDbCommand("Select " + fileID.ToString() + " as [FileID], * from [Sheet1$] where [Text] IS NOT NULL", excelConnection); 
    OleDbDataReader dReader = cmd.ExecuteReader(); 

    using (SqlBulkCopy sqlBulk = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString)) 
    { 
     sqlBulk.DestinationTableName = "table_name"; 
     sqlBulk.ColumnMappings.Add(0, "FileID"); 
     sqlBulk.ColumnMappings.Add(4, "Author"); 
     sqlBulk.ColumnMappings.Add(3, "Title"); 
     sqlBulk.ColumnMappings.Add(1, "Body"); 
     sqlBulk.ColumnMappings.Add(2, "PublishedDate"); 
     sqlBulk.BulkCopyTimeout = 600; 
     sqlBulk.WriteToServer(dReader); 
    } 
} 

的数据放进去,没问题。除映射到Body的第一列(nvarchar(max))被截断为255个字符外。我环顾四周,发现一些涉及changing a registry setting的解决方法。将值设置为0以强制全面扫描,而不仅仅是前8行,这是Excel的默认设置,但即使在重新启动后也没有帮助。寻找其他想法。谢谢。

+0

嗯,我不确定这是否有助于您,但您可以使用Excel工作表单元格格式 –

+0

没有帮助。我将列类型设置为文本。同样的结果。 –

回答

0

我用ODBC,而不是OLEDB和现在不截断值 到255个符号:

OdbcConnection con = new OdbcConnection(@"Driver={Microsoft Excel Driver 
(*.xls)};DBQ=c:\temp\testbook.xls"); 
OdbcCommand cmd = new OdbcCommand(@"SELECT * FROM [Workbook1$]"); 
cmd.Connection = con; 
OdbcDataAdapter da = new OdbcDataAdapter(cmd); 
DataSet ds = new DataSet(); 
da.Fill(ds); 

您可以使用2007格式的驱动程序来访问XLSX文件: .... Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)} ...