Powershell을 사용하여 SqlBulkCopy를 통해 SQL 서버에 XML 데이터 삽입 (캐스팅 오류)

.net powershell sqlbulkcopy sql-server xml

문제

sqlbulckcopy를 사용하여 xml을 포함하는 데이터 테이블을 삽입하려고하면 "cast not valid"오류가 발생합니다.

System.Xml.XmlNode 형식의 XML 데이터를 보유 할 DataColumn 캐스팅이 잘못되었습니다? 여기를 보면 .NET Framework 유형은 xml입니다.

다음은 삽입하려는 XML의 예입니다.

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <System>
        <Provider Name="Microsoft-Windows-Security-Auditing" Guid="{54849625-5478-4994-a5ba-3e3b0328c30d}"/>
        <EventID>4625</EventID>
        <Version>0</Version>
        <Level>0</Level>
        <Task>12544</Task>
        <Opcode>0</Opcode>
        <Keywords>0x8010000000000000</Keywords>
        <TimeCreated SystemTime="2013-07-19T19:27:14.515Z"/>
        <EventRecordID>39751424</EventRecordID>
        <Correlation/>
        <Execution ProcessID="568" ThreadID="1608"/>
        <Channel>Security</Channel>
        <Computer>myserver.mydom.com</Computer>
        <Security/>
    </System>
    <EventData>
        <Data Name="SubjectUserSid">mysid</Data>
        <Data Name="SubjectUserName">myuser</Data>
        <Data Name="SubjectDomainName">mydom</Data>
        <Data Name="SubjectLogonId">0x5ca73f</Data>
        <Data Name="TargetUserSid">S-1-0-0</Data>
        <Data Name="TargetUserName">myuser2</Data>
        <Data Name="TargetDomainName">mydom</Data>
        <Data Name="Status">0xc000006d</Data>
        <Data Name="FailureReason">%%2313</Data>
        <Data Name="SubStatus">0xc000006a</Data>
        <Data Name="LogonType">2</Data>
        <Data Name="LogonProcessName">seclogo</Data>
        <Data Name="AuthenticationPackageName">Negotiate</Data>
        <Data Name="WorkstationName">myserver</Data>
        <Data Name="TransmittedServices">-</Data>
        <Data Name="LmPackageName">-</Data>
        <Data Name="KeyLength">0</Data>
        <Data Name="ProcessId">0x3e8</Data>
        <Data Name="ProcessName">C:\Windows\System32\svchost.exe</Data>
        <Data Name="IpAddress">::1</Data>
        <Data Name="IpPort">0</Data>
    </EventData>
</Event>

다음 스크립트를 통해 SQL에 데이터를 삽입하려고 할 때 다음 오류가 발생합니다.

$SQLDBName = 'test'
$SQLServer = 'mysrv,1433'

#Open connection to sql DB
$connectionString = "Server = $SQLServer;Integrated Security=true;Initial Catalog=$SQLDBName;"
$SQLConnection = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString
$SQLConnection.DestinationTableName = "ForwardedEvents"

#create columns for datatable and set their types
$columns = @()
$columns +=  #Order MUST match that of the DB
(New-Object System.Data.DataColumn -ArgumentList @("SystemTime"        , [System.string]         )),  
(New-Object System.Data.DataColumn -ArgumentList @("EventLogXML"       , [System.Xml.XmlNode] ))

#build datatable for bulk insert
$dt = New-Object System.Data.DataTable
$columns | %{$dt.Columns.add($_) | Out-Null}

$row = $dt.NewRow() #Create row
$row.Item("SystemTime")         = "This string get inserted fine"
$row.Item("EventLogXML")        = [xml](cat C:\test\4625_forForums.xml)
$dt.Rows.Add($row) #add row to table

#insert into DB and close connection
$SQLConnection.WriteToServer($dt)
$SQLConnection.close()

오류 : "1"인수가있는 "WriteToServer"예외 : "지정된 캐스트가 유효하지 않습니다."

도움을 주셔서 감사합니다. 미리 감사드립니다.

편집 : 여기 datatable입니다 :

CREATE TABLE ForwardedEvents
(
    SystemTime              NVarChar(200)     NOT NULL,
    EventLogXML             XML               NOT NULL,
)

수락 된 답변

SQL Server 테이블을 XML 데이터 형식으로 유지하면서 DataColumns에 문자열 데이터 형식을 사용하는 경우가 많습니다. 이것은 나를 위해 잘 작동합니다.

XML 파일을 xml로 변환하는 대신 (cat C : \ test \ 4625_forForums.xml -raw) 사용하고 [System.Xml.XmlNode]를 [System.String]으로 정의하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.