Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Speicherung von Daten in der Datenbank
ique.mota - Mo 13.04.15 12:19
Titel: Speicherung von Daten in der Datenbank
Hallo,
ich stoße ständiges auf ein Problem und finde leider keine Lösung.
Ich bin dabei ein Tool zu erstellen, das die Termindaten aus dem Outlook vom Exchange Server in einer postgreSQL-Datenbank speichert. Die Daten zu lesen und am Display anzuzeigen funktioniert schon aber diese in der Datenbank zu speichern noch gar nicht.
Nach vielen Problemen mit der Verbindung zur Datenbank habe ich das (glaube ich zumindest) gelöst aber speichern tut es immer noch nicht und ich bin so langsam durch mit meine Gedanken. Hier der Coder zum Verständnis:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| DateTime startDate = new DateTime(2015, 1, 1, 0, 0, 0); DateTime endDate = DateTime.Now; CalendarFolder calendar = CalendarFolder.Bind(service, c_id); CalendarView cView = new CalendarView(startDate, endDate); cView.PropertySet = new PropertySet(AppointmentSchema.ConversationId, AppointmentSchema.ICalUid, AppointmentSchema.Categories, AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End); cView.PropertySet.RequestedBodyType = BodyType.Text; FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView); foreach (Appointment a in appointments) { { Console.Write("ID: " + a.ConversationId.ToString() + " "); Console.Write("iCalUID: " + a.ICalUid.ToString() + " "); Console.Write("Categories: " + a.Categories.ToString() + " "); Console.Write("Subject: " + a.Subject.ToString() + " "); Console.Write("Start: " + a.Start.ToString() + " "); Console.Write("End: " + a.End.ToString()); a.Load(); string bt = a.Body.Text.ToString(); bt = GetPlainTextFromHtml(bt); Console.Write("body: " + bt + " "); Console.WriteLine(); OleDbConnection con = new OleDbConnection("Provider=PostgreSQL OLE DB Provider;Data Source=192.168.0.6;location=termine;User ID=hmota;password=Hmota2012!"); OleDbCommand cmd = new OleDbCommand("Insert into terminmitarbeiter_test(conversation_id,icaluid,categories,subject,start,ende)values(@conversation_id,@icaluid,@categories,@subject,@start,@ende)", con); Console.WriteLine("Saving Appointment:" + a.Subject); cmd.Parameters.Add("@conversation_id", OleDbType.VarChar, 50).Value = a.ConversationId.ToString(); cmd.Parameters.Add("@icaluid", OleDbType.VarChar, 50).Value = a.ICalUid.ToString(); cmd.Parameters.Add("@categories", OleDbType.Char, 50).Value = a.Categories.ToString(); cmd.Parameters.Add("@subject", OleDbType.Char, 50).Value = a.Subject.ToString(); cmd.Parameters.Add("@start", OleDbType.Date).Value = a.Start.ToString(); cmd.Parameters.Add("@ende", OleDbType.Date).Value = a.End.ToString(); Console.Write("Opening Conn..."); con.Open(); Console.Write("Running cmd..."); int i = cmd.ExecuteNonQuery(); Console.Write("Finishing cmd..."); con.Close(); if (i > 0) { Console.WriteLine("Record Inserted Successfully"); } else { Console.WriteLine("Operation Failed,Please Try Again Later"); } }
} Console.ReadLine(); |
Die Fehlermeldung, die ich erhalte, lautet: "Error: 'PostgreSQL OLE DB Provider' ist ohne Fehlermeldung fehlgeschlagen, Ergebniscode: DB_E_BADTYPENAME(0x80040E30)."
Kann mir jemand helfen?
Moderiert von
Th69: C#-Tags hinzugefügt
Ralf Jansen - Mo 13.04.15 12:28
Möglicherweise mag er einen der Datentypen nicht die du als Parameter verwendest. Möglicherweise findest du irgendwo eine Doku wie Postgres Typen auf die Typen die von der OleDbType Enumeration genannt werden richtig mappen. Wo ich mir ganz sicher bin, aber wohl eher nicht das Problem ist, das ein Date sicher kein string ist. OleDbType.Date als string zu übergeben ist wohl kaum richtig.
ique.mota - Mo 13.04.15 12:54
Das mit dem Date stimmt natürlich, habe auch angepasst...
Mit den Types finde ich leider nichts sinnvoller im Internet, was das Problem annähernd lösen könnte... Sonst keine Ideen?
Ralf Jansen - Mo 13.04.15 13:30
Andere Möglichkeit wäre noch das das Parameter Verfahren bei dem von dir verwendeten Postgres OleDB Provider ein anderes ist. Der provider bestimmt das Format das ist nicht einheitlich. Es muß also nicht @Name sein sondern könnte auch :Name oder nur das ? Zeichen sein. Im letzteren Fall wäre dann der Name des Parameters ohne Nutzen es kommt dann nur auf die Reihenfolge an in der man die Parameter hinzufügt.
Ist das deine erste Query/parametrisierte Query Richtung PostgreSQL oder hast du bereits Queries die funktionieren. Dann kann ich grundsätzliche Probleme schonmal ausschließen und uns diese konkrete Query näher ansehen.
ique.mota - Mo 13.04.15 14:10
Das ist die einzige Query, die mich interessiert, weil die Daten nur in der Datenbank abgespeichert werden sollen, sonst gar nichts...
Wenn das Parameter Verfahren ein anderes wäre, würde er dann so eine Fehlermeldung rausbringen?
Ralf Jansen - Mo 13.04.15 14:13
Das kommt auf den konkreten OLEDB Provider an. Das ist dessen Implementierungsdetail und keiner kennt sie alle. Ich kenne den für PostgreSQL nicht. Vermutlich gibst da auch noch mehrere.
Ich kann dich nur an die Doku von dem verweisen denn du benutzt.
Edit :
http://npgsql.projects.pgfoundry.org/
Edit2: @TH69 wo bleibt die schellte das Crossposts gemein sind?
Th69 - Mo 13.04.15 16:38
Das mit der Schelte überlasse ich diesmal anderen - ich will nicht immer als "Bösewicht" dastehen und Forenuser vertreiben ;-)
ique.mota - Di 14.04.15 10:38
Ich habe das jetzt umgebaut und den Provider npgsql benutzt. Nach langem Hin und Her meldet er die erfolgreiche Speicherung und die Tabelle wird auch erweitert in der Datenbank aber wenn ich sie öffne, sehe ich nur alle Felder leer. Kann mir jemand sagen, wieso?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| foreach (Appointment a in appointments) { Console.Write("ID: " + a.ConversationId.ToString() + " "); Console.Write("iCalUID: " + a.ICalUid.ToString() + " "); Console.Write("Categories: " + a.Categories.ToString() + " "); Console.Write("Subject: " + a.Subject.ToString() + " "); Console.Write("Start: " + a.Start.ToString() + " "); Console.Write("End: " + a.End.ToString()); Console.WriteLine(); NpgsqlConnection con = new NpgsqlConnection("Server=192.168.0.6;Port=5432;User Id=hmota;Password=Hmota2012!;Database=termine;"); string query = "INSERT into terminmitarbeiter_test (conversationid,icaluid,categories,subject,start,ende) values (@ConversationID,@ICalUid,@Categories,@Subject,@Start,@End)"; NpgsqlCommand cmd = new NpgsqlCommand(query, con); cmd.Parameters.Add(new NpgsqlParameter("ConversationID", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("ICalUid", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("Categories", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("Subject", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("Start", DbType.Date)); cmd.Parameters.Add(new NpgsqlParameter("End", DbType.Date)); Console.WriteLine("Saving Appointment:" + a.Subject); Console.Write("Opening Conn..."); con.Open(); Console.Write("Running cmd..."); int i = cmd.ExecuteNonQuery(); Console.Write("Finishing cmd..."); con.Close(); if (i > 0) { Console.WriteLine("Record Inserted Successfully"); } else { Console.WriteLine("Operation Failed,Please Try Again Later"); } } |
Moderiert von
Th69: C#-Tags hinzugefügt
Ralf Jansen - Di 14.04.15 10:44
Vielleicht solltest du die Parameter nicht nur erzeugen sondern denen auch Werte zuweisen ;)
ique.mota - Di 14.04.15 11:19
Das macht natürlich Sinn! :D
Ich habe so erweitert und zur Verständnis den kompletten Ausschnitt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| DateTime startDate = new DateTime(2015, 1, 1, 0, 0, 0); DateTime endDate = DateTime.Now; CalendarFolder calendar = CalendarFolder.Bind(service, c_id); CalendarView cView = new CalendarView(startDate, endDate); cView.PropertySet = new PropertySet(AppointmentSchema.ConversationId, AppointmentSchema.ICalUid, AppointmentSchema.Categories, AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End); cView.PropertySet.RequestedBodyType = BodyType.Text; FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView); foreach (Appointment a in appointments) { { Console.Write("ID: " + a.ConversationId.ToString() + " "); Console.Write("iCalUID: " + a.ICalUid.ToString() + " "); Console.Write("Categories: " + a.Categories.ToString() + " "); Console.Write("Subject: " + a.Subject.ToString() + " "); Console.Write("Start: " + a.Start.ToString() + " "); Console.Write("End: " + a.End.ToString()); Console.WriteLine(); NpgsqlConnection con = new NpgsqlConnection("Server=192.168.0.6;Port=5432;User Id=hmota;Password=Hmota2012!;Database=termine;"); string query = "INSERT into terminmitarbeiter_test (conversationid,icaluid,categories,subject,start,ende) values (@ConversationID,@ICalUid,@Categories,@Subject,@Start,@End)"; NpgsqlCommand cmd = new NpgsqlCommand(query, con); cmd.Parameters.Add(new NpgsqlParameter("ConversationID", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("ICalUid", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("Categories", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("Subject", DbType.String)); cmd.Parameters.Add(new NpgsqlParameter("Start", DbType.Date)); cmd.Parameters.Add(new NpgsqlParameter("End", DbType.Date)); cmd.Parameters[0].Value = AppointmentSchema.ConversationId; cmd.Parameters[1].Value = AppointmentSchema.ICalUid; cmd.Parameters[2].Value = AppointmentSchema.Categories; cmd.Parameters[3].Value = AppointmentSchema.Subject; cmd.Parameters[3].Value = AppointmentSchema.Start; cmd.Parameters[3].Value = AppointmentSchema.End; Console.WriteLine("Saving Appointment:" + a.Subject); Console.Write("Opening Conn..."); con.Open(); Console.Write("Running cmd..."); int i = cmd.ExecuteNonQuery(); Console.Write("Finishing cmd..."); con.Close(); if (i > 0) { Console.WriteLine("Record Inserted Successfully"); } else { Console.WriteLine("Operation Failed,Please Try Again Later"); } } } |
Und nun speichert er zwar was aber genau das: Unter conversationid: ConversationID, unter ICalUid: ICalUid, unter categories: Categories und unter Subject: End. Und das, dann für alle Termine...Wieso? Sorry, wenn ich jetzt schon blödere Fragen stelle aber ich sehe den Wald vor lauter Bäumen nicht mehr...
Moderiert von
Th69: C#-Tags hinzugefügt
Ralf Jansen - Di 14.04.15 11:29
Die Werte schreibst du ja vorher testweise scheinbar auf die Console. Die solltest du dann auch in die Parameter schreiben.
Z.B.
C#-Quelltext
1:
| cmd.Parameters.AddWithValue("@ConversationID", a.ConversationId); |
ique.mota - Di 14.04.15 11:39
Vielen Dank!
Er sagt mir dann als ERROR nur, dass der Typ
Microsoft.Exchange.WebServices.Data.ConversationID nicht in einen gültigen DbType umgewandelt werden kann.
Wo und wie kann die Umwandlung denn machen?
Moderiert von
Th69: C#-Tags hinzugefügt
Ralf Jansen - Di 14.04.15 11:45
Dann ruf daran noch ToString() auf. So wie du es in deinem Code auch schon gemacht hattest. Laut Exchange Doku ist ConversationID schon ein string darum habe ich das für unnötig gehalten.
ique.mota - Di 14.04.15 12:55
Danke!
ique.mota - Di 14.04.15 14:58
Ich kann jetzt speichern!
Hat jemand eine Idee, wie ich sonst die zu speichernden Daten mit den bereits in der Datenbank vorhandenen vergleichen könnte? Für jeden Eintrag wird eine UUID erstellt und mitgespeichert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!