Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
PDF-Datei in PostgreSQL speichern
Suspekta
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

PDF-Datei in PostgreSQL speichern

beantworten | zitieren | melden

Hallo,

ich weiß nicht ob ich hier richtig bin aber ich habe ein Problem PDF-Datei in eine PostgreSQL DB zu speichern.
Wir stellen unser Programm gerade um von MySQL nach ProstgreSQL und von VB auf c#
In MySQL war das ziemlich einfach. Ich habe das Skipt aus dem VB nach C# umgeschrieben und herausgefunden, das PDF-Datei z.B. in den Typ "OID" gespeichert werden sollten

Hier mal das Scipt:


  System.IO.FileStream fs = new System.IO.FileStream(@"D:\karten.pdf", System.IO.FileMode.Open, System.IO.FileAccess.Read);
            byte[] Value = new byte[fs.Length];
            fs.Read(Value, 0, (int)fs.Length);
            fs.Close();


            NpgsqlConnection con1 = new NpgsqlConnection();
            NpgsqlCommand cmd1 = new NpgsqlCommand();

            con1.ConnectionString = connection_string;
            cmd1.Connection = con1;
            con1.Open();

            cmd1.Parameters.Add("p1", NpgsqlTypes.NpgsqlDbType.Oid, Value.Length, "Byte").Value = Value;
            cmd1.CommandText = "insert into test1 (id, image) values (9,?p1)";
            cmd1.ExecuteNonQuery();

            con1.Close();

Die DB-Verbindung etc ist alles OK. Das programm stoppt hier cmd1.ExecuteNonQuery(); mit der Meldung
System.InvalidCastException: "Can't write CLR type System.Byte[] with handler type UInt32Handler"

Kann hier jemand helfen?
Danke
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1919
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Oid kann nicht stimmen.
Dabei handelt es sich um einen Object Identifier Typen.
Was du eher brauchst wäre bytea als Byte Array.
Entsprechend muss auch die Datenbank den Typen in der Spalte haben.
Ansonsten passt dein Code nicht zu deinem Vorhaben.

Ansonsten noch ein paar Vorschlägt.
Du kansnt du Datei auch über File.ReadAllBytes auslesen, das spart den FileStream und ein paar Zeilen.

Nutz auch bei der Verbindung/Command etc. using um diese immer frei zugeben.
Oder ruf direkt Dispose auf, was du z.B. beim Command nicht machst.

Es wäre hier auch sinnvoller Dateien nicht in der Datenbank zu speichern.
Diese blähen i.d.R. nur die Datenbank auf.
Diese sollten vielmehr im Dateisystem abgelegt werden und in der Datenbank nur Verweise via den Dateipfad enthalten.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Suspekta
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Hallo,

erstmal Danke für deine Antwort.
ich habe das mal umgebaut. Die Tabelle auf Bytea geändert und den Parameter angepasst. Jetzt kommt die Meldung das es die Spalte "p1" nicht gibt


  byte[] Value = File.ReadAllBytes(@"D:\karten.pdf");

 db.Connection_1();
 db.cmd1.Parameters.Add("p1", NpgsqlTypes.NpgsqlDbType.Bytea, Value.Length, "Byte").Value = Value;
 db.cmd1.CommandText = "insert into test (id, image) values (9,?p1)";
 db.cmd1.ExecuteNonQuery();

 db.cmd1.Dispose();
 db.con1.Close();

Eine Idee?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16224

beantworten | zitieren | melden

Vermutlich der Parameter @p1 heissen muss - sagt zumindest die Doku.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Suspekta
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

ohhhhhh man .... Danke
Wer lesen kann ich klar im Vorteil ^^
Super, Funkt jetzt
private Nachricht | Beiträge des Benutzers
Urza
myCSharp.de - Member



Dabei seit:
Beiträge: 67

beantworten | zitieren | melden

Ich kenn mich mit PostgreSQL nicht wirklich aus.
Aber müsste es nicht @p1 anstellen von ?p1 sein.
Und nutze mal


db.cmd1.Parameters.AddWithValue("p1", Value);

Doku

Edit:
mal wieder zu langsam...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Urza am .
“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

- Patrick to Spongebob
private Nachricht | Beiträge des Benutzers