2016-04-05 12 views
0

私は、XMLデータをデータベーステーブルにマップするプログラムを作成しています。XMLからデータベースへのマッピングテーブル

これは、私はそれを試してみました方法です:

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"); 
     } 
    } 
} 

私はエラーが

名 "NationalRegistrationNotifyDistributionAddressが" このコンテキストで許可されていないと言うcommand1.ExecuteNonQuery();

にエラーが発生します。有効な式は、定数、定数式、および(一部のコンテキストでは)変数です。列名は使用できません。

XML navetout.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>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> 

私はエラーが出るのはなぜ?

さらに、XMLタグをテーブルの列と一致するように「変換」するにはどうすればよいですか?

+0

これはどのRDBMSですか? 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれかを指定するタグを追加してください。 –

+0

これはSQLサーバー向けです –

答えて

0

すべてのフィールドを渡すわけではありません。残りのパラメータを追加する必要があります。

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

また、最初のパラメータの後には、@が存在しません。データテーブルにXMLを変換するためのリンク以下

+0

最初のパラメーターに@がないことを意味しますか?私は 'command1.Parameters.AddWithValue(" @ PersonalIdentityNumber "、PersonalIdentityNumber);' –

+0

'@'でそれを持っています。これはパラメータであり、後で値を与える必要があります。 sqlの最初のパラメータ(PersonalIdentityNumber)には '@'しかありません。それは残りのために欠けている。これがなければ、パラメータはカラム名とみなされます。そのため、 'カラム名は許可されていません。 'というエラーが表示されます。 – Quentin

+0

ええ、値はパラメータの後のローカル変数です。私の更新された質問を参照してください –

0

試して、あなたの長いコード行で

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

あなたは

values(@PersonalIdentityNumber, NationalRegistrationNotifyDistribution ... 

最初が第二ではない@であるを見つけます。

カラム名の使用場所と変数名の使用場所を知っている必要があります。

あなたはVALUES内リテラル値を使用しますが、可能性がある - あなたはそれらのすべてを宣言して、コマンドオブジェクトに値を追加する必要があり@で(パラメータを使用している場合、テスト目的のためにあなただけのこれを追加する:

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

おそらく(クラッセにXMLを読んで、それをデシリアライズ、その後、すべてのXMLコンテンツを持つシリアライズクラスを記述してみてください、あなたのテストのためのリテラル値を使用するか、またはすべてのパラメータを追加し、@

+0

申し訳ありません、私はそれを試してみましょう。ありがとうございました –

+0

databseテーブルに値を挿入できるようにXMLタグをローカル変数に追加することはできますか? –

+0

@ Simon.S、XMLは文字列です(技術的には特産品があります...)。 'VARCHAR(MAX)'型のSQLパラメータを定義し、文字列を渡してSQLコード内のXMLにキャストすることができます。 XMLのエンコーディングが必要な特殊文字の問題に遭遇する可能性があります(例: '& - > &')... SQLパラメータをXMLとして定義して、エンコーディングを渡す必要がありました。いずれの場合も、SQLコード内でXMLを細断処理す​​る必要があります。 [これはどうやって?私はあなたに既に回答を...](http://stackoverflow.com/a/36037496/5089204):-) – Shnugo

0

で適切なネーミングを使用しますかs)。 XMLが単なるXMLではなく、内部ノードを持つ内部クラスを使用するのがベストです。

これは単なる試練だと思うので、次のトレーニングポイントはおそらく、DBの単一の「モンスター」テーブルを論理的にリンクされたユニット(別名正規化)に分割することです。

関連する問題