Прочитайте ответ и сохраните в базе данных, используя Microsoft SMO (объекты управления сервером) - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь позвонить по URL. И затем я получу ответ в формате XML, и на основе того, какой ответ я получу, он успешно создаст Tables в базе данных, используя Microsoft SMO (Server Management Objects), что позволяет мне создавать и генерировать базы данных и столы. но по какой-то причине он вставляет любые данные в таблицы, и они NULL

Снимок экрана

enter image description here


XML:

<ICECAT-interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://data.icecat.biz/xsd/files.index.xsd">
     <files.index Generated="20200219011050">
    <file path="export/freexml.int/EN/1424.xml" Product_ID="1424" Updated="20200218012414" Quality="ICECAT" Supplier_id="1" Prod_ID="C4811A" Catid="846" On_Market="1" Model_Name="11" Product_View="513730" HighPic="http://images.icecat.biz/img/gallery/1424_6912543175.jpg" HighPicSize="2478427" HighPicWidth="2598" HighPicHeight="3276" Date_Added="20051023000000" Limited="No" >
        <M_Prod_ID Supplier_id="11" Supplier_name="Cisco">C4811A</M_Prod_ID>
        <M_Prod_ID>Tempcomp3109</M_Prod_ID>
<Country_Markets>
  <Country_Market Value="NL"/>
  <Country_Market Value="BE"/>
  <Country_Market Value="FR"/>
  <Country_Market Value="UA"/>
  <Country_Market Value="GB"/>
  <Country_Market Value="DE"/>
  <Country_Market Value="BG"/>
</Country_Markets>
    </file>
    </files.index>
    </ICECAT-interface>

Модуль:

Class Module1
    Public Shared Sub Main()
        Dim url As String = "http://data.Icecat.biz/export/freexml/EN/daily.index.xml"
        ProcessXMLFeedURL(url)

    End Sub

    Public Shared Function ProcessXMLFeedURL(MyURL As String) As Boolean

        Dim OK As Boolean = False

        Try

            Dim rssReq As WebRequest = WebRequest.Create(MyURL)

            Dim username As String = ""

            Dim password As String = ""

            Dim encoded As String = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password))

            rssReq.Headers.Add("Authorization", "Basic " + encoded)

            '//Get the WebResponse

            Dim rep As WebResponse = rssReq.GetResponse()

            '//Read the Response in a XMLTextReader

            Dim xtr As XmlTextReader = New XmlTextReader(rep.GetResponseStream())

            '// Set up the connection to the SQL server

            Dim MyConnectionString As String = "Data Source=......"

            Dim Connection As SqlConnection = New SqlConnection(MyConnectionString)

            Dim MyServer As Server = New Server(New ServerConnection(Connection))

            Dim db As Database = New Database(MyServer, "xxxxx")

            db.Create()

            '//Create a new DataSet

            Dim ds As DataSet = New DataSet()

            '//Read the Response into the DataSet

            ds.ReadXml(xtr)

            '// Parse tables

            For i As Integer = 0 To ds.Tables.Count - 1

                Dim Mytable As Table

                Dim MyTableName As String = ds.Tables(i).TableName

                If Not HaveTable(MyConnectionString, MyTableName) Then

                    '// Create the table

                    Try

                        Mytable = New Table(db, MyTableName)

                    Catch ex As Exception

                        Dim ii As Integer = 0

                    End Try

                    '// Create the columns

                    Dim Mycolumn As Column = New Column()

                    For Each dc As DataColumn In ds.Tables(i).Columns

                        Mycolumn = New Column(Mytable, dc.ColumnName)

                        Mycolumn.DataType = getdatatype(dc.DataType.ToString)

                        Mytable.Columns.Add(Mycolumn)

                    Next

                    Mytable.Create()

                    Dim PrimaryKeys() As DataColumn = ds.Tables(i).PrimaryKey

                    Dim PrimaryKey As DataColumn

                    For Each PrimaryKey In PrimaryKeys

                        Dim Myindex As Index = New Index(Mytable, PrimaryKey.ColumnName)

                        Myindex.IndexKeyType = IndexKeyType.DriPrimaryKey

                        Myindex.IndexedColumns.Add(New IndexedColumn(Myindex, PrimaryKey.ColumnName))

                        Mytable.Indexes.Add(Myindex)

                    Next

                End If

                Using MyConnection As SqlConnection = New SqlConnection(MyConnectionString)

                    MyConnection.Open()

                    Using bulkcopy As SqlBulkCopy = New SqlBulkCopy(MyConnection)

                        bulkcopy.DestinationTableName = "[" & MyTableName & "]"

                        Try

                            bulkcopy.WriteToServer(ds.Tables(i))

                        Catch ex As Exception

                            Dim iw As Integer = 0

                        End Try

                    End Using

                    MyConnection.Close()

                End Using

            Next

        Catch ex As Exception

            Throw ex '// Do errorhanddling here

        End Try

        Return OK

    End Function

    Shared Function getdatatype(Mydatatype As String) As DataType

        Dim dty As DataType = Nothing

        Select Case Mydatatype

            Case Is = "System.Decimal"

                dty = DataType.Decimal(2, 18)

            Case Is = "System.String"

                dty = DataType.VarChar(500)

            Case Is = "System.Int32"

                dty = DataType.Int

        End Select

        Return dty

    End Function

    Shared Function HaveTable(MyConnectionString As String, TableName As String) As Boolean

        Dim OK As Boolean = False

        Try

            Dim dbConn As New SqlConnection(MyConnectionString)

            dbConn.Open()

            Dim restrictions(3) As String

            restrictions(2) = TableName

            Dim dbTbl As DataTable = dbConn.GetSchema("Tables", restrictions)

            If dbTbl.Rows.Count > 0 Then

                OK = True

            End If

            dbTbl.Dispose()

            dbConn.Close()

            dbConn.Dispose()

        Catch ex As Exception

            Dim ss As Integer = 0

        End Try

        Return OK

    End Function

End Class

Может кто-нибудь, пожалуйста, помогите мне!

...