2016-04-05 11 views
0

Ich schreibe ein Programm, das XML-Daten einer Datenbanktabelle zuordnet.Zuordnung zu XML-Datenbanktabelle

Dies ist, wie ich es versucht:

namespace TESTMAPPNING2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test(); 
     } 


     static void Test() 
     { 
      string connetionString = null; 
      SqlConnection connection; 
      SqlCommand command; 
      SqlDataAdapter adpter = new SqlDataAdapter(); 
      DataSet ds = new DataSet(); 
      XmlReader xmlFile; 
      string sql = null; 

      //The XML-tags that i want to insert in the table columns 
      string PersonalIdentityNumber = null; 
      string ProtectedIdentity = null; 
      int ReferedCivicRegistrationNumber = 0; 
      string UnregistrationReason = null; 
      DateTime? UnregistrationDate = null; 
      string MessageComputerComputer = null; 
      int GivenNameNumber = 0; 
      string FirstName = null; 
      string LastName = null; 
      string NotifyName = null; 
      DateTime? NationalRegistrationDate = null; 
      string NationalRegistrationCountyCode = null; 
      string NationalRegistrationMunicipalityCode = null; 
      string NationalRegistrationCoAddress = null; 
      string NationalRegistrationDistributionAddress1 = null; 
      string NationalRegistrationDistributionAddress2 = null; 
      string NationalRegistrationPostCode = null; 
      string NationalRegistrationCity = null; 
      string NationalRegistrationNotifyDistributionAddress = null; 
      string NationalRegistrationNotifyPostCode = null; 
      string NationalRegistrationNotifyCity = null; 
      string ForeignDistrubtionAddress1 = null; 
      string ForeignDistrubtionAddress2 = null; 
      string ForeignDistrubtionAddress3 = null; 
      string ForeignDistrubtionCountry = null; 
      string ForeignDate = null; 
      string BirthCountyCode = null; 
      string BirthParish = null; 
      string ForeignBirthCity = null; 
      string CitizenshipCode = null; 
      DateTime? CitizenshipDate = null; 
      string Email = null; 
      string Telephone = null; 
      string Mobiletelephone = null; 
      string Gender = null; 
      string NotNewsPaper = null; 
      string Note = null; 
      string StatusCode = null; 
      string NationalRegistrationCode = null; 
      DateTime? RegistrationDate = null; 
      DateTime? LastUpdatedFromNavet = null; 
      string TemporaryDistrubtionAddress1 = null; 
      string TemporaryDistrubtionAddress2 = null; 
      string TemporaryDistrubtionAddress3 = null; 
      string TemporaryDistrubtionCountry = null; 
      string Password = null; 
      string VisibilityLevel = null; 
      string LastChangedBy = null; 
      DateTime? LastChangedDate = null; 
      int SeamanIdentity = 0; 
      string Category = null; 







      connetionString = "Data Source=tsrv2062;Initial Catalog=Bums;User ID=BumsUser;Password=2tusen7Bums"; 

      connection = new SqlConnection(connetionString); 

      xmlFile = XmlReader.Create("navetout.xml", new XmlReaderSettings()); 
      ds.ReadXml(xmlFile); 

      int i = 0; 
      connection.Open(); 
      for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) 
      { 
       PersonalIdentityNumber = ds.Tables[0].Rows[i].ItemArray[0].ToString(); 



       SqlCommand command1 = new SqlCommand("INSERT INTO Seamen(PersonalIdentityNumber, ProtectedIdentity, ReferedCivicRegistrationNumber,UnregistrationReason,UnregistrationDate,MessageComputerComputer,GivenNameNumber,FirstName,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) values(@PersonalIdentityNumber, @ProtectedIdentity, @ReferedCivicRegistrationNumber,@UnregistrationReason,@UnregistrationDate,@MessageComputerComputer,@GivenNameNumber,@FirstName,@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)", connection); 
       command1.Parameters.AddWithValue("@PersonalIdentityNumber", PersonalIdentityNumber); 
       command1.Parameters.AddWithValue("@ProtectedIdentity", ProtectedIdentity); 
       command1.Parameters.AddWithValue("@ReferedCivicRegistrationNumber", ReferedCivicRegistrationNumber); 
       command1.Parameters.AddWithValue("@UnregistrationReason", UnregistrationReason); 
       command1.Parameters.AddWithValue("@UnregistrationDate", UnregistrationDate); 
       command1.Parameters.AddWithValue("@MessageComputerComputer", MessageComputerComputer); 
       command1.Parameters.AddWithValue("@GivenNameNumber", GivenNameNumber); 
       command1.Parameters.AddWithValue("@FirstName", FirstName); 
       command1.Parameters.AddWithValue("@LastName", LastName); 
       command1.Parameters.AddWithValue("@NotifyName", NotifyName); 
       command1.Parameters.AddWithValue("@NationalRegistrationDate", NationalRegistrationDate); 
       command1.Parameters.AddWithValue("@NationalRegistrationCountyCode", NationalRegistrationCountyCode); 
       command1.Parameters.AddWithValue("@NationalRegistrationMunicipalityCode", NationalRegistrationMunicipalityCode); 
       command1.Parameters.AddWithValue("@NationalRegistrationCoAddress", NationalRegistrationCoAddress); 
       command1.Parameters.AddWithValue("@NationalRegistrationDistributionAddress1", NationalRegistrationDistributionAddress1); 
       command1.Parameters.AddWithValue("@NationalRegistrationDistributionAddress2", NationalRegistrationDistributionAddress2); 
       command1.Parameters.AddWithValue("@NationalRegistrationPostCode", NationalRegistrationPostCode); 
       command1.Parameters.AddWithValue("@NationalRegistrationCity", NationalRegistrationCity); 
       command1.Parameters.AddWithValue("@NationalRegistrationNotifyDistributionAddress", NationalRegistrationNotifyDistributionAddress); 
       command1.Parameters.AddWithValue("@NationalRegistrationNotifyPostCode", NationalRegistrationNotifyPostCode); 
       command1.Parameters.AddWithValue("@NationalRegistrationNotifyCity", NationalRegistrationNotifyCity); 
       command1.Parameters.AddWithValue("@ForeignDistrubtionAddress1", ForeignDistrubtionAddress1); 
       command1.Parameters.AddWithValue("@ForeignDistrubtionAddress2", ForeignDistrubtionAddress2); 
       command1.Parameters.AddWithValue("@ForeignDistrubtionAddress3", ForeignDistrubtionAddress3); 
       command1.Parameters.AddWithValue("@ForeignDistrubtionCountry", ForeignDistrubtionCountry); 
       command1.Parameters.AddWithValue("@ForeignDate", ForeignDate); 
       command1.Parameters.AddWithValue("@BirthCountyCode", BirthCountyCode); 
       command1.Parameters.AddWithValue("@BirthParish", BirthParish); 
       command1.Parameters.AddWithValue("@ForeignBirthCity", ForeignBirthCity); 
       command1.Parameters.AddWithValue("@CitizenshipCode", CitizenshipCode); 
       command1.Parameters.AddWithValue("@CitizenshipDate", CitizenshipDate); 
       command1.Parameters.AddWithValue("@Email", Email); 
       command1.Parameters.AddWithValue("@Telephone ", Telephone); 
       command1.Parameters.AddWithValue("@Mobiletelephone", Mobiletelephone); 
       command1.Parameters.AddWithValue("@Gender", Gender); 
       command1.Parameters.AddWithValue("@NotNewsPaper", NotNewsPaper); 
       command1.Parameters.AddWithValue("@Note", Note); 
       command1.Parameters.AddWithValue("@StatusCode", StatusCode); 
       command1.Parameters.AddWithValue("@NationalRegistrationCode", NationalRegistrationCode); 
       command1.Parameters.AddWithValue("@RegistrationDate", RegistrationDate); 
       command1.Parameters.AddWithValue("@LastUpdatedFromNavet", LastUpdatedFromNavet); 
       command1.Parameters.AddWithValue("@TemporaryDistrubtionAddress1", TemporaryDistrubtionAddress1); 
       command1.Parameters.AddWithValue("@TemporaryDistrubtionAddress2", TemporaryDistrubtionAddress2); 
       command1.Parameters.AddWithValue("@TemporaryDistrubtionAddress3", TemporaryDistrubtionAddress3); 
       command1.Parameters.AddWithValue("@TemporaryDistrubtionCountry", TemporaryDistrubtionCountry); 
       command1.Parameters.AddWithValue("@Password", Password); 
       command1.Parameters.AddWithValue("@VisibilityLevel", VisibilityLevel); 
       command1.Parameters.AddWithValue("@LastChangedBy", LastChangedBy); 
       command1.Parameters.AddWithValue("@LastChangedDate", LastChangedDate); 
       command1.Parameters.AddWithValue("@SeamanIdentity", SeamanIdentity); 
       command1.Parameters.AddWithValue("@Category", Category); 



       command1.ExecuteNonQuery(); 
      } 
      connection.Close(); 
      Console.WriteLine("Done"); 
     } 
    } 
} 

