Link to home
Start Free TrialLog in
Avatar of IUSR
IUSR

asked on

sqlbulkcopy error

Hi,
would you please help me out with this problem, i already stuck for couple days, any help will be greatly appreciate...

i'm working on a webpage with a temp datatable (one row and 30 columns), i try use sqlbulkcopy to insert to my sql table but with the following error:
System.InvalidOperationException: The given value of type String from the data source cannot be converted to type nvarchar of the specified target column. ---> System.InvalidOperationException: String or binary data would be truncated. at System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean& coercedToDataFeed) --- End of inner exception stack trace --- at System.Data.SqlClient.SqlBulkCopy.ConvertValue(Object value, _SqlMetaData metadata, Boolean isNull, Boolean& isSqlType, Boolean& coercedToDataFeed) at System.Data.SqlClient.SqlBulkCopy.ReadWriteColumnValueAsync(Int32 col) at System.Data.SqlClient.SqlBulkCopy.CopyColumnsAsync(Int32 col, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.CopyRowsAsync(Int32 rowsSoFar, Int32 totalRows, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken) at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken) at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState) at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table) at Embroidery_embroideryOrder.setTrailNum(DataTable dt) in C:\temp\embroideryOrder.aspx.vb:line 1438

here's my code:
                  'create datatable
                  Dim dt As DataTable = New DataTable
                  dt.Columns.Add(New DataColumn("c1", GetType(String)))
                  dt.Columns.Add(New DataColumn("c2", GetType(String)))
                  dt.Columns.Add(New DataColumn("c3", GetType(String)))
                  dt.Columns.Add(New DataColumn("c4", GetType(Integer)))
                  dt.Columns.Add(New DataColumn("c5", GetType(Integer)))
                  ...
                  dt.Columns.Add(New DataColumn("c28", GetType(String)))
                  dt.Columns.Add(New DataColumn("c30", GetType(Decimal)))
                  
                  'assign values
                  dim row = dt.NewRow()
                  row("c1") = "simon"
                  row("c2") = "crew"
                  row("c3") = "1234"
                  row("c4") = 2
                  row("c5") = 5
                  ...
                  row("28") = "VC"
                  row("c30") = 3.40
                  dt.Rows.Add(row)
                  
                  'display without issue
                  GridView2.DataSource = dt
                  GridView2.DataBind()
                  GridView2.Visible = True
                  
                  'insert to sql
                  Dim con2 As String = ConfigurationManager.ConnectionStrings("TestCon").ConnectionString
                  Dim copy As SqlBulkCopy
                  copy = New SqlBulkCopy(con2, SqlBulkCopyOptions.KeepIdentity)
                  Using copy
                        copy.BatchSize = 25
                        copy.DestinationTableName = "dbo.embTest"
                        copy.ColumnMappings.Add("c1", "c1")
                        copy.ColumnMappings.Add("c2", "c2")
                        copy.ColumnMappings.Add("c3", "c3")
                        copy.ColumnMappings.Add("c4", "c4")
                        copy.ColumnMappings.Add("c5", "c5")
                        ...
                        copy.ColumnMappings.Add("c28", "c28")
                        copy.ColumnMappings.Add("c30", "c30")
                        Try
                              copy.WriteToServer(dt)
                        Catch ex As Exception
                              Label6.Text = ex.ToString
                              Label6.Visible = True
                        Finally
                              copy.Close()
                        End Try
                  End Using
                  
here's my sql table definition:
CREATE TABLE [dbo].[embTest](
      [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
      [c1] [nvarchar](17) NULL,
      [c2] [nvarchar](20) NULL,
      [c3] [nvarchar](100) NULL,
      [c4] [int] NULL,
      [c5] [int] NULL,
      ...
      [c29] [smalldatetime] NULL,
      [c30] [decimal] (10,4) NULL
 CONSTRAINT [PK_embTest] PRIMARY KEY CLUSTERED
(
      [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]

GO

thank you.
ASKER CERTIFIED SOLUTION
Avatar of Raheman M. Abdul
Raheman M. Abdul
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of IUSR
IUSR

ASKER

Hi Raheman,

i triple checked the string and column length in my table: the string is 1000 and sql table datatype is nvarchar(100)...
i have no clue what went wrong... =(
Avatar of IUSR

ASKER

sorry, when I go through the original data in my datatable, c2 has length 60 but when I create my new datatable, I set it to 20...
now everything is working. thank you.
Why is this line does not contain "c"?
row("28") = "VC"

Open in new window

Shouldn't it be:
row("c28") = "VC"

Open in new window