поднимет это исключение, если таблица имеет два непрерывных столбца, которые имеют тип char (1) или nvarchar (nn) , и оба имеют null . Иногда изменение sqlbulkcopy.batchsize < /code> заставляет его работать, но много раз это не будет. < /P>
После упрощения у меня есть тестовый пример следующего образом, и он воспроизводится на двух серверах: < /p>
У меня есть код с использованием sqlbulkcopy , чтобы клонировать множество таблиц, он раньше работал, но очень странно, недавно получил исключение
Получил неверную длину столбца от клиента BCP для Colid
. /> [code]sqlBulkCopy.WriteToServer(reader)[/code] поднимет это исключение, если таблица имеет два непрерывных столбца, которые имеют тип char (1) или nvarchar (nn) , и оба имеют null . Иногда изменение sqlbulkcopy.batchsize < /code> заставляет его работать, но много раз это не будет. < /P> После упрощения у меня есть тестовый пример следующего образом, и он воспроизводится на двух серверах: < /p> [list] [*] Создать таблицу. Sp2) < /p> [code] IF OBJECT_ID('dbo.TestTable', 'U') IS NOT NULL DROP TABLE dbo.TestTable;
CREATE TABLE [dbo].[TestTable] ( [value2] [char](1) NULL, [value1] [char](1) NULL ) ON [PRIMARY] GO
DECLARE @i int = 0
WHILE @i < 262 BEGIN SET @i = @i + 1
INSERT INTO [dbo].[TestTable]([value2], [value1]) VALUES (null, null) END < /code> < /li> c# console (.net framework 4.7), как ниже < /p> class Program { // [change here] static string sourceConn = @"Server={YourServer};Database={YourDatabase};User ID={userYourName};Password={yourPassword};connect timeout=15";
using (SqlConnection connSource = new SqlConnection(sConnSource)) { connSource.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = connSource; cmd.CommandText = "SELECT * FROM " + sTableSource;
// using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sConnDest, SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.KeepIdentity)) using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sConnDest)) { // sqlBulkCopy.BatchSize = 1380; // this optional setting will work if set value smaller than 1397 for testTable on my new server (SQL server 13.0.5102.14) // sqlBulkCopy.BatchSize = 261; // this optional setting will work if set value smaller than 261 for testTable on 2 older server (SQL server 11.0.7001) sqlBulkCopy.DestinationTableName = sTableDest; SqlDataReader reader = cmd.ExecuteReader();