Autor Beitrag
ique.mota
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 13.04.15 12:19 
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:
ausblenden volle Höhe 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(201511000);
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 user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 13.04.15 14:13 
Hallo,

ich würde dir ebenso raten, wie in den Beiträgen deines Crossposts myCSharp.de - Speicherung von Daten in der Datenbank den PostgreSQL Treiber zu benutzen...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 : npgsql.projects.pgfoundry.org/
Edit2: @TH69 wo bleibt die schellte das Crossposts gemein sind?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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?
ausblenden volle Höhe 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 user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 14.04.15 10:44 
Vielleicht solltest du die Parameter nicht nur erzeugen sondern denen auch Werte zuweisen ;)
ique.mota Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 14.04.15 11:19 
Das macht natürlich Sinn! :D

Ich habe so erweitert und zur Verständnis den kompletten Ausschnitt:
ausblenden volle Höhe 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(201511000);
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 user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
cmd.Parameters.AddWithValue("@ConversationID", a.ConversationId);					
ique.mota Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 14.04.15 12:55 
Danke!
ique.mota Threadstarter
Hält's aus hier
Beiträge: 8



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