ich Fehler auf dem command1.ExecuteNonQuery();

Der Fehler

Der Name "NationalRegistrationNotifyDistributionAddress", sagt ist in diesem Zusammenhang nicht zulässig. Gültige Ausdrücke sind Konstanten, konstante Ausdrücke und (in einigen Kontexten) Variablen. Spaltennamen sind nicht erlaubt.

Die XML navetout.xml sieht wie folgt aus:

<?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>194903188953</PersonNr> 
     </PersonId> 
     <HanvisningsPersonNr xsi:nil="true" /> 
     <Namn> 
     <Tilltalsnamnsmarkering>20</Tilltalsnamnsmarkering> 
     <Fornamn>Erik Lennart</Fornamn> 
     <Mellannamn xsi:nil="true" /> 
     <Efternamn>Enberg</Efternamn> 
     <Aviseringsnamn xsi:nil="true" /> 
     </Namn> 
     <Folkbokforing> 
     <Folkbokforingsdatum>20060512</Folkbokforingsdatum> 
     <LanKod>25</LanKod> 
     <KommunKod>14</KommunKod> 
     <ForsamlingKod xsi:nil="true" /> 
     <Fastighetsbeteckning>PÅLÄNGE 6:38</Fastighetsbeteckning> 
     <FiktivtNr>0</FiktivtNr> 
     </Folkbokforing> 
     <Adresser> 
     <Folkbokforingsadress> 
      <CareOf xsi:nil="true" /> 
      <Utdelningsadress1 xsi:nil="true" /> 
      <Utdelningsadress2>STORVÄGEN 65</Utdelningsadress2> 
      <PostNr>95204</PostNr> 
      <Postort>PÅLÄNG</Postort> 
     </Folkbokforingsadress> 
     <Riksnycklar> 
      <FastighetsId>250015520</FastighetsId> 
      <AdressplatsId>2416233</AdressplatsId> 
      <LagenhetsId>22143838</LagenhetsId> 
     </Riksnycklar> 
     </Adresser> 
     <Fodelse> 
     <HemortSverige> 
      <FodelselanKod>25</FodelselanKod> 
      <Fodelseforsamling>NEDERKALIX</Fodelseforsamling> 
     </HemortSverige> 
     </Fodelse> 
     <Medborgarskap> 
     <MedborgarskapslandKod>SE</MedborgarskapslandKod> 
     <Medborgarskapsdatum>0</Medborgarskapsdatum> 
     </Medborgarskap> 
    </Personpost> </FolkbokforingspostTYPE> <FolkbokforingspostTYPE> 
    <Sekretessmarkering xsi:nil="true" /> 
    <Personpost> 
     <PersonId> 
    <TilldelatPersonNrSamordningsNr>195405869370</TilldelatPersonNrSamordningsNr> 
     </PersonId> 
     <HanvisningsPersonNr xsi:nil="true" /> 
     <Namn> 
     <Fornamn styrkt="J">Eduardo Metran</Fornamn> 
     <Mellannamn xsi:nil="true" /> 
     <Efternamn styrkt="J">Garcia</Efternamn> 
     <Aviseringsnamn xsi:nil="true" /> 
     </Namn> 
     <Folkbokforing> 
     <Folkbokforingsdatum xsi:nil="true" /> 
     <LanKod>14</LanKod> 
     <KommunKod xsi:nil="true" /> 
     <ForsamlingKod xsi:nil="true" /> 
     <Fastighetsbeteckning xsi:nil="true" /> 
     </Folkbokforing> 
     <Adresser /> 
     <Fodelse> 
     <OrtUtlandet> 
      <FodelseortUtland styrkt="J">Sta Cruz Zambales</FodelseortUtland> 
      <Fodelseland>FILIPPINERNA</Fodelseland> 
     </OrtUtlandet> 
     </Fodelse> 
     <Medborgarskap> 
     <MedborgarskapslandKod styrkt="J">PH</MedborgarskapslandKod> 
     <Medborgarskapsdatum>0</Medborgarskapsdatum> 
     </Medborgarskap> 
    </Personpost> </FolkbokforingspostTYPE> </ArrayOfFolkbokforingspostTYPE> 

