Hi bb1898,
ich möchte die ganze Datei (.pdf) in ein feld der Datenbank speichern und später wieder auslesen.
Die Tabelle hat 5 Spalten (Index(Number), Dokument(Blob), DokumentName(Varchar), Dok_Endung(Varchar), Uploaddatum(Date)). Die .pdf soll im Feld Dokument als Blob gespeichert werden.
den DokumentNamen und Endung hole ich mit split aus dem pfad(FileUpload Control - ASP.NET)
bisher kann ich alles in der Datenbank speichern nur das Dokument selber nicht. Ich denke dass ich da mit Streamwriter arbeiten muss - aber sicher bin ich mir da nicht.
Und wie ich das dann in einen SQL String bringen soll ist mir auch nicht klar.
Es wäre super wenn du mir da weiterhelfen könntest.
Tina
Ich selber kenne mich da leider überhaupt nicht aus (und mit Oracle schon dreimal nicht), weiß aber, dass das Thema in Datenbank-Newsgroups und Foren viel behandelt wird. Oft geht's da zwar um Bilddateien, aber das müsste m.E. egal sein.
In der Dokumentation zum .NET Framework ( :rtfm: ) scheinen mir diese beiden Themen einschlägig:
Arbeiten mit großen Werttypen
Schreiben von BLOB-Werten in eine Datenquelle
Das musst Du für Oracle vermutlich umstricken, aber da sollte ja wohl hoffentlich die Oracle-Dokumentation weiterhelfen. Es gibt im übrigen in der .NET-Dokumentation auch Informationen zum Oracle-Datenprovider.
Hier im Forum habe ich mal eben mit "Blob" gesucht und u.a. dies hier gefunden:
[Gelöst] Dateien in SQL speichern
Der Thread verweist weiter auf diesen hier, der vielleicht auch hilft:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=684543&SiteID=1
Und schließlich noch eine allgemeine Diskussion über das Für und Wider des Speicherns ganzer Dateien in Datenbankfeldern:
Wie speichert Ihr komplexe Datenstrukturen?
Hoffe, etwas davon hilft weiter.
Gruß,
Hertha
Hallo zusammen,
ich versuche schon seit Tagen eine .pdf / .doc datei per SQL (ADO.NET 2.0) in die Datenbank zu schreiben. Leider funktioniert das überhaupt nicht. Den Pfad zur Datei bekomme ich über das FileUpload Control (ASP.NET).
So, wie sie dasteht, ist Deine Fragestellung nicht eindeutig. Mir fallen erst mal zwei Möglichkeiten ein, was Du vielleicht möchtest:
Der Inhalt der Datei soll als Ganzes in ein bestimmtes Feld einer Tabelle in der Datenbank.
Die Datei enthält Text, der sich als eine Menge von Datensätzen für eine oder auch für mehrere Tabellen der Datenbank interpretieren lässt, und er soll entsprechend auseinandergenommen und stückchenweise in die Tabellenfelder bugsiert werden.
Trifft eine dieser beiden Varianten Dein Problem wenigstens annähernd, oder geht es eigentlich um etwas ganz anderes?
Kann eine Listbox nicht als Datenquelle dienen?
Ja, es ist halt vorteilhaft, zwischen Daten (Model) und Daten-Anzeige (View) zu unterscheiden.
Eine Listbox, als DatenQuell verwendbar wäre, liefe dem Konzept von Trennung von View und Model extrem zuwider.
Das ist allerdings wahr.
Und was mich auch wundert: die MessageBox, die in BsZahltypCurrentChanged gezeigt werden soll, erscheint nie. Dieses Ereignis scheint also nicht ausgelöst zu werden, wenn in der Listbox ein anderer Eintrag gewählt wird. Obwohl die Textbox jetzt immer den richtigen Eintrag anzeigt.
Da ist was an deim Code faul (fehlt die Handler-Zuweisung?) - normal wird das natürlich gefeuert.
Da hat tatsächlich die Handler-Zuweisung gefehlt und jetzt kommt die Nachricht. Wie die Zuweisung allerdings verschwunden ist, ist mir unklar, ursprünglich war sie vorhanden. Ich habe da ziemlich hin und her probiert, aber nie explizit und von mir aus diese Zuweisung entfernt (sie stand und steht im Designer-Teil des Codes).
Jedenfalls läuft das jetzt alles zur Zufriedenheit, ich kann weiter experimentieren und habe wieder ein bisschen was begriffen.
Danke an alle Helfer,
Hertha
Das funktioniert, danke. Aber warum geht es nicht auch anders herum? Kann eine Listbox nicht als Datenquelle dienen?
Und was mich auch wundert: die MessageBox, die in BsZahltypCurrentChanged gezeigt werden soll, erscheint nie. Dieses Ereignis scheint also nicht ausgelöst zu werden, wenn in der Listbox ein anderer Eintrag gewählt wird. Obwohl die Textbox jetzt immer den richtigen Eintrag anzeigt.
Gruß,
Hertha
Folgendes bekomme ich nicht hin (.NET 2.0, C#, SharpDevelop 2.2.1):
Das Formular enthält eine Listbox, deren Einträge im Designer fest eingetragen werden, und eine Textbox. Die Textbox soll den in der Listbox ausgewählten Eintrag anzeigen (wenig aufregend, vorbereitendes Ausprobieren für ein anderes Problem).
Das klingt eigentlich sehr simpel, ich kriege es aber nicht hin. Ich habe eine BindingSource auf dem Formular und wundere mich schon von Anfang an, warum ich dieser BindingSource nicht schon im Designer die Listbox als Datenquelle zuweisen kann. Kann mir das jemand sagen?
Statt dessen habe ich also folgenden Code (bsZahltyp ist die BindingSource, lbTypen die Listbox):
// Nur als Test
void BsZahltypCurrentChanged(object sender, EventArgs e)
{
MessageBox.Show(String.Format("aktuell: {0}", bsZahltyp.Current));
}
void MainFormLoad(object sender, EventArgs e)
{
lbTypen.SetSelected(0, true);
bsZahltyp.DataMember = "SelectedItem";
bsZahltyp.DataSource = lbTypen.Items;
txZahltyp.DataBindings.Add("Text", bsZahltyp, "");
}
Die MessageBox wird nie angezeigt, also scheint die BindingSource von der wechselnden Auswahl in der Listbox nichts mitzubekommen. Beim Programmstart wird der richtige Text (der des ersten Eintrags) im Textfeld angezeigt, aber dabei bleibt es dann, egal, was ich in der Listbox veranstalte. Ob ich der BindingSource die Listbox selbst oder ihre Items-Eigenschaft als DataSource zuweise, macht nur einen einzigen Unterschied: so wie jetzt wird der volle Text des Listbox-Eintrags angezeigt, bei der anderen Zuweisung nur der erste Buchstabe. Und wenn ich den Code aus MainFormLoad in den Konstruktor des Formulars verlege, ändert das gar nichts.
Was mache ich da falsch?
Danke für jederlei Hinweis,
Hertha
DataTable.Compute() ermöglicht nicht nur die Aggregatfunktion, sondern auch einen Filter. Jürgen
Das war's. Danke schön! Die Methode hatte ich überhaupt noch nicht wahrgenommen. Sie scheint mir auch in mehreren Lehrbüchern nicht vorzukommen, das kann ich aber gerade nicht nachprüfen.
Schöne Grüße,
Herta
verwendetes Datenbanksystem: Hier uninteressant (es ist Firebird)
Ich habe ein DataSet mit einer DataTable, die schon mal von vornherein nur einen Teil der Originaltabelle aus der Datenbank holt. Dieser Teil der Tabelle wird in einem DataGridView angezeigt und soll dort auch unverändert stehen bleiben.
Daneben möchte ich aber auf eine Untermenge der angezeigten Daten eine Aggregatfunktion anwenden (ganz banal: Summe über eine Spalte) und das Ergebnis in die Statuszeile meines Hauptfensters schreiben.
Mit einer direkten SQL-Anfrage an die Datenbank geht das natürlich einfach:
SELECT SUM(meineSpalte) FROM meineTabelle WHERE neueBedingung AND alteBedingung
"alteBedingung" wäre die WHERE-Bedingung der ursprünglichen Abfrage, die meine DataTable produziert hat, "neueBedingung" wäre die zusätzliche Filterbedingung.
Aber das scheint mir doch nicht der Sinn der Sache zu sein!
Das Problem ist: Filtern allein (also "neueBedingung" anwenden) wäre kein Problem, aber wie kriege ich die Aggregatfunktion und die Filterbedingung zusammen?
Danke für alle Hinweise,
Herta
Hallo nochmal,
also sobald ich als Datenquelle OLE DB nehme kann ich keine vorhandene Datenbank mehr angeben.
Ich weiß auch nicht genau wie das gehen soll ?
Der Connectioonstring der da angezeigt wir ist ja auch komischer Weise leer ???
Das hört sich alles schon ziemlich seltsam an. Ich habe es jetzt mal mit Visual C# 2005 Express ausprobiert, und da ist das Ganze völlig selbsterklärend und funktioniert. Ohne Access auf dem Rechner, nur eine Access-Datenbankdatei ist vorhanden.
Vielleicht gibts hier ja jemanden der auch VS2008 hat und das mal nachvollziehen kann ?
Vielleicht ist ja auch irgendwas mit meinem VS2008 nicht OK ?
Ich habe hier jetzt mal ein Bildschirmfoto des Fensters "Verbindung hinzufügen" angehängt, wie es bei mir aussieht. Ganz anders? Ähnlich, aber gerade am entscheidenden Punkt anders?
Schlimmstenfalls müsstest Du aber eins von drei Dingen tun können:
ConnectionString für Access: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<Pfad_zu_Deiner_Datenbankdatei\Name_Deiner_Datenbankdatei.mdb>
Hoffe, das hilft ein Schrittchen weiter.
Und die Spalte "kd_name" heißt nicht nur in der Datenbank so, sondern auch in der DataTable, die Du aktualisierst? Wenn's da einen Unterschied gibt, müsste in der "...Parameters.Add..."-Anweisung derjenige Spaltenname erscheinen, der in der DataTable benutzt wird.
Dein selbstgeschriebenes Update-Kommando ist mir im übrigen auch verdächtig: die Kommandos, die ein CommandBuilder erzeugt, haben immer eine WHERE-Klausel, die dafür sorgt, dass jeder aktualisierte Satz der DataTable den richtigen Satz der Datenbanktabelle ändert. Wie das in Deinem Fall aber auszusehen hätte, hängt von der sonstigen Tabellenstruktur ab (insbesondere vom Primärschlüssel).
Hallo,
ich versuche in VS2008 mein erstes Projekt mit einer Datenbank zu erstellen.
Scheitere aber leider schon am Anfang.
Ich möchte also, um nicht den SQL Server mitliefern zu müssen, eine
einfache access datenbank verwenden.In VS2008 also eine Form mit einem DatagridView drauf erstellt. Im
DGV bei Aufgaben -> Projektdatenquelle hinzufügen gewählt.
Dann kommt ein Fenster wo man die Datenwuelle wählen kann.
Ich hab mich ganz links für Datenbank entschieden und auf Weiter geklickt.
Drunter steht :Ermöglicht die Verbindung mit einer Datenbank und die Auswahl der
Datenbankobjekte für die Anwendung. Mit dieser Option wird ein DataSet
erstellt.
Das setzt doch voraus, dass es die Datenbank schon gibt, jedenfalls verstehe ich den Text so.
Ok...klick -> Weiter -> neues Fenster "Wählen Sie ihre Datenverbindung aus"
dort -> klcik auf "Neue Verbiindung..."
Wieder ein neues Fenster "Datenquelle auswählen" als Titel
Unter Datenquelle kann ich wählen
- Microsoft Access-Datenbankdatei
-Microsoft ODBC-Datenquelle- Microsoft SQL Server
usw...Hab dort "Microsoft Access-Datenbankdatei" gewählt und auf weiter geklickt.
Kommt wieder ein neues Fenster mit Titel " Verbindung hinzufügen"
Oben bei Datenquelle steht "Microsoft Access-Datenbankdatei (OLE DB)" und
daneben ein Button
namens "Andern..."
Darunter "Sonstiges" -> Connectionstring. Dahinter steht nix.
So lange da nichts steht, kann m.E. auch keine Verbindung zustande kommen.
Hab dann unten auf "Testverbindung" geklickt...kommt ne Meldung
"Testverbindung erfolgreich".
An dieser Stelle blicke ich nun allerdings auch nicht durch, diese Meldung hätte ich nicht erwartet. Was dann folgt, lässt die Meldung allerdings auch nicht wirklich richtig aussehen.
Danach hab ich, Siegessicher wie ich war, auf OK geklickt und blöderweise
kommt
eine Messagebox "Das Format der Initialisierungszeichenfolge stimmt nicht
mit der Spezifikation überein, die bei Index '0' beginnt."Hä ??? Wat willer von mir ?
Kann mir bitte jamnd verraten was ich da falsch mache ?
Danke
Matthias
Ich kann das hier nicht nachvollziehen (kein VS, und auch kein Access), würde aber sehr stark vermuten, dass Du auf diesem Weg keine neue Datenbank erstellen kannst. Wenn Du Access hast, ist der nächste Schritt einfach: Access aufmachen, eine Datenbank neu anlegen, Access wohl besser wieder schließen, und dann noch mal von VS aus die Herstellung der Verbindung zur jetzt existierenden Datenbank probieren. Wie Du dem Projekt genau mitzuteilen hast, wie die Datenbank heißt und wo sie liegt, sollte sich mittels Online-Hilfe eigentlich klären lassen.
Ich habe jetzt irgendwo gelesen, dass beim Ändern, Einfügen, etc. eines Data-Table-Adapters die Werte gar nicht in die Datenbank, sondern erst irgendwo zwischengespeichert werden (evtl. sogar im Data-Table selbst).
Genau so ist es. Die Änderungen kommen erst mal nur in die DataTable (und damit auch in das DataSet, zu dem die DataTable gehört).
Vielleicht fehlt mir ja einfach nur ein update-Befehl, der dem Data-Table sagt: "Bitte gib die Daten an die Datenbank weiter"!
Der TableAdapter (oder ist es ein DataAdapter? Es gibt ja beides) besitzt eine Methode Update, und die sollte genau dies tun.
Alle Details dazu finden sich in der .NET-Dokumentation.
Gruß,
bb1898
Hallo zusammen,
gibt es eine Möglichkeit einzelne modifizierte Felder in einem DataSet zu erkennen?
Folgendes ist mir klar:
DataRow testRow = dataTable.Rows[0]; testRow[0] = 11880; if(testRow.RoeState == DataRowState.Modified) { ... }
Also bei einer DataRow ist das ja kein Problem. Aber wie genau funktioniert das mit einer bestimmten Zelle?
So richtig fit und sicher fühle ich mich da zwar noch nicht, aber so müsste es eigentlich gehen (nicht getestet): für Dein "..." einfügen
if (testRow[0, DataRowVersion.Current] != testRow[0, DataRowVersion.Original])
{
// dieses Feld wurde modifiziert, entsprechenden Code einfügen
}
Vielleicht muss es auch DataRowVersion.Proposed statt .Current heißen - ausprobieren. Und ich habe hier zwecks Kürze auch nicht überprüft, welche Versionen für den Datensatz überhaupt existieren.
Schön ist anders, gibt es bessere Verfahren?
Gruß,
bb1898