Laden...

xml auslesen und später in sql datenbank speichern

Erstellt von DocSpencer vor 8 Jahren Letzter Beitrag vor 8 Jahren 7.467 Views
D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren
xml auslesen und später in sql datenbank speichern

Moinsen ihr alle,

ich beiß hier gleich in meinen Tisch!!
Ich möchte eigentlich nichts anderes, als eine xml datei die ich bekomme auslesen und dann die entsprechenden werte in einer sql datenbank ablegen.

Nun scheitere ich grade schon am auslesen der ... Daten!

Kann mir mal kurz einer sagen wo mein Denkfehler ist???


 XmlDocument document = new XmlDocument();
            document.Load(@"E:\test.xml");

            XmlNode root = document.DocumentElement;
            XmlNode node = root.SelectSingleNode("//envelope");

            Console.WriteLine("timestamp: {0}", node["timestamp"].InnerText);
            Console.WriteLine("transaction: {0}", node["transaction"].InnerText);
            Console.WriteLine("order_type: {0}", node["order_type"].InnerText);

            Console.ReadKey(true);


Das ist nur ein kurzer Test um zu schauen ob er die Werte richtig ausließt...
Ich bekomme aber sofort die Meldung

Fehlermeldung:
"der objektverweis wurde nicht auf eine objektinstanz festgelegt"

Ich würde mich über ne kleine Info wirklich freuen!

Doc

2.207 Beiträge seit 2011
vor 8 Jahren

