http://bugzilla.novell.com/show_bug.cgi?id=580714
http://bugzilla.novell.com/show_bug.cgi?id=580714#c0 Summary: SqlBulkCopy is Broken Badly Classification: Mono Product: Mono: Class Libraries Version: 2.6.x Platform: 64bit OS/Version: openSUSE 11.1 Status: NEW Severity: Major Priority: P5 - None Component: Sys.Data.SqlClient AssignedTo: [email protected] ReportedBy: [email protected] QAContact: [email protected] Found By: --- Blocker: --- Description of Problem: Code using SqlBulkCopy that runs fine in .Net does not work in Mono. I always receive an exception. However when running the code in windows through .Net there are no exceptions and the data transfers fine. Steps to reproduce the problem: Create a MSSQL server database called MonoBulkCopyTest Add table to the database with two nvarchar columns. Add the following code to a winform application and run it. //This line must be edited for the connection to the test database String connectionString = "Data Source=****;Initial Catalog=MonoBulkCopyTest;User ID=****;Pwd=****;"; //data table to bulk copy DataTable dtdata; //connection to sql server to do the copy System.Data.SqlClient.SqlConnection con; //bulk writer to do the actual copy System.Data.SqlClient.SqlBulkCopy bulkWriter; private void RunTest() { //create the connection to the database. con = new System.Data.SqlClient.SqlConnection(connectionString); //create the bulkcopy object CreateBulkWriter(); //create the datatable CreateTable(); //add some data to the datatable AddData(); //try to bulk copy the datatable CopyData(); } /// <summary> /// Create the data table to test the bulk copy with /// </summary> private void CreateTable() { //create the dtdata datatable to hold information for the bulk copy to the //Movie table in the database dtdata = new DataTable("table1"); //Create title column in dtdata datatable dtdata.Columns.Add("title", System.Type.GetType("System.String")); //Create year column in dtdata datatable dtdata.Columns.Add("year", System.Type.GetType("System.String")); } /// <summary> /// Create the bulkcopy object and set the column mappings /// </summary> private void CreateBulkWriter() { //create a bulk writer to efficently write the data bulkWriter = new System.Data.SqlClient.SqlBulkCopy(con); //set the destination table of the bulk writer to be the Movie table bulkWriter.DestinationTableName = "Movie"; //Map title from source to destination bulkWriter.ColumnMappings.Add("title", "title"); //Map year from source to destination bulkWriter.ColumnMappings.Add("year", "year"); } /// <summary> /// add some data to the datatable for the bulk copy /// </summary> private void AddData() { DataRow dr = dtdata.NewRow(); dr[0] = "Citizen Kane"; dr[1] = "1941"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "Casablanca"; dr[1] = "1942"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "The Godfather"; dr[1] = "1972"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "Gone With The Wind"; dr[1] = "1939"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "Lawrence Of Arabia"; dr[1] = "1962"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "The Wizard Of Oz"; dr[1] = "1939"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "The Graduate"; dr[1] = "1967"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "On The Waterfront"; dr[1] = "1954"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "Schindler's List"; dr[1] = "1993"; dtdata.Rows.Add(dr); dr = dtdata.NewRow(); dr[0] = "Singin' In The Rain"; dr[1] = "1952"; dtdata.Rows.Add(dr); } /// <summary> /// Attempts to bulk copy the datatable dtdata to the database /// </summary> private void CopyData() { try { con.Open(); bulkWriter.WriteToServer(dtdata); entry1.Text = "Success"; } catch (Exception ex) { //System.Windows.Forms.MessageBox.Show(ex.ToString(),"Exception Thrown", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); entry1.Text = ex.ToString(); } finally { if (con.State == ConnectionState.Open) con.Close(); } } Actual Results: System.Data.SqlClient.SqlException: Invalid column type from bcp client for colid 1. at System.Data.SqlClient.SqlConnection.ErrorHandler (System.Object sender, Mono.Data.Tds.Protocol.TdsInternalErrorMessageEventArgs e) [0x00032] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/System.Data/System.Data.SqlClient/SqlConnection.cs:316 at Mono.Data.Tds.Protocol.Tds.OnTdsErrorMessage (Mono.Data.Tds.Protocol.TdsInternalErrorMessageEventArgs e) [0x0000b] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs:1695 at Mono.Data.Tds.Protocol.Tds.ProcessMessage (TdsPacketSubType subType) [0x000ef] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs:1735 at Mono.Data.Tds.Protocol.Tds.ProcessSubPacket () [0x00130] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs:1787 at Mono.Data.Tds.Protocol.Tds.NextResult () [0x0004a] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs:619 at Mono.Data.Tds.Protocol.Tds.SkipToEnd () [0x00005] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs:692 at Mono.Data.Tds.Protocol.Tds.ExecBulkCopy (Int32 timeout, Boolean wantResults) [0x0001f] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/Tds.cs:550 at Mono.Data.Tds.Protocol.TdsBulkCopy.BulkCopyEnd () [0x00015] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsBulkCopy.cs:98 at System.Data.SqlClient.SqlBulkCopy.BulkCopyToServer (System.Data.DataTable table, DataRowState state) [0x0053d] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/System.Data/System.Data.SqlClient/SqlBulkCopy.cs:424 at System.Data.SqlClient.SqlBulkCopy.WriteToServer (System.Data.DataTable table) [0x00000] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/System.Data/System.Data.SqlClient/SqlBulkCopy.cs:448 at MainWindow.CopyData () [0x0000b] in /home/jordan/projects/MonoSqlbulkCopyBug/MainWindow.cs:137 Or System.IndexOutOfRangeException: Array index is out of range. at Mono.Data.Tds.Protocol.TdsComm.AppendInternal (Int16 s) [0x00073] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsComm.cs:339 at Mono.Data.Tds.Protocol.TdsComm.Append (System.String s) [0x00075] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsComm.cs:389 at Mono.Data.Tds.Protocol.TdsComm.Append (System.Object o) [0x000d8] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsComm.cs:237 at Mono.Data.Tds.Protocol.TdsBulkCopy.BulkCopyData (System.Object o, Int32 size, Boolean isNewRow) [0x00034] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/Mono.Data.Tds/Mono.Data.Tds.Protocol/TdsBulkCopy.cs:91 at System.Data.SqlClient.SqlBulkCopy.BulkCopyToServer (System.Data.DataTable table, DataRowState state) [0x004aa] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/System.Data/System.Data.SqlClient/SqlBulkCopy.cs:412 at System.Data.SqlClient.SqlBulkCopy.WriteToServer (System.Data.DataTable table) [0x00000] in /usr/src/packages/BUILD/mono-2.6.1/mcs/class/System.Data/System.Data.SqlClient/SqlBulkCopy.cs:448 at IMDBDataExchange.SQLServerWriterBase.ClearCache () [0x00002] in /home/jordan/projects/IMDBDataExchange/IMDBDataExchange/SQLServerWriterBase.cs:27 Expected Results: Should bulk copy the data in the datatable to the database How often does this happen? Always Additional Information: -- Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the QA contact for the bug. You are the assignee for the bug. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
