1.)SQL->XML 2.) Concurrent Transactions

hallo, ich hätte zwei fragen an die experten:

1.) ich muss daten aus sql-servern (ich muss mehrere unterstützen, zumindest mssql, oracle, postgres, mysql5+ und andere gängige) auslesen und im XML format weiterverwerten. für kleine datensätze habe ich eine funktion geschrieben, die je nach datenbank mit concat oder + einen string zusammensetzt, also in etwa (ausm kopf):

[MS SQL]
CREATE FUNCTION GetXml() RETURNS VARCHAR(4000) AS
BEGIN
DECLARE @output AS VARCHAR(4000)
SELECT @output = @output + „“ + col1 + „“ FROM table1
RETURN @output
END

natürlich scheitert diese funktion am 8000er limit des ms sql servers und sowieso am 4000er limit von oracle. text und varbinary typen können ja leider nicht in funktionen verwendet werden. im moment frage ich daher ein recordset ab und füge die einzelnen records in c++ zusammen, was allerdings je nach datenbank bei mehreren tausend datensätzen einige sekunden dauern kann.

-> frage: wäre es sinnvoll und performant, einen temporären table mit einem text/ntext oder binary column zu erstellen, den xml string hineinzuschreiben und danach auszulesen?

2.) eine website greift über mehrere seiten auf eine relationale datenbank zu. änderungen in einem datensatz sollten erst bei betätigen eines „speichern“-buttons gespeichert werden. mir hätte da gefallen, eine transaktion zu starten, alle änderungen zu machen und beim klick auf „speichern“ die transaktion zu bestätigen (bzw rollback bei nichtspeichern).

-> problem: die website kann in der zwischenzeit nicht weiter auf die daten zugreifen. gibt es dafür irgendeine lösung in SQL oder muss ich die änderungen in meinem programm zwischenlagern und erst am schluss an die DB schicken=

hallo, ich hätte zwei fragen an die experten:

1.) ich muss daten aus sql-servern (ich muss mehrere
unterstützen, zumindest mssql, oracle, postgres, mysql5+ und
andere gängige) auslesen und im XML format weiterverwerten.
für kleine datensätze habe ich eine funktion geschrieben, die
je nach datenbank mit concat oder + einen string
zusammensetzt, also in etwa (ausm kopf):

[MS SQL]
CREATE FUNCTION GetXml() RETURNS VARCHAR(4000) AS
BEGIN
DECLARE @output AS VARCHAR(4000)
SELECT @output = @output + „“ + col1 +
„“ FROM table1
RETURN @output
END

natürlich scheitert diese funktion am 8000er limit des ms sql
servers und sowieso am 4000er limit von oracle. text und
varbinary typen können ja leider nicht in funktionen verwendet
werden. im moment frage ich daher ein recordset ab und füge
die einzelnen records in c++ zusammen, was allerdings je nach
datenbank bei mehreren tausend datensätzen einige sekunden
dauern kann.

-> frage: wäre es sinnvoll und performant, einen temporären
table mit einem text/ntext oder binary column zu erstellen,
den xml string hineinzuschreiben und danach auszulesen?

Hallo,

kaum. da du ja die werte erst selektieren mußt. Evtl kannst du einen append nutzen:
update temp_table set grossertext = grossertext || etwaskleinertext where usw.
Das müsste gehen.

  1. Warum nutzt du keine externe Funktion? Die müsste das können.
  2. Kann die DB das nicht mit der eingebauten XML-Funktionalität?

2.) eine website greift über mehrere seiten auf eine
relationale datenbank zu. änderungen in einem datensatz
sollten erst bei betätigen eines „speichern“-buttons
gespeichert werden. mir hätte da gefallen, eine transaktion zu
starten, alle änderungen zu machen und beim klick auf
„speichern“ die transaktion zu bestätigen (bzw rollback bei
nichtspeichern).

-> problem: die website kann in der zwischenzeit nicht
weiter auf die daten zugreifen. gibt es dafür irgendeine
lösung in SQL oder muss ich die änderungen in meinem programm
zwischenlagern und erst am schluss an die DB schicken=

Transaktionen müssen kurz sein! Also solltest du lieber das Zwischenergebnis in eine Extratabelle speichern und bei OK die Daten übertragen. Dabei musst du natürlich selbst die Serialisierung beachten. EIn lost update ist hier vorprogrammiert sobald mehr als eine Person an dem datensatz arbeiten. Also musst du dir auch merken, wie die Daten vorher aussahen. Und du musst einen timeout mitnehmen.

Gruß

Peter

Auch hallo.

hallo, ich hätte zwei fragen an die experten:

1.) ich muss daten aus sql-servern (ich muss mehrere
unterstützen, zumindest mssql, oracle, postgres, mysql5+ und
andere gängige) auslesen und im XML format weiterverwerten.

Wenn man nicht gerade SQL verwenden will, kann man z.B. auch eine GUI nutzen. Wie z.B. PHPMYAdmin (MySQL) oder DBDesigner.
(Achtung, kommerzielle Werbung)Das demnächst erscheinende Magazin unter http://www.dotnet-magazin.de/sqlserver/ scheint sich wohl auch mit diesem Problem zu befassen :wink:

HTH
mfg M.L.

Wenn man nicht gerade SQL verwenden will, kann man z.B. auch
eine GUI nutzen. Wie z.B. PHPMYAdmin (MySQL) oder DBDesigner.

ich will aber sql verwenden. wenn’s in sql nicht geht muss ich’s eben selber schreiben. nur wär’s eben fein gewesen, wenn es irgendeinen sql trick geben würde mit dem das möglich wäre, dann bräuchte ich es nicht selber zu coden.

kaum. da du ja die werte erst selektieren mußt. Evtl kannst du
einen append nutzen:
update temp_table set grossertext = grossertext ||
etwaskleinertext where usw.
Das müsste gehen.

ich werd das mal ausprobieren.

  1. Warum nutzt du keine externe Funktion? Die müsste das
    können.

ja, mit externen funktionen kann ich das natürlich ganz einfach machen, ich muss nur herausfinden was im endeffekt performanter ist.

  1. Kann die DB das nicht mit der eingebauten
    XML-Funktionalität?

gibt’s so viel ich weiss nur bei mssql und das nicht unbedingt in der form wie ich es will.

Transaktionen müssen kurz sein! Also solltest du lieber das
Zwischenergebnis in eine Extratabelle speichern und bei OK die
Daten übertragen. Dabei musst du natürlich selbst die
Serialisierung beachten. EIn lost update ist hier
vorprogrammiert sobald mehr als eine Person an dem datensatz
arbeiten. Also musst du dir auch merken, wie die Daten vorher
aussahen. Und du musst einen timeout mitnehmen.

dann hat sich mein verdacht bestätigt und ich werde die daten wohl doch selber verwalten müssen. naja…

vielen dank für den input.