2016-03-15 97 views
1

我試圖將XML文件讀入已存在的數據庫表中。將XML文件讀取到已存在的數據庫表中

問題是雖然XML標籤和數據庫列具有相同的數據類型,但它們並不具有相同的名稱。因此,我想將XML標籤「翻譯」到數據庫列中,以便數據庫的輸入成爲可能。 但我不知道該怎麼做。

這是我到目前爲止所做的。

static void writeToDatabase() 
     { 
      XmlDocument doc= new XmlDocument(); 
      try { 
       //Reading the xml 
        doc.Load("C:\\Temp\navetout.xml"); 


       DataTable dt = new DataTable(); 

       //Code here to read the xml into an already existing database table? 



       } 

      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 

     } 

數據庫位於另一臺服務器上,我包括這對app.config

<connectionStrings> 
    <add name="CS" 
    connectionString="Data Source=tsrv2062;Initial Catalog=BUMS;Integrated Security=True"/> 
    </connectionStrings> 

比方說,一個例子是,XML文件具有在數據庫中標記「名稱」表列有列「名字」。

在將XML數據讀入數據庫表之前,我想XML標籤必須被轉換成數據庫表列。在這種情況下,「名字」。

任何人都可以幫我解決這個「翻譯」和讀入數據庫表。

UPDATE

XML示例:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfFolkbokforingspostTYPE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <FolkbokforingspostTYPE> 
    <Sekretessmarkering xsi:nil="true" /> 
    <Personpost> 
     <PersonId> 
     <PersonNr>7527245452542</PersonNr> 
     </PersonId> 
     <HanvisningsPersonNr xsi:nil="true" /> 
     <Namn> 
     <Tilltalsnamnsmarkering>20</Tilltalsnamnsmarkering> 
     <Fornamn>skjdgnsdng</Fornamn> 
     <Mellannamn xsi:nil="true" /> 
     <Efternamn>sdsdgsdgs</Efternamn> 
     <Aviseringsnamn xsi:nil="true" /> 
     </Namn> 
     <Folkbokforing> 
     <Folkbokforingsdatum>20060512</Folkbokforingsdatum> 
     <LanKod>56</LanKod> 
     <KommunKod>77</KommunKod> 
     <ForsamlingKod xsi:nil="true" /> 
     <Fastighetsbeteckning>PÅLNGE 6:38</Fastighetsbeteckning> 
     <FiktivtNr>0</FiktivtNr> 
     </Folkbokforing> 
     <Adresser> 
     <Folkbokforingsadress> 
      <CareOf xsi:nil="true" /> 
      <Utdelningsadress1 xsi:nil="true" /> 
      <Utdelningsadress2>sgdsdgsdgs</Utdelningsadress2> 
      <PostNr>78965</PostNr> 
      <Postort>PÅLÄNG</Postort> 
     </Folkbokforingsadress> 
     <Riksnycklar> 
      <FastighetsId>46464545</FastighetsId> 
      <AdressplatsId>764846846</AdressplatsId> 
      <LagenhetsId>45465654645</LagenhetsId> 
     </Riksnycklar> 
     </Adresser> 
     <Fodelse> 
     <HemortSverige> 
      <FodelselanKod>00</FodelselanKod> 
      <Fodelseforsamling>NEDERKALIX</Fodelseforsamling> 
     </HemortSverige> 
     </Fodelse> 
     <Medborgarskap> 
     <MedborgarskapslandKod>SE</MedborgarskapslandKod> 
     <Medborgarskapsdatum>0</Medborgarskapsdatum> 
     </Medborgarskap> 
    </Personpost> 
    </FolkbokforingspostTYPE> 

更新2:

這些是數據庫表的列:

PersonalIdentityNumber 
ProtectedIdentity 
ReferedCivicRegistrationNumber 
UnregistrationReason 
UnregistrationDate 
MessageComputerComputer 
GivenNameNumber 
FirstName 
MiddleName 
LastName 
NotifyName 
NationalRegistrationDate 
NationalRegistrationCountyCode 
NationalRegistrationMunicipalityCode 
NationalRegistrationCoAddress 
NationalRegistrationDistributionAddress1 
NationalRegistrationDistributionAddress2 
NationalRegistrationPostCode 
NationalRegistrationCity 
NationalRegistrationNotifyDistributionAddress 
NationalRegistrationNotifyPostCode 
NationalRegistrationNotifyCity 
ForeignDistrubtionAddress1 
ForeignDistrubtionAddress2 
ForeignDistrubtionAddress3 
ForeignDistrubtionCountry 
ForeignDate 
BirthCountyCode 
BirthParish 
ForeignBirthCity 
CitizenshipCode 
CitizenshipDate 
Email 
Telephone 
Mobiletelephone 
Gender 
NotNewsPaper 
Note 
StatusCode 
NationalRegistrationCode 
RegistrationDate 
LastUpdatedFromNavet 
TemporaryDistrubtionAddress1 
TemporaryDistrubtionAddress2 
TemporaryDistrubtionAddress3 
TemporaryDistrubtionCountry 
Password 
VisibilityLevel 
LastChangedBy 
LastChangedDate 
SeamanIdentity 
Category 

這裏例如,<PersonNr> tagg和數據庫列PersonalIdentityNumber是相同的。 與XML標籤不匹配的列應該返回null

+0

你爲什麼設置'sql-server'標籤?你只是想讀一個現有的XML文件到你的C#應用​​程序?然後你寫下你想將這個內容添加到現有的DataTable中,但是你正在創建一個新的DataTable實例......這是一個包含SQL Server的現有表嗎?如果是這樣的話:在SQL Server中創建存儲過程並不容易,接受XML作爲輸入。在那裏你可以用任何命名來撕碎XML,並做你想做的事......請給出詳細信息(尤其是你的XML的一個例子) – Shnugo

+0

我想將XML數據中的XML數據添加到SQL服務器表中。 –

+0

請您回答我評論的問題嗎?你最近的評論沒有添加任何消息到這...只是想一個SO用戶的頭...我們不知道你真的想要什麼... – Shnugo

回答

1

正如我不知道,哪些值映射到哪一列,我會給你一個例子如何做到這一點。但是在這個模板之後添加其他的應該很容易。

用這樣的密碼,你可以將值插入到表中。

INSERT INTO YourTable(PersonalIdentityNumber, ... , FirstName,MiddleName,LastName, ...) 
SELECT Person.value('(PersonId/PersonNr)[1]','varchar(max)') AS PersonalIdentityNumber 
     ,... 
     ,Person.value('(Namn/Fornamn)[1]','varchar(max)') AS FirstName 
     ,Person.value('(Namn/Mellannamn)[1]','varchar(max)') AS MiddleName 
     ,Person.value('(Namn/Efternamn)[1]','varchar(max)') AS LastName 
     ,... 

FROM @xml.nodes('/ArrayOfFolkbokforingspostTYPE/FolkbokforingspostTYPE/Personpost') AS The(Person) 

其實沒有必要像我一樣在這裏命名你SELECT的列。使用INSERT INTO您可以定義一個列列表,下面的SELECT必須以正確的計數和順序返回這些列。

您必須瞭解,XPath對您的拼寫非常嚴格,並且區分大小寫爲不會出現錯誤,如果您執行了錯誤操作,則不會出現錯誤。

如果您對XML查詢沒有經驗:只需在INSERT INTO前面輸入--,然後讓SELECT的結果顯示給您。如果一切正常,請刪除--,並將數據插入到表格中。

要從您的應用程序中輕鬆調用,您可以將其放入Stored Procedure並將XML作爲參數傳入。

+0

謝謝。只是一個問題。 'Person.'來自哪個'SELECT'? –

+0

@ Simon.S,當你查詢XML時,你經常使用'.nodes(XPath)'開始你的「導航」。 '.nodes()'本身需要別名。所以 - 最後你會發現'AS(人)'。您可以將其作爲表名和列名稱。 – Shnugo

+0

哦,我明白了。但是它不是應該在某處獲得XML文件的路徑嗎? –