Laden...

PDF-Datei in PostgreSQL speichern

Erstellt von Suspekta vor 2 Jahren Letzter Beitrag vor 2 Jahren 691 Views
S
Suspekta Themenstarter:in
19 Beiträge seit 2020
vor 2 Jahren
PDF-Datei in PostgreSQL speichern

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

T
2.219 Beiträge seit 2008
vor 2 Jahren

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.

S
Suspekta Themenstarter:in
19 Beiträge seit 2020
vor 2 Jahren

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?

16.807 Beiträge seit 2008
vor 2 Jahren

Vermutlich der Parameter @p1 heissen muss - sagt zumindest die Doku.

S
Suspekta Themenstarter:in
19 Beiträge seit 2020
vor 2 Jahren

ohhhhhh man .... Danke
Wer lesen kann ich klar im Vorteil ^^
Super, Funkt jetzt

U
69 Beiträge seit 2019
vor 2 Jahren

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...

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob