Hallo,
in der IDE per Designer geht es wie bei jedem anderen Control auch: Element auswählen, Eigenschaften-Fenster nach Ereignisse wechseln, Ereignis auswählen, Code hinzufügen.
Wie es per Code (ohne Designer) geht, steht in :rtfm: ToolStripButton-Klasse im Beispiel.
Wie du siehst, wird empfohlen, statt ToolBar mit **ToolStrip **zu arbeiten.
Gruß Jürgen
wie ich einer Zelle machen kann
Was für ein unverständlicher Satzbau... Und was du nur mit Zellen hast: Denkst du Monopoly: "Gehe in das Gefängnis..."? 8)
Bei Datenbanken spricht man von Zeilen, Spalten und einzelnen Werten. Deine Formulierung lässt mich befürchten, dass du zuerst an etwas wie das DataGridView denkst. Von dieser Denkweise solltest du dich schleunigst verabschieden: Wenn es dir um die Daten geht, dann befasse dich ausschließlich mit den Daten-Klassen; wenn es dir um das UI geht, dann darf etwas wie das DGV behandelt werden.
Zu deiner Frage siehe :rtfm: DataTable.ColumnChanged-Ereignis. Das Beispiel zeigt sehr schön, wie die einzelnen Werte von **DataColumnChangeEventArgs **abgefragt werden können.
Jürgen
Die Forumssuche nach update foreignkey* liefert mir ein paar Ergebnisse; vielleicht findest auch du nützliche Hinweise. Jürgen
Die entscheidende Information verschweigst du uns: Um welches Datenbanksystem handelt es sich? Denn der TableAdapter kann nur solche Informationen herausgeben, die er von der DB bekommt.
Wenn du die Diskussion im richtigen Unterforum Datentechnologien erstellt hättest, wärest du direkt auf die Frage nach dem DBMS hingewiesen worden. Beim MS-SQL Server hilft die Suche nach SELECT @@IDENTITY.
Was der TableAdapter ansonsten noch kann, weiß ich nicht, weil ich ihn nicht benutze. Gruß Jürgen
Für so etwas gibt es Ereignisse, auch bei DataTable. Jürgen
Diese Formulierung halte ich schon für ziemlich dreist:
... also bin ich halt "unhöflich".
Hast du die Erläuterung unter Wie poste ich richtig? Punkt 2.2 durchgelesen? Offensichtlich nicht, sonst würdest du dich wenigstens entschuldigen und ankündigen, dass du dich künftig "richtig" verhalten willst.
Jürgen
Hallo,
du solltest dir vor allem abgewöhnen, Daten direkt ins DataGridView zu schreiben. Daten gehören in Daten-Klassen, z.B. eine DataTable; das DGV dient "nur" dazu, diese Daten dem UI zur Verfügung zu stellen.
Dann hast du nämlich auch keine Probleme, die Daten an Excel zu übergeben; das geht mit einer OledbConnection, die sich die Daten aus der DataTable holt.
Jürgen
zu 1. Das sinnvollste Verfahren wäre eine DataGridViewNumericColumn. Wie bei einer ComboBoxColumn wird dabei ein NumericUpDown eingebettet. Wie das zu realisieren ist, steht in :rtfm: Gewusst wie: Hosten von Steuerelementen für eine CalenderColumn oder in den Snippets für MaskedTextBox in einer DataGridViewColumn oder DateTimePickerColumn im DataGridView
zu 2. Im Moment fällt mir nichts Passendes ein.
Gruß Jürgen
Hallo,
informiere dich mal über :rtfm: ConfigurationSectionGroup; das entspricht einer ini-Section am ehesten. Da eine config-Datei aber beliebig verschachtelt sein kann, hat man überhaupt keine Probleme, Einstellungen zu speichern. Im Gegenteil: Die config-Dateien sind erheblich flexibler, siehe z.B. den Hinweis:
Eine ConfigurationSectionGroup kann auch andere ConfigurationSectionGroup-Objekte enthalten, auf die über die SectionGroups-Eigenschaft zugegriffen werden kann.
Gruß Jürgen
Hallo,
zum Compact Server gehören die Klassen aus dem System.Data.SqlServerCe Namespace; wie sie heißen, sagt Khalid. Wenn man den falschen DbProvider nimmt, gibt es eher kryptische Fehlermeldungen.
Gruß Jürgen
Wir haben vor einigen Tagen einen :::
Hast du dich hier verschrieben?
Hast du den NET-OdbcProvider versucht, wie unter ConnectionStrings beschrieben?
Gruß Jürgen
Den entscheidenden Hinweis hat Jack gegeben. Ich möchte noch auf zwei andere wesentliche Punkte hinweisen, die mit dem Problem selbst nichts, aber mit der Anwendung insgesamt viel zu tun haben.
Statt Convert.ToDecimal solltest du besser Decimal.TryParse verwenden. Was passiert bei dir denn, wenn der Anwender etwas Unzulässiges eingegeben hat?
Die Art, wie du Update eingebaut hast, lässt mich vermuten, dass du einen schon existierenden DataAdapter benutzt, zu dem eine Connection dauerhaft geöffnet ist. Das wäre ziemlich ungünstig, siehe z.B. [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
Gruß Jürgen
Siehe :rtfm: Environment.SpecialFolder-Enumeration.
Entschuldige, da war ich mir so sicher, dass ich meine Antwort nicht kontrolliert habe. Aber von Daniel kam ja jetzt die richtige Lösung.
Jürgen
Hallo Da_Flo,
nein, Bernd meint den DataRowState von DataTable.Rows[n].
Aber ich kann überhaupt nicht erkennen, wie die Daten aus dem DataAdapter in das DataGridView und zurück kommen. Werden die Daten etwa direkt ins DGV gefüllt? Das wäre ziemlich unüblich (um nicht zu sagen Quatsch, gefährlich, abwegig).
Du verschweigst uns noch, welche Spalte für den PrimaryKey benutzt wird. Das ist nach der Fehlermeldung eine äußerst wichtige Information.
Sollte es _Artikel _sein? Bei deinem INSERT-Befehl benutzt du eine Variante, bei der alle Spalten befüllt werden sollen. Woher kommt der Wert für "Artikel"?
Außerdem ist es eher widersinnig, bei manchen Spalten Parameter zu verwenden und bei anderen nicht. Ausgerechnet die Kontaktnummer (was nach Zahl aussieht) wird in Hochkommata gesetzt. 8o
Du solltest alles nochmals gemäß [Artikelserie] Parameter von SQL Befehlen überprüfen.
Jürgen
Ayke hat auf einen wichtigen Punkt hingewiesen. Es wundert mich, dass der Compiler das akzeptiert.
Aber laut Fehlermeldung stößt er sich an der nächsten Situation: Im if-Zweig gibt es eine Zuweisung, im else if-Zweig ebenfalls. Aber im dazu gehörenden letzten else-Zweig fehlt sie. Das ist vermutlich der Grund dafür, dass der Compiler glaubt, dass der Variablen noch nichts zugewiesen wurde.
In einer solchen Situation sollte die Anfangszuweisung auf **null **gesetzt werden. Dann weiß der Compiler auf jeden Fall Bescheid.
Nachtrag:
Es ist eine Zeichenfolge von Zahlen getrennt mit ","! z.b. so: 22, 13,621,15,34, usw..
Nein, dein Hinweis passt nicht zur Situation. Wo wird dieser String benutzt? Genaue Angaben bitte!
string[] strTaskIDArray = new String;
Das erzeugt einen neuen String (ohne jede Zusatzinformation) und weist diesen einem String-Array zu. Wie soll das funktionieren?
Übrigens werden Strings nicht auf Gleichheit mit einem leeren String geprüft, sondern mit String.IsNullOrEmpty
.
Gruß Jürgen
Hallo,
diese Situation deutet auf schlechtes Datenbank-Design hin. Eine Spalte, die den PK darstellt, sollte in aller Regel keine andere Bedeutung haben. Dem widerspricht es, wenn die Art der Reihenfolge eine Rolle spielt.
Grundsätzlich kann mit **COLLATE **die Sortierung auch bei jeder Abfrage eingestellt werden, z.B.:
ORDER BY <Spalte> COLLATE <Collation-Name>
Ob Access das unterstützt und ggf. mit welchen Begriffen, musst du selbst recherchieren. (Die MSDN streikt im Moment.)
Gruß Jürgen
Dort, wo du DataGridView.DataSource festgelegt hast.
Es ist meistens Quatsch, ein DataSet im Zusammenhang mit dem DataAdapter zu deklarieren. Das DataSet ist ein Objekt, dessen Struktur schon beim Form-Load o.ä. erstellt und zugewiesen wird. Durch den DataAdapter erhält es nur noch Inhalte.
Beim Speichern, d.h. bei DataAdapter.Update, wird einfach der Verweis auf das einmalig erstellte DataSet bzw. die jeweils relevante DataTable genommen.
Jürgen
PS. Der Hinweis auf "falscher Post" besagt: Im Debugger kannst du selbst feststellen, welches DataSet (Name, Inhalt) jeweils benutzt wird. Wenn du das nicht merkst, hast du den Debugger nicht (bzw. nicht ausreichend) benutzt.
gibt es dafür bestimmte operationen / einstellungen die ich double.parse mitgeben kann?
Wie gfoidl schon sagte:
Eigentlich steht alles in der Referenz zu Double.Parse
Du musst nur daran denken, dass es nicht nur eine Version gibt, sondern mehrere Überladungen. Jürgen
Ich meinte gelesen zu haben, dass es Transactions in Access nicht gibt. Jürgen
Verbesserungsvorschlag: Benutze File.ReadAllLines; dann stehen alle Zeilen für sich in einem Array und du sparst dir das Fummeln mit einzelnen Zeilen, Zeilenumbruch usw. Damit wird vieles einfacher und vermeidet Fehler.
Außerdem:
ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.
Jürgen
Hallo,
ich habe folgende Gedanken:
Ist es möglich, den Primärschlüssel zu deaktivieren? Dann könntest du das machen, die Datensätze ändern und dann den Primärschlüssel wieder zu aktivieren.
Nach dem Fill werden die Datensätze in der DB gelöscht; mit Update sollen sie wieder eingefügt werden. Dann musst du natürlich auf den **DataRowState **achten.
Dass das Ganze sehr lange dauert, ist mit **Transaction **wesentlich zu verbessern. Ich habe nicht bedacht, dass es um Access geht.
wird es mit den ständigen Updates
Das ist doch wohl trotzdem eine einmalige Aktion, oder?
Gruß Jürgen
Das geht mit den "normalen" Verfahren von [FAQ] Kommunikation von 2 Forms: Du weißt doch, von wo aus dein LoadingForm erzeugt und angezeigt wird; von dort aus kannst du es auch schließen.
Jürgen
Der Nutzer schreibt die Daten ja direkt ins DGV. Wird das an die Daten-Tabelle weiter gegeben? Bzw kann man das abgleichen?
Du solltest dich mal mit den Grundsätzen der Datenverarbeitung unter NET befassen. Kurz gesagt, gehören Daten in Daten-Klassen, z.B. DataTable, und nicht in GUI-Klassen wie das DGV. Der "Abgleich" geschieht durch die Datenbindung weitestgehend automatisch; allenfalls ist ein EndEdit nötig, damit auch die letzten Änderungen im aktuellen Datensatz übernommen werden.
Jürgen
Hallo,
warum es bei dir nicht klappt, kann ich nicht sagen und will es auch nicht nachprüfen. Mich wundert aber, warum du es nicht viel einfacher machst:
"+=" bei Strings ist gelinde gesagt suboptimal, weil ein String unveränderlich ist. Bei dieser Operation wird der String ständig (bei dir also für jedes einzelne Zeichen) umkopiert. Wenn überhaupt, sollte **StringBuilder **verwendet werden.
Für diesen Zweck gibt es aber String.Replace.
Die Zeilenumbrüche sind einfacher durch Environment.Newline oder einzeln durch '\r' sowie '\n' zu erkennen; das ständige Vergleichen per String.Format als Hex-Darstellung - ich weiß ja nicht.
Zum Speichern gibt es die einfache Variante File.WriteAllText, wie auch herbivore sagt.
Gruß Jürgen
Für diesen Zweck ist die **BindingSource **vorgesehen: Gib ihr die DataTable als Quelle und hänge sie als DataSource sowohl an das DataGridView als auch an die TextBox. Sie berücksichtigt automatisch den Zeilenwechsel; lediglich vor dem Update Richtung Datenbank ist BindingSource.EndEdit einzufügen.
Gruß Jürgen
Seltsamerweise heißt die passende Methode weder Copy noch Clone, sondern ImportRow. Aber auf den PK musst du aufpassen.
Dein Versuch klappt auch deshalb nicht, weil "newRow" nur "neu" heißt, aber tatsächlich keine neue Zeile erzeugt.
Jürgen
Muss ich evtl der BindingSource mitteilen dass sich der Eintrag geändert hat?
Wenn du schon selbst diese Idee hast, dann schau in :rtfm: **BindingSource **nach; dort gibt es eine Methode, die genau dieses Problem regelt:
Wendet ausstehende Änderungen auf die zugrunde liegende Datenquelle an.
(Na gut, über die Formulierung "wendet an" könnte man streiten.) Hintergrund ist, dass eine "manuelle" Änderung erst dann automatisch übernommen wird, wenn der Datensatz gewechselt wird; wenn das nicht sowieso möglich ist, ist die o.g. Methode zu verwenden.
Wenn ich jedoch nun TableAdapter.Update(mydataset), oder TableAdapter.Update(mydataset.mytable) aufrufe, bleibt die Datenbank unberührt.
Die Methode liefert mir auch immer 0 zurück (Schätze das ist die Anzahl der geänderten Datensätze?)
Bei :rtfm: DbDataAdapter.Update findest du das als Erklärung des Rückgabewertes; das TableAdapter.Update "versteckt" das nur.
Zum Rest kann ich nichts sagen, weil ich weder mit TableAdapter noch mit Access arbeite. Jürgen
Bitte lies zunächst einmal [Artikelserie] Parameter von SQL Befehlen durch, damit du verstehst, worum es geht. Du sollst nicht irgendeinen Code per Copy & Paste übernehmen, sondern es richtig lernen.
DateTime myDate = DateTime.Today.AddHours(10);
MYSQL_Command.Parameters.AddWithValue("Datum", myDate);
Kontrolliere in dem Artikel, wie bei Deinem MySql-Provider Parameter einzufügen sind: Fragezeichen, Doppelpunkt, Klammeraffe.
Auch beim INSERT-Befehl ist genauso mit Parametern zu arbeiten.
Gleichheit bei DateTime zu prüfen ist riskant. Du musst bereits bei den Werten, die gespeichert werden, genau darauf achten, ob sich nicht vielleicht Sekunden und Bruchteile einschleichen.
Außerdem machst du den Grundfehler, eine DbConnection dauerhaft zu verwenden. Siehe dazu [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen.
Gruß Jürgen
Ebenfalls sollten Tabellen immer im Plural geschrieben werden, da eine Tabelle ja mehrere Daten enthält.
Das lese ich aber sehr oft genau andersherum: Der Tabellenname sollte immer im Singular geschrieben werden; denn es ist einfacher, von einem "User" zu sprechen statt von einem "Datensatz aus Users".
Wobei man auf jeden Fall vermeiden sollte, reservierte Wörter wie USER als Tabellen- oder Spaltennamen zu verwenden.
Gruß Jürgen
Access to external file "file.txt" is denied by server administrator
Das sieht doch nach einem einfachen Zugriffsfehler ist. Du brauchst natürlich Schreibrechte in dem entsprechenden Verzeichnis; wenn das nicht angegeben ist, wird das aktuelle Arbeitsverzeichnis genommen, und was das gerade ist, kann meistens gewürfelt werden.
Muss ich meine Datensätze auf 10 bzw. 20 zeichen auffülllen?
Ich sage doch schon vorher: feste Feldlängen.
Jürgen
Hallo und willkommen!
Ich habe den Eindruck, du musst dir die Hinweise unter :rtfm: DataSet.Merge noch genauer durchlesen. Dort wird auch auf **DataRowState **eingegangen; **GetChanges **wird am Anfang vor dem Merge verwendet.
Zur detaillierten Untersuchung wäre es praktischer, erst einmal eine einzelne DataTable zu mischen und zu vergleichen. Dann wird dir vermutlich klarer, wie vorzugehen ist.
Gruß Jürgen
juetho, kannst du mir evtl sagen wie man tricksen kann? Oder wo man darüber etwas lesen kann?
Ich habe diese Kenntnis aus einem alten Buch von Andreas Kosch "Interbase-Datenbankentwicklung mit Delphi". Die FB-ReleaseNotes enthalten nichts dazu; also gelten die alten Interbase-Anleitungen wie DataDef.pdf weiter.
CREATE TABLE EXT_TBL EXTERNAL FILE 'file.txt'
(FNAME CHAR(10),
LNAME CHAR(20),
HDATE CHAR(8),
NEWLINE CHAR(2));
CR/LF ist wie eine Spalte NEWLINE zu verarbeiten, unter Windows also mit 2 Bytes.
Aber ein SQL-Dump ist das natürlich nicht, nur eine Notlösung. Jürgen
Gibt es bei Frebird keine Möglichkeit, ein CSV Datei zu importieren?
Leider nicht. Mit CREATE TABLE ... EXTERNAL FILE kann nur auf feste Feldlängen zugegriffen werden; und für CR/LF muss getrickst werden.
Jürgen
Hallo,
dein Hauptfehler ist, dass der Datensatz in der Datenbank gelöscht wird, in der Datenmenge, die hinter der BindingSource steckt (vermutlich DataTable), aber noch enthalten ist. Du musst umgekehrt vorgehen:
* zuerst den Datensatz in der Datenmenge löschen; das aktualisiert die BindingSource automatisch
* dann die Datenmenge als Ganzes mit den Änderungen speichern
Zum ersten Punkt gibt es DataTable.Delete. Achtung: DataTable.Remove ist falsch! Es gibt außerdem BindingSource.RemoveCurrent; ich weiß aber nicht, ob das in der DataTable als Delete oder als Remove ausgeführt wird (wahrscheinlicher ist wegen der Namen Remove).
Zum zweiten Punkt ist DataAdapter.Update besser als einzelne Execute-Befehle.
Weitere Kritikpunkte: ExecuteScalar könnte funktionieren. Aber gedacht ist für einen solchen SQL-Befehl ExecuteNonQuery. Die ID als Text in den String einzubauen und dann auch noch mit Hochkommata zu verbinden (das ist doch sicher eine Zahl), ist höchstgefährlich. Siehe [Artikelserie] Parameter von SQL Befehlen
Gruß Jürgen
Hallo,
ich kann mir nicht vorstellen, dass das möglich ist. Ein FK bezieht sich immer auf den PK einer Tabelle. Siehe FOREIGN KEY-Einschränkungen (Hervorhebung von mir):
In einem Fremdschlüsselverweis wird zwischen zwei Tabellen eine Verknüpfung erstellt, wenn eine Spalte bzw. mehrere Spalten einer Tabelle auf die Spalte bzw. Spalten mit dem :::
Vielleicht geht es über eine Zwischentabelle, die nur die Werte aus Tabelle B.Feld2 enthält, aber ob das sinnvoll ist?
Jürgen
wie kann ich nun die for-schleife in den konstrukor packen, dass er dies jedes mal automatisch tut....
Welchen Konstruktor meinst du? Den deiner Klasse? Das kann doch nicht gehen, weil du dann innerhalb der Klasse einen Verweis auf ein Array von mehreren Instanzen von sich selbst benutzen willst.
Oder einen Konstruktor (z.B. ein Formular oder ein "Datenmodul") für eine Klasse, die mit einem Array solcher Objekte arbeiten soll? Dann pack es doch einfach dort hinein.
bei string[] usw geht es ja auch...
Was und wo geht mit einem String-Array? Auch ein solches muss irgendwo definiert werden. Hast du schon einmal versucht, innerhalb der String-Klasse ein String-Array einzubetten? Oder was meinst du damit?
Nebenbei: List<T> ist im Zweifelsfall praktischer als ein Array.
Jürgen
Hallo,
schon dein SELECT-String sieht mysteriös aus durch das eingebaue char() und ToString. Das bringt vielleicht auch den Update-Befehl durcheinander. Mach es konsequent wie in [Artikelserie] Parameter von SQL Befehlen beschrieben.
Fehlende Erläuterungen sind außerdem: Was für ein Datentyp ist "note"? Sind das wirklich Zahlen oder Texte? Außerdem habe ich über die Forumssuche einen Link zu reservierten Wörtern in Access 2000 gefunden.
Jürgen
Hallo,
die Regeln für Select werden in :rtfm: DataColumn.Expression beschrieben. Einen Hinweis auf dein Problem habe ich auf die Schnelle allerdings auch nicht gefunden.
Gruß Jürgen
Hallo,
mit RIGHT erhältst du die letzten n Zeichen des Quelltextes, nicht alle Zeichen ab Position n. Du musst deshalb noch LENGTH berücksichtigen.
Aber sinnvoller ist es sowieso, die Spalten aufzuteilen - warum, ist ja offensichtlich.
Gruß Jürgen
FZelle hat die beiden wichtigsten Punkte genannt, siehe auch [Artikelserie] Parameter von SQL Befehlen mit Hinweisen auf das richtige Verfahren in Schleifen.
Ich möchte FZelle noch ergänzen. An drei Stellen vermischst du Befehle. Bei deiner Variante übergibst du durch AddWithValue einen Wert vom Typ DbType und weist diesem Parameter einen String zu. Das kann nur schief gehen.
// falsch
SCC.Parameters.AddWithValue("VK", SqlDbType.Money).Value = values[7];
// richtig eher so:
SCC.Parameters.Add("VK", SqlDbType.Money).Value = values[7] as decimal;
Aber dazu muss natürlich korrekt konvertiert werden. Das würdest du mit korrekter Wertübergabe (statt String.Split) automatisch erreichen.
Gruß Jürgen
(Falls es tatsächlich MySql ist, möchte ich nochmals den Vorschlag mit RegEx einbringen. Dazu gibt es für die WHERE-Klausel den REGEXP-Parameter, siehe String-Vergleichsfunktionen. Je nachdem, wie komplex der String ist und wie viele Bestandteile auszuwerten ist, könnte das trotz aller bisherigen Anmerkungen sinnvoll sein.){gray}
Aber wichtiger ist natürlich, die Datenstruktur sinnvoll zu ändern. Jürgen
Ich habe nicht gesehen, welches DBMS du verwendest (SQL ist kein System, sondern eine Sprache - 'L'=Language). Vielleicht kann es etwas mit RegEx anfangen; dann dürftest du besser vorankommen.
Jürgen
Etwas genauer:
- Darf man dem Between-Ausdruck eigentlich nur Ganzzahlen übergeben?
Es gilt für alles, was man per größer/kleiner vergleichen kann: alle Zahlen, Zeichenketten, Datums-/Zeitwerte. BETWEEN AND ist eine Kurzschreibweise für "ist größer/gleich AND ist kleiner/gleich".
Wenn dein Feldinhalt wirklich so aussieht, kann das nur nach String-Regeln verglichen werden.
Ich weiß, die Einträge sind nicht sonderlich "freundlich"
Das ist nicht nur euphemistisch ausgedrückt. Eine solche Spalte würde sämtlichen Normalisierungsregeln widersprechen.
Jürgen
Hallo,
das hängt vor allem davon ab, was du damit machen willst. Es geht z.B. über Rows[Rows.Count-1] oder über BindingSource.MoveLast. Du musst aber bedenken, dass die Zeilen grundsätzlich unsortiert in der DataTable stehen (genauer: so, wie du sie geladen hast).
Gruß Jürgen
Bei der DockPanelSuite scheint leider kein Quellcode dabei zu sein, ...
Unter Files gibt es auch die Quelldateien zum Download.
Aber die DockPanelSuite geht über die Toolbox weit hinaus. Deshalb hätte ich sie nicht vorgeschlagen, sondern ebenso auf CodeProject verwiesen.
Gruß Jürgen
Hallo,
für solche Wünsche ist CodeProject immer eine gute Adresse. Außerdem geht es auch mit "Bordmitteln" des Framework, siehe ConnectionStrings mit einer Schema.Ini.
Gruß Jürgen
Ich möchte herbivores Aufstellung unterstreichen.
Als Berliner war man auch früher (ich meine: als Wessi zur Mauerzeit) in einer besonderen Situation: 2 große, hervorragend ausgestattete Unis, 2 landesweite Bibliotheken (Amerika-Gedenkbibliothek AGB und Staatsbibliothek Stabi), dazu viele Stadtbibliotheken in den Stadtteilen, viele Buchhandlungen usw. Da war es sicher leichter als anderswo, an Informationen heranzukommen.
Übrigens habe ich in den 70er Jahren studiert, als ein Computer vom "Anwender" noch mit Lochkarten gefüttert wurde und man das Arbeitsergebnis erst am nächsten Tag beim Rechenzentrum abholen konnte. (Um Missverständnissen vorzubeugen: Ich bin erst nach der Bundeswehr zum Studium nach Berlin gegangen. Und es galt schon damals: Wer seit vier Wochen in Berlin wohnt und sich wohl fühlt, darf sich als Berliner bezeichnen.
Gruß Jürgen
Kleine Ergänzung: Das ConnectionPooling sorgt dafür, dass der zweite, dritte usw. Zugriff (genauer: das Connection.Open) erheblich schneller gehen als der erste. Jürgen
//sprachlicher Fehler beseitigt