Laden...

PostgreSQL - Verbindung zur Datenbank

Erstellt von kvxwyz vor 9 Jahren Letzter Beitrag vor 9 Jahren 6.994 Views
K
kvxwyz Themenstarter:in
12 Beiträge seit 2015
vor 9 Jahren
Hinweis von Coffeebean vor 9 Jahren

Bitte benutze Code Tags!

[Hinweis] Wie poste ich richtig? Punkt 6

PostgreSQL - Verbindung zur Datenbank

verwendetes Datenbanksystem: <postgresql>

Hallo,

ich versuche mit einem C#-Tool die Termineinträge aus dem Exchange Server in eine Datenbank zu kopieren und zu speichern. Dass die Daten gelesen werden und beispielsweise als Output am Display angezeigt werden, funktioniert aber nicht die Übertragung in die Datenbank. Ich habe schon einiges ausprobiert und recherchiert aber es hat bis jetzt nichts gebracht. Dazu habe ich folgenden Code:

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)
{
     {
     OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Integrated             Security=Yes");
     OleDbCommand cmd = new OleDbCommand("Insert into  terminmitarbeiter_test(conversation_id,icaluid,categories,subject,start,ende)values(@conversatio n_id,@icaluid,@categories,@subject,@start,@ende)", con);
     Console.WriteLine("Saving Appointment:" + a.Subject);
     cmd.Parameters.Add("@conversation_id", OleDbType.VarChar, 100).Value =     a.ConversationId;
     cmd.Parameters.Add("@icaluid", OleDbType.VarChar, 100).Value = a.ICalUid;
     cmd.Parameters.Add("@categories", OleDbType.VarChar, 255).Value = a.Categories;
     cmd.Parameters.Add("@subject", OleDbType.Char, 50).Value = a.Subject;
     cmd.Parameters.Add("@start", OleDbType.Date).Value = a.Start;
     cmd.Parameters.Add("@ende", OleDbType.Date).Value = a.End;
     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();

Folgende Fehlermeldung erhalte ich:

Fehlermeldung:
"Error: Fehler bei einem aus mehreren Schritten bestehenden OLE DB-Vorgang. Prüfen Sie die einzelnen OLE DB-Statuswerte, falls vorhanden. Daten wurden nicht verarbeitet."

Kann mir jemand einen Weg weisen?

16.835 Beiträge seit 2008
vor 9 Jahren

Verwende entsprechende Provider und vermeide OleDB.

1.696 Beiträge seit 2006
vor 9 Jahren

Bitte Connectionstring überprüfen Connectionstrings.com und bitte beachte [Hinweis] Wie poste ich richtig? Punkt 6.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
kvxwyz Themenstarter:in
12 Beiträge seit 2015
vor 9 Jahren

Vielen Dank für die hilfreiche Tipps und es tut mir leid, wenn ich was falsch gepostet habe.

Ich nehmen dann den Provider=PostgreSQL OLE DB Provider; aber er sagt mir dann: "Error: Der 'PostgreSQL OLE DB Provider'-Provider ist nicht auf dem lokalen Computer registriert."

Ich bin mittlerweile so verzweifelt, dass ich grade nichts mehr weiß...

F
10.010 Beiträge seit 2004
vor 9 Jahren

Du versuchst also einen (oleDb) PostGreSQL Provider zu benutzen um auf einen Exchange Server zuzugreifen?

Du solltest dringend versuchen zu verstehen was du machst und nicht wie wild irgendwas Probieren.
Ein MS Exchange Server lässt sich so nicht ansprechen.

Outlook: Via OLEDB schnell auf Outlook-Daten zugreifen

K
kvxwyz Themenstarter:in
12 Beiträge seit 2015
vor 9 Jahren

Nein. Die Verbindung mit dem Exchange Server besteht schon und funktioniert. Die Daten daraus, werden gezogen und können angezeigt werden. Mein Problem besteht darin, diese Daten in der Datenbank zu speichern. Dazu kriege ich die Verbindung momentan nicht hin...

1.696 Beiträge seit 2006
vor 9 Jahren

Ich nehmen dann den Provider=PostgreSQL OLE DB Provider; aber er sagt mir dann: "Error: Der 'PostgreSQL OLE DB Provider'-Provider ist nicht auf dem lokalen Computer registriert."

Dann lade den Treiber runter und installiere ihn auf deiner Maschine, auf der Connectionstrings Seite gibts dazu Downloadlinks. Aber warum OLEDB wenn du mit .NET arbeitest?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
kvxwyz Themenstarter:in
12 Beiträge seit 2015
vor 9 Jahren

Ich dachte, das sei die einzige Möglichkeit mit der Datenbank zu kommunizieren?

Wie würde es denn sonst funktionieren?

16.835 Beiträge seit 2008
vor 9 Jahren

Das haben die Leute Dir hier nun schon mehrfach gesagt und sogar verlinkt.
Entsprechende Provider nutzen; jede DB hat hierbei eigene Provider, die mit Hilfe von ADO.NET aber identisch/ähnlich angesprochen werden.

1.696 Beiträge seit 2006
vor 9 Jahren

Den Link habe ich dir bereits gegeben, lesen muss du selbst, sorry.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
kvxwyz Themenstarter:in
12 Beiträge seit 2015
vor 9 Jahren
Hinweis von Coffeebean vor 9 Jahren

Threads zusammengeführt

Bitte benutze Code-Tags!!!

PostgreSQL - Speicherung von Daten in der Datenbank

verwendetes Datenbanksystem: postgreSQL

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:

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: > Fehlermeldung:

Error: 'PostgreSQL OLE DB Provider' ist ohne Fehlermeldung fehlgeschlagen, Ergebniscode: DB_E_BADTYPENAME(0x80040E30). "

Kann mir jemand helfen?

1.696 Beiträge seit 2006
vor 9 Jahren

Warum machst du einen neuen Topic auf?

Zum Problem: OleDbCommand.Parameters

Nochmals, warum OLE DB und kein .NET Komponent wenn du schon mit C# arbeitest?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

K
kvxwyz Themenstarter:in
12 Beiträge seit 2015
vor 9 Jahren

Ich weiß es nicht, wie ich das sonst mit .NET formulieren soll...

3.825 Beiträge seit 2006
vor 9 Jahren

OleDB ist sehr alt, langsam und fehleranfällig.

Benutze stattdessen den nativen PostgreSQL .NET-Treiber, damit bekommst Du auf jeden Fall eine sinnvolle Fehlermeldung wenn was nicht klappt.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

1.696 Beiträge seit 2006
vor 9 Jahren
  1. Treiber auf connectionstrings.com runter laden und installieren
  2. [Artikelserie] SQL: Parameter von Befehlen lesen
  3. Anwenden

Edit: kann jemand diesen Topic mit Verbindung zur Datenbank zusammenführen, da es sich um das gleiche Problem handelt.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

2.207 Beiträge seit 2011
vor 9 Jahren

Edit: kann jemand diesen Topic mit
>
zusammenführen, da es sich um das gleiche Problem handelt.

Done

S
145 Beiträge seit 2013
vor 9 Jahren

Such mal nach npgsql, das verwenden wir auch für postgre Zugriff.

K
kvxwyz Themenstarter:in
12 Beiträge seit 2015
vor 9 Jahren

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?


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=[PasswordHere];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");
                        }
                    }

                }

Hinweis von Coffeebean vor 9 Jahren

Bitte poste deine Passwörter nicht hier. Auch, wenn sie simpel etc. sind. Passwörter haben hier nichts zu suchen. --> Entfernt

2.207 Beiträge seit 2011
vor 9 Jahren

Schau dir mit dem Debugger mal das Command an, was er gegen die DB feuert und schau dir das mal an. Sind alles Values richtig gesetzt?

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

1.696 Beiträge seit 2006
vor 9 Jahren

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?

Seufz ... du hast die Parameters zwar bereitgestellt aber nicht befüllt, woher sollen den Daten kommen?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::