[Artikel] Debugger: Wie verwende ich den von Visual Studio?
[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

Forensuche nach "Xml auslesen"

Damit solltest du weiterkommen.

Da ist was "null", was nicht null sein sollte 😉. Lokalisier mal, wo der Fehler genau auftritt und dann kannste schauen, wos hängt.

Gruss

Coffeebean

D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren

Danke für die schnelle Antwort.

Ich muss mich ersteinmal für meinen unvollständigen Post entschuldigen!

Hier die fehlende xml


<?xml version="1.0" encoding="UTF-8"?>
<envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema_instance" xsi:noNamespaceSchemaLocation="actual_shipped.xsd">
  <actual_shipped order_id="12345678">
    <timestamp>2015_05_10T14:27:49</timestamp>
    <transaction>Shipment</transaction>
    <order_type>Neuversand mit Konfiguration</order_type>
    <terminal_id>1234567</terminal_id>
    <client>bla</client>
    <ship_to_address>
      <name>Max Mustermann</name>
      <contact>Max Mustermann</contact>
      <street>Musterstr. 5</street>
      <postal_code>12345</postal_code>
      <city>Musterstadt</city>
      <country>DE</country>
    </ship_to_address>
    <shipping_date>2015_05_10T14:27:49</shipping_date>
  </actual_shipped>
</envelope>

Ja 'timestamp' ist null. Die Frage ist warum. 😦
Natürlich werde ich noch weiter rumlesen.

Und nochmals vielen Dank!!

709 Beiträge seit 2008
vor 8 Jahren

timestamp ist Element von actual_shipped und nicht von envelope.

D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren

Danke!!!

P
157 Beiträge seit 2014
vor 8 Jahren

Hallo,

du kannst dir das manuelle laden von Xml-Dateien sparen, wenn du die Serialisierung verwendest.

Dann hast du nachher 1 Zeile Code für den Ladeaufruf und ein entsprechendes Klassemodell für den Inhalt der Xml-Datei.

vg

Wenn's zum weinen nicht reicht, lach drüber!

D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren

Hey ihr alle. Vielen Vielen Dank für die Antworten!!

Ich habe die xml nun soweit auseinander genommen, dass ich an fast alle Daten komme die ich brauche und kann diese nun in die Datenbank packen.

Die Einzige Info an die ich noch nicht komme, da es sich nicht um den InnerText eines Knotens handelt ist die Order ID welche sich (warum auch immer) "versteckt"


<actual_shipped order_id="12345678">

Hat jemand ne Idee wie ich die elegant auslese?

Vielen Dank im Voraus

Doc

189 Beiträge seit 2014
vor 8 Jahren

Hast du beachtet, dass die ID ein Attribut ist und kein Element?
Da greift man unterschiedlich auf die Werte zu.

2.207 Beiträge seit 2011
vor 8 Jahren
... .Attributes["order_id"].Value;

ungetestet.

Gruss

Coffeebean

D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren

Klasse!!
Funktioniert perfekt! 😄

Vielen Vielen Dank!!

D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren

HMPF!!

Auslesen der Daten klappt!
Verbindung zur Datenbank klappt!
Einfügen der Daten klappt - nicht! arg

Fehlermeldung:
Ausnahmefehler: System.Data.SqlClient.SqlException: Falsche Syntax in der Nähe des ansaction-Schlüsselworts.
bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
...

Mein Command schaut wie folgt aus:


SqlCommand cmd1 = new SqlCommand();
                cmd1.CommandType = System.Data.CommandType.Text;
                cmd1.CommandText = "INSERT INTO actual_shipped (timestamp, transaction, order_type, terminal_id, client, shipping_date, tracking_no, order_id) VALUE (timestamp, transaction, order_type, terminal_id, client, shipping_date, tracking_no, order_id);";
                cmd1.Connection = myConnection;

und das Einlesen der Daten so:



XmlNode order_ID1 = root.SelectSingleNode("//actual_shipped");
            if (order_ID1 == null)
                return;

                var id = order_ID1.Attributes["order_id"].Value;

                var time = order_ID1["timestamp"].InnerText;
                var transaction = order_ID1["transaction"].InnerText;
                var order_type =order_ID1["order_type"].InnerText;
                var terminal_id =order_ID1["terminal_id"].InnerText;
                var client =order_ID1["client"].InnerText;
                var shipping_date =order_ID1["shipping_date"].InnerText;
                var tracking_no =order_ID1["tracking_no"].InnerText;


Ja ich weil ich muss den Command noch umbauen, -> cmd1.Parameter.AddWithValue(...) usw.
Aber das kommt sobald er schreibt 😄

Wahrscheinlich sieht es einer von euch wieder sofort und ich starre wieder stundenlang drauf ohne es zu sehen... schnief

Vielen Dank im Voraus

Doc

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

ich weiß nicht ob esDein Problem löst, aber in Deinem INSERT-Statement sollte statt VALUE VALUES stehen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

2.207 Beiträge seit 2011
vor 8 Jahren

Aber das kommt sobald er schreibt 😄

Machs gleich richtig, dann kommen solche Fehler weniger bzw. sind sie einfacher einzugrenzen.

Ansonsten ist das hier vergebene Liebesmüh.

[Artikel] Debugger: Wie verwende ich den von Visual Studio?
(Den habe ich dir schonmal verlinkt. Benutze ihn endlich und schau, was er gegen deine DB feuert.)

[Artikelserie] SQL: Parameter von Befehlen

Gruss

Coffeebean

T
314 Beiträge seit 2013
vor 8 Jahren

Nun die Fehlermeldung ist doch eindeutig, wenn man davon ausgeht dass dort Transaction statt ansaction steht.

D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren

Hi ich nochmal,

@t0ms3n: Da muss ich mich beim korrigieren der Formatierung der Fehlermeldung vertan haben.
Daher hier nochmal die vollständige Meldung:

Fehlermeldung:
Ausnahmefehler: System.Data.SqlClient.SqlException: Falsche Syntax in der Nähe d
es transaction-Schlüsselworts.
bei System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boole
an breakConnection, Action1 wrapCloseInAction) bei System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exceptio n, Boolean breakConnection, Action1 wrapCloseInAction)
bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateOb
ject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
bei System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlComman
d cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,
TdsParserStateObject stateObj, Boolean& dataReady)
bei System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, Ru
nBehavior runBehavior, String resetOptionsString)
bei System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdB
ehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 tim
eout, Task& task, Boolean asyncWrite, SqlDataReader ds)
bei System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBeha
vior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompleti
onSource1 completion, Int32 timeout, Task&amp; task, Boolean asyncWrite) bei System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSo urce1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean
asyncWrite)
bei System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
bei xml_import.Program.Main(String[] args)

