JPM62
asked on
Impossible to execute sqlxmlbulkload in a SQL SERVER 2005 CLR
Hi,
I would like to create a stored procedure in SQL SERVER 2005 by using .NET and CLR possibilities.
The goal of the stored procedure is to load XML data with SQLXMLBULKLOAD.
I succeed to create the stored procedure CLR in the database but when i execute it, the following error appears :
Msg 6522, Level 16, State 1, Procedure xmlbulk, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "xmlbulk":
System.InvalidCastExceptio n: Unable to cast COM object of type 'SQLXMLBULKLOADLib.SQLXMLB ulkLoad4Cl ass' to interface type 'SQLXMLBULKLOADLib.ISQLXML BulkLoad4' . This operation failed because the QueryInterface call on the COM component for the interface with IID '{88465BA7-AEEE-49A1-9499- 4416287A01 60}' failed due to the following error: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)).
System.InvalidCastExceptio n:
at SQLXMLBULKLOADLib.SQLXMLBu lkLoad4Cla ss.set_Err orLogFile( String pbstrFileName)
at StoredProcedures.XMLBULK()
This message appeared when i added in my program the following line :
System.Threading.Thread.Cu rrentThrea d.SetApart mentState( Threading. ApartmentS tate.STA)
Indeed, without this line, i add an other kind of error :
Msg 6522, Level 16, State 1, Procedure xmlbulk, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "xmlbulk":
System.InvalidCastExceptio n: Unable to cast COM object of type 'SQLXMLBULKLOADLib.SQLXMLB ulkLoad4Cl ass' to interface type 'SQLXMLBULKLOADLib.ISQLXML BulkLoad4' . This operation failed because the QueryInterface call on the COM component for the interface with IID '{88465BA7-AEEE-49A1-9499- 4416287A01 60}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
System.InvalidCastExceptio n:
at SQLXMLBULKLOADLib.SQLXMLBu lkLoad4Cla ss.set_Err orLogFile( String pbstrFileName)
at StoredProcedures.XMLBULK()
I thought the sqlxmlbulload didn't work because he was using multithread in this program and the sqlxmlbulkload can't use a multithread that's why i tried to force the use of a simple thread.
I'm beginner in .Net and i don't understand very well the concept of thread.
I'm a SQL Developper and i'm sorry if i'm not clear.
I you have an idea, thank's a lot to help me.
I would like to create a stored procedure in SQL SERVER 2005 by using .NET and CLR possibilities.
The goal of the stored procedure is to load XML data with SQLXMLBULKLOAD.
I succeed to create the stored procedure CLR in the database but when i execute it, the following error appears :
Msg 6522, Level 16, State 1, Procedure xmlbulk, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "xmlbulk":
System.InvalidCastExceptio
System.InvalidCastExceptio
at SQLXMLBULKLOADLib.SQLXMLBu
at StoredProcedures.XMLBULK()
This message appeared when i added in my program the following line :
System.Threading.Thread.Cu
Indeed, without this line, i add an other kind of error :
Msg 6522, Level 16, State 1, Procedure xmlbulk, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "xmlbulk":
System.InvalidCastExceptio
System.InvalidCastExceptio
at SQLXMLBULKLOADLib.SQLXMLBu
at StoredProcedures.XMLBULK()
I thought the sqlxmlbulload didn't work because he was using multithread in this program and the sqlxmlbulkload can't use a multithread that's why i tried to force the use of a simple thread.
I'm beginner in .Net and i don't understand very well the concept of thread.
I'm a SQL Developper and i'm sorry if i'm not clear.
I you have an idea, thank's a lot to help me.
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml
Imports SQLXMLBULKLOADLib
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub XMLBULK ()
Dim objBL As New SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class
'Dim reader As SqlDataReader
'Dim MSG_XML As New XmlDocument
'Using connection As New SqlConnection("context connection=true")
'connection.Open()
'Dim command As New SqlCommand("SELECT MSG_XML FROM B2B_P1..B2B_ORDER_REPLY_JPM WHERE T_ID=1", connection)
'reader = command.ExecuteReader()
'reader.Read()
'MSG_XML.LoadXml(CStr(reader("MSG_XML")))
'reader.Close()
'End Using
'Positionnement en simple thread
'System.Threading.Thread.CurrentThread.SetApartmentState(Threading.ApartmentState.STA)
' Execute bulk load. Read source XML data from the stream.
objBL.ErrorLogFile = "C:\test_xmlbulk\logxmlbulk.txt"
objBL.ConnectionString = "provider=SQLOLEDB.1;data source=ITWS0026;database=B2B_P2;uid=xxx;pwd=xxx"
objBL.SchemaGen = False
objBL.SGDropTables = False
objBL.Transaction = False
objBL.CheckConstraints = False
objBL.BulkLoad = True
objBL.KeepIdentity = False
objBL.Execute("C:\test_xmlbulk\SchemaOrderList.xml", "C:\test_xmlbulk\export.txt")
'While System.Runtime.InteropServices.Marshal.ReleaseComObject(objBL) <> 0
'Threading.Thread.Sleep(50)
'End While
objBL = Nothing
'MSG_XML = Nothing
End Sub
End Class
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.