Re: INSERT INTO
- From: "MoroIvan" <ivan.moro@xxxxxx>
- Date: Wed, 8 Apr 2009 22:51:17 +0200
Hallo Ivan,
hi elmar,
ich verwende die sqlce (sdf) datenbanken, da sie am einfachsten
handhabbar
sind und in meinen lan-anwendungen vollkommen ausreichen.
Vorab: SQL Server Compact ist zwar mit dem SQL Dialekt SQL Server
weitgehend kompatible unterstützt aber nur einen kleineren Teil.
Was vor allem darin begründet ist, das es für mobilen Rechner
mit geringen Ressourcen konzipiert wurde.
das reicht mir. ich mache fast nur software für lokale netzwerke (vorwiegend
arztpraxen), die ohnehin besser nach aussen abgeschottet sein sollten und im
lan alles erlaubt haben sollten.
Was für Dich aber auch Abstriche bedeuten kann.
Wenn Du Dein Anwendungsbereich vornehmlich Windows-/Netzwerkanwendungen
sind solltest Du Dir auch SQL Server 2008 Express anschauen.
Das ist kostenlos und bietet einen größeren Umfang.
habe ich. die definitive entscheidung ist noch nicht gefallen, aber mir
gefällt sqlce, weil es so einfach ist (zu sein scheint).
vorbemerkung:
der direkte import der daten aus paradox-tabellen in sdf funktioniert
nicht richtig (bei mdb auch nicht).
Microsoft Access / Jet unterstützt max. Version 5.0:
Was an an der geringen Bedeutung von Paradox in den letzten
Jahren liegen dürfte (ich kenne es auch nur aus DOS Zeiten).
weiss ich. ist 2001 "gestorben", läuft aber bisher sehr gut (auch unter win
7) und ist bisher fast unerreicht in den desktop
datenbank-entwicklungsmöglichkeiten. da alles irgendwann ein ende hat, wenn
es nicht supported wird, ist für mich zeit, auf neue entwicklungsumgebung
umzusteigen (vs c#).
im gewissen sinne ist paradox ähnlich .net, nur optimiert für datenbanken
(d.h. mit WESENTLICH weniger aufwand kann man das selbe erreichen). wäre
nicht schlecht, wenn man sich dort einige goodies abschauen würde.
z.b. werden die blob felder nicht übernommen.
hat jemand eine idee, woran es liegt (wie man es richtig macht)?
Eine Unterstützung für neuere Paradox Versionen wird Du wenn
überhaupt nur über die BDE bekommen, da das Programm aus
gleichem Hause kam.
alles installiert, dennoch ein problem.
Da ich genügend Paradox Know-How Deinerseits vermute:
Ggf exportiere die Blob Daten als Dateien und füge diese
in die Tabellen nachträglich ein.
auf die idee bin ich auch schon gekommen, da ich aber etwa 800.000 dateien
ersetzen muss (bei allen anwendern), ist es happig, für jeden blob eintrag
eine datei zu erstellen (das geht in die millionen dateien). aber
anscheinend bleibt mir nichts anderes übrig.
die weiteren fragen:
in paradox gibt es viele sehr nützliche methoden wie add, subtract,
... die ich mir jetzt programmieren will.
add(string quelle, string ziel, bool anhängen, bool aktualisieren)
subtract(string quelle, string ziel)
Auch wenn es im ersten Moment vertrauter erscheint, rate ich Dir:
Setzte Dich zunächst mit .NET näher auseinander.
ich könnte darauf schnell antworten:
habe ich - und nun?
ich finde meine lösung dennoch sehr gut. kurze beschreibung der vorteile:
- ich erstelle für jede tabelle eine eigene datenbank (klingt absurd).
- jedes formular ist eine dll.
- jeder report (bin noch nicht sehr bewandert) wird eine datei, etc...
danach habe ich eine einfache anwendung, welche eine anwendungsspezifische
start.dll öffnet (hauptmenü). in diesem kann der user klicken, was er machen
will, danach öffnet sich die dll mit dem gewählten formular, wo man klickt,
was man will, ...
etwa so (entwurf):
Form f;
string formular = "start";
do
{
// die dll liefert einen rückgabestring, der das folgeformular angibt
// details hier ohne bedeutung (nur entwurf)
f.open(formular + ".dll");
f.ShowAsDialog();
formular = rückgabewert steht in einer static class;
} while (formular != "quit");
dies ist mit reflections bereits programmiert und funktioniert sehr gut.
somit eine endlosschleife, die nacheinander formulare öffnet, je nach dem,
was der anwender auswählt (anklickt).
dies bedeutet:
ich kann beliebige anwendungen zusammenstellen.
etwa so:
- jede arztpraxis bekommt das selbe grundgerüst (wartezimmer,
patientenverwaltung, backup, ...)
- jede arztgruppe bekommt eigene formulare (orthopäden andere als
psychiater, ...)
- jeder kann sich spezialanfertigung erstellen lassen (z.b. eigenes
rechnungsformular)
d.h. ich stelle nur die betreffenden dlls, berichte, etc. zusammen, welche
auf bestimmte datenbanken zugreifen. fertig ist die anwendung.
will jemand eine spezialanfertigung, so wird nur die eine dll, bericht,
datenbank, ... ersetzt (über e-mail update) - der rest bleibt gleich.
somit gibt es jede menge "spezialanfertigungen", wo z.b. nur ein formular
(dll) ausgetauscht wurde.
zu der "absurden" datenbanklösung:
jede arztgruppe benötigt eigene daten (diagnosen, tarife, ...). diese ädern
sich manchmal mehrmals jährlich. d.h. ich muss eine möglichkeit haben, die
daten für die aktualisierung zu senden (eine datenbank mit aktuellen
änderungen). diese werden von einer update-routine ausgelesen und die
jeweiligen tabellen in den einzelnen datenbanken entsprechend aktualisiert.
d.h. es muss auf jeden fall von einer datenbank gelesen (updatedatenbank)
und in eine andere übertragen werden (anwenderdatenbank - egal ob diese aus
einer oder einhundert tabellen besteht). der vorteil einer tabelle in einer
datenbank ist aber die obige möglichkeit von spezialisierungen.
analog die formulare. die gesundheitsminister (vernunft sieht anders aus)
ändern von zeit zu zeit die anforderungen an irgendwelche untersuchung. ich
muss nur eine dll anpassen und auswechseln, statt der ganzen anwendungen mit
allen speziallösungen.
1) add
quelle: quelldatenbank + tabelle
ziel: zieldatenbank + tabelle
anhängen: neue datensätze sollen hinzugefügt werden
aktualisieren: bestehende datensätze aktualisieren (nur indizierte
tabellen)
Das ist etwas was Dir in .NET wenig nützt.
Solche Aufgabenstellungen erledigt z. B. ein DataAdapter
in Verbindung mit einer DataTable. Mehr dazu:
damit habe ich bereits 2 tage verbracht und keine gute lösung gefunden.
entwurf (keine exakte lösung):
1. lösung:
----------
con1 = öffne quelle-datenbank
con2 = öffne ziel-datenbank
adapter da1, da2
DataTable dt1, dt2
commandbuilder für dt2
da1.Fill(dt1)
da2.Fill(dt2)
dt2.Merge(dt1)
da2.Update(dt2)
daten aus dt1 werden nicht übernommen.
2. lösung:
----------
statt Merge wurden die records von dt1 mit foreach durchgelaufen und in dt2
hinzugefügt.
mit allen möglichen kleinigkeiten herumexperimentiert (SetModified(), ...)
wieder keine datenübernahme.
3. lösung (bin dabei):
---------------------
die records sollen spaltenweise in einen neuen record eingelesen (Ordinal,
ggf. ColumnName, ...)
vielleicht wird es eine lösung, aber alles sind objects und deshalb würde
ich bei der zuweisung entsprechende casting benötigen.
fazit: arrivederci einfache allgemeine lösung, da zu kompliziert (u.u. tue
ich mir die verallgemeinerung an [typen auslesen, ... es sind nur endlich
viele], wenn es nicht anders und einfacher geht).
4. not-lösung (angedacht):
--------------------------
dt1.WriteXml(); // export in xml
dt2.ReadXml(); // import aus xml
dabei wäre eine lösung:
INSERT INTO zieltabelle
SELECT quelltabelle-felder FROM quelltabelle
eine elegante angelegenheit. auf diese weise habe ich schon etliche andere
methoden erstellt (z.B. tabelle leeren, anzahl records, ...), so dass diese
mit einer zeile zu erledigen sind (wie in paradox gewohnt). etwa:
int n = nRecords(string sdfDatenbank, string Tabelle);
// gibt anzahl der tabellenrecords zurück.
SQL Server CE ist zudem für Datenbankübergreifende Verbindungen
nur wenig geeignet.
wieso?
Und schon mit SQL Server Express besteht bei 4GB Datenbankgröße
2 gb ist vollkommen ausreichend. durch die aufteilung auf viele datenbanken
mit einer tabelle reichen die 2 gb je tabelle aus.
ich glaube, die grösste bisherige tabelle hat in 10 jahren etwa die grösse
von etwa 50 mb erreicht (da ist luft nach oben). wären alle in einer
datenbank, so wären die 2 gb kritisch - zusätzliches kriterium gegen eine
datenbank.
(die Vollversionen können Terabytes verwalten) - und einer
fast belieben Anzahl von Datenbanken in einer Instanz keine
Notwendigkeit, Daten auf verschiedene Dateien zu verteilen,
wie es vielleicht für Paradox sinnvoll gewesen sein mag.
und seine vorteile bei der spezialisierung von anwendungen?
was nutzen mir terabytes, wenn ich für jede version andere tabellen
zusammenstellen muss? manche hat 10, andere 200, die nächste 5000 records,
.... so muss ich jeweils nur eine spezielle datenbank mit einer tabelle
auswechseln.
ganz abgesehen davon, dass ein "gau" bei einer datenbank nicht sofort die
ganze anwendung lahm legt (ggf. nur ein formular). die restlichen daten sind
von dem problem "unberührt".
jede münze hat 2 seiten (und einen rand).
Und so solltest Du Deine bisherigen Progammierparadigmen
auf Sinnhaltigkeit überprüfen.
ich bin zufrieden, wenn ich es einfach mit meinem konzept erledigen könnte
(d.h. wenn es gehen würde).
Gruß Elmar
grüezi wohl.
was mir jetzt noch eigefallen ist:
wie stelle ich fest, ob eine betimmte .net version installiert ist?
die Environment.Version liefert nicht die gewünschte information.
.
- Follow-Ups:
- Re: INSERT INTO
- From: Günter Prossliner
- Re: INSERT INTO
- From: Elmar Boye
- Re: INSERT INTO
- References:
- INSERT INTO
- From: MoroIvan
- Re: INSERT INTO
- From: Elmar Boye
- INSERT INTO
- Prev by Date: Probleme mit dem DateTime
- Next by Date: Re: Probleme mit dem DateTime
- Previous by thread: Re: INSERT INTO
- Next by thread: Re: INSERT INTO
- Index(es):
Relevant Pages
|