字符串字段在SqlBulkCopy插入时被截断

时间:2015-04-30 14:40:27

标签: c# excel sql-server-2012 sqlbulkcopy

我使用SqlBulkCopy将excel数据插入表。

其中一个字段是目标表上的ntext,但是插入数据后,数据会在255个字符后被截断。

using (OleDbConnection conExcel = new OleDbConnection(connstring))
                {
                    DL_ID = library.Save();

                    conExcel.Open();

                    string sheet1 = conExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0]["TABLE_NAME"].ToString();
                    DataTable dtExcelData = new DataTable();

                    using (OleDbDataAdapter oda = new OleDbDataAdapter("SELECT " + Convert.ToString(DL_ID) + " as DL_ID,* FROM [" + sheet1 + "]", conExcel))
                    {
                        oda.Fill(dtExcelData.DefaultView.Table);

                    }
                    conExcel.Close();

                    string consString = ConfigurationManager.ConnectionStrings["mycon"].ConnectionString;
                    using (SqlConnection con = new SqlConnection(consString))
                    {

                        using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
                        {
                            sqlBulkCopy.DestinationTableName = "dbo.IMPORTS_LIBRARY_DATA";

                            sqlBulkCopy.ColumnMappings.Add(0,"DL_ID");
                            sqlBulkCopy.ColumnMappings.Add(1,"ILD_OLD_ID");
                            sqlBulkCopy.ColumnMappings.Add(2,"ILD_Desc");
                            sqlBulkCopy.ColumnMappings.Add(3, "ILD_Unit");
                            sqlBulkCopy.ColumnMappings.Add( 4,"ILD_Empty");
                            sqlBulkCopy.ColumnMappings.Add( 5,"ILD_Price1");
                            sqlBulkCopy.ColumnMappings.Add( 6,"ILD_Price2");

                            con.Open();
                            sqlBulkCopy.WriteToServer(dtExcelData);
                            con.Close();
                        }


                    }

                }

被截断的字段为ILD_Desc

我试图将其更改为nvarchar(max)并且它仍然被截断。 我没有得到错误,只是看到目标表上截断的数据为255个字符。

更新:

CREATE TABLE [dbo].[IMPORTS_LIBRARY_DATA](
[ILD_ID] [int] IDENTITY(1,1) NOT NULL,
[DL_ID] [int] NULL,
[ILD_OLD_ID] [varchar](50) NULL,
[ILD_Desc] [ntext] NULL,
[ILD_Unit] [nvarchar](50) NULL,
[ILD_Empty] [varchar](50) NULL,
[ILD_Price1] [varchar](50) NULL,
[ILD_Price2] [varchar](50) NULL,
[ILD_Folder1] [varchar](50) NULL,
[ILD_Folder2] [varchar](50) NULL,
[ILD_Folder3] [varchar](50) NULL,
[ILD_Date] [varchar](50) NULL,
 CONSTRAINT [PK_IMPORTS_LIBRARY_DATA] PRIMARY KEY CLUSTERED 
(
[ILD_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,       ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

1 个答案:

答案 0 :(得分:1)

我认为问题出在OLED的OLEDB提供商身上。

  

当您使用OLEDB提供程序时,提供程序将根据前8行自动确定数据类型。如果前8行中有冗长的单元格,则数据类型将设置为文本,否则将为备注类型,可以包含255个字符。要解决此问题,请更改以下知识库文章中提到的注册表设置:http://support.microsoft.com/kb/281517或使用Microsoft.Jet.OLEDB提供程序来读取数据。

OBS:您可以更改名为TypeGuessRows的注册表设置。值范围为0到16(默认值为8),但如果设置为0,则扫描的行数为16384.

http://forums.asp.net/t/1913118.aspx?Microsoft+oledb+data+acces+truncates+the+data+length+to+255+characters