Warum ich den Fehler?

Und vor allem, wie kann ich die XML-Tags "übersetzen", um die Tabellenspalten anzupassen?

+0

Für welches RDBMS ist das? Bitte fügen Sie einen Tag angeben, ob Sie mit 'mysql',' postgresql', 'sql-server',' oracle' oder 'db2' - oder etwas ganz anderes. –

+0

Es ist für SQL-Server –

Antwort

0

Sie übergeben nicht alle Felder. Sie müssen die Parameter für den Rest hinzufügen.

command1.Parameters.AddWithValue("@NationalRegistrationNotifyDistributionAddress", yourData); 
// same for the rest fields 

Auch @ wird nach dem ersten Parameter in der SQL fehlt.

+0

Was meinst du, dass das @ im ersten Parameter fehlt?Ich habe es in 'command1.Parameters.AddWithValue (" @ PersonalIdentityNumber ", PersonalIdentityNumber);' –

+0

'@' bedeutet, es ist ein Parameter, und Sie müssen später einen Wert angeben. Sie haben nur '@' für den ersten Parameter (PersonalIdentityNumber) in der SQL. Es fehlt für den Rest. Ohne diesen Parameter wird der Parameter als Spaltenname betrachtet. Deshalb wurde ein Fehler angezeigt, der besagt, dass Spaltennamen nicht zulässig sind. – Quentin

+0

Ja, aber der Wert ist die lokale Variable nach dem Parameter .. Bitte sehen Sie meine aktualisierte Frage –

0

try untenstehenden Link xml Datentabelle zu konvertieren,

www.dotnetpickles.com/2014/02/aspnet-convert-xml-to-datatable-in-cnet.html 
0

in Ihrer langen Codezeile Sie

values(@PersonalIdentityNumber, NationalRegistrationNotifyDistribution ... 

die erste mit @ finden die zweite nicht.

Sie müssen wissen, wo Sie die Namen Ihrer Spalten verwenden und wo Sie die Namen Ihrer Variablen verwenden.

könnten Sie Literalwerte verwenden innerhalb VALUES, aber - wenn Sie Parameter verwenden (mit dem @ Sie alle von ihnen erklären müssen und fügen Sie sie mit Werten zu Ihrem Befehlsobjekte Für Testzwecke Sie hinzufügen, nur dieses:

.
command1.Parameters.AddWithValue("@PersonalIdentityNumber", ... 

Entweder verwenden Literalwerte für Ihren Test oder alle Parameter hinzufügen und die richtige Namensgebung mit @

+0

Okay, ich werde es versuchen. Danke –

+0

Ist es möglich, die XML-Tags zu diesen lokalen Variablen hinzuzufügen, damit ich die Werte in die Datenbank-Tabelle einfügen kann? –

+0

@ Simon.S, Das XML ist ein String (technisch gibt es Spezialitäten ...). Sie können einen SQL-Parameter vom Typ 'VARCHAR (MAX)' definieren, den String übergeben und in Ihrem SQL-Code in XML umwandeln. Dies könnte zu Problemen mit Sonderzeichen führen, die eine Kodierung für XML benötigen (z. B. '& -> &') ... Besser war es, den SQL-Parameter als XML zu definieren, damit die Kodierung während des Passierens erfolgen sollte. In beiden Fällen müssten Sie Ihr XML in SQL-Code zerlegen. [Wie machst du das? Ich habe dir schon Antworten gegeben ...] (http://StackOverflow.com/a/36037496/5089204) :-) – Shnugo

0

Vielleicht versuchen verwenden Serialisierung Klassen mit allen XML-Inhalte zu schreiben, dann ist es deserialisieren (lesen sie den XML-Code in classe s). Am besten ist es, innere Klassen zu verwenden, in denen das XML innere Knoten hat, und nicht nur ein flaches XML.

Ich denke, dies ist nur ein Tryout ist, so dass der Punkt nächste Trainings wird wahrscheinlich die einzige „Monster“ Tabelle in der DB in logische verknüpften Einheiten (auch bekannt als Normalisieren) aufzuspalten sein.