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

string filed is truncated on SqlBulkCopy insert

我使用 SqlBulkCopy 将 excel 数据插入到 table。

其中一个字段是目标上的 ntext table,但是当插入数据时,数据在 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),但它仍然被截断。 我没有收到错误,只是看到目标 table 上的数据被截断为 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]

开始

我认为问题出在 excel 的 OLEDB 提供商。

When you use OLEDB providers then the datatype is determined automatically by the provider based on the first 8 rows. If you have lengthy cells in the first 8 rows then data type will be set as text and otherwise it will be memo type which can hold 255 characters. To overcome this issue Either change the registry setting as mentioned in below KB article: http://support.microsoft.com/kb/281517 or use Microsoft.Jet.OLEDB provider to read the data.

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