@Coffeebean: Natürlich hast du recht, es gleich vernünftig zu machen hilft Fehler zu vermeiden und schult. Bez. des debuggers habe ich leider das Problem, dass ich von meinem Rechner aus keinen Zugriff auf die Datenbank habe. Der Server ist dahingehend abgeschottet.
Ich hatte einfach auf einen Schreibfehler wie den den MarsStein gefunden hatte gehofft.
Leider hat selbiger aber nicht das Problem behoben.

Trotz alledem natürlich vielen vielen Dank für eure Mühen!"!

Doc

Derzeitiger Stand leider noch immer mit oben stehendem Fehler



SqlCommand cmd1 = new SqlCommand();
                cmd1.CommandType = System.Data.CommandType.Text;
                cmd1.CommandText = "INSERT INTO actual_shipped (timestamp, transaction, order_type, terminal_id, client, shipping_date, tracking_no, order_id) VALUES (@timestamp, @transaction, @order_type, @terminal_id, @client, @shipping_date, @tracking_no, @order_id)";
                cmd1.Parameters.AddWithValue("@timestamp", timestamp);
                cmd1.Parameters.AddWithValue("@transaction", transaction);
                cmd1.Parameters.AddWithValue("@order_type", order_type);
                cmd1.Parameters.AddWithValue("@terminal_id", terminal_id);
                cmd1.Parameters.AddWithValue("@client", client);
                cmd1.Parameters.AddWithValue("@shipping_date", shipping_date);
                cmd1.Parameters.AddWithValue("@tracking_no", tracking_no);
                cmd1.Parameters.AddWithValue("@order_id", id);
                cmd1.Connection = myConnection;

                myConnection.Open();
                cmd1.ExecuteNonQuery();
                myConnection.Close();



2.207 Beiträge seit 2011
vor 8 Jahren


>

(Den habe ich dir schonmal verlinkt. Benutze ihn endlich und schau, was er gegen deine DB feuert.)

Bez. des debuggers habe ich leider das Problem, dass ich von meinem Rechner aus keinen Zugriff auf die Datenbank habe. Der Server ist dahingehend abgeschottet.

Du hast den Code doch vor dir. Im "cmd1" steht der Commandtext doch drin deine Parameter auch. Nimm den dochmal raus (copy/paste) und schau ihn dir an. Entweder siehst du, was nicht stimmt oder du lässt ihn mal validieren. Musst halt deine Parameter einsetzen. Die Fehlermeldung ist ein Syntax-Error. Den solltest du bei dem "kleinen" Query ohne viel Mühe finden.

Gruss

Coffeebean

16.834 Beiträge seit 2008
vor 8 Jahren

transaction ist ein geschütztes Keyword im SQL-Server - dementsprechend muss es auch behandelt werden (Brackets).

Insgesamt hab ich ein wenig den Eindruck, dass Du irgendwas (aus dem Netz) zusammen kopierst und uns nachher die Fehler ausbügeln lässt statt Dich mit dem Thema ordentlich zu beschäftigen.
Das fängt beim XML an und geht grade so beim SQL weiter.

D
DocSpencer Themenstarter:in
10 Beiträge seit 2014
vor 8 Jahren

OK, Fehler gefunden.
Der Vollständigkeit halber möchte ich ihn euch nicht vorenthalten...

Die Eckigen Klammern fehlten um die Spaltennamen!

TADA...

Vielen Dank für alles !!

Doc