Laden...

Access Datenbank per Button synchronisieren

Erstellt von Mora vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.094 Views
M
Mora Themenstarter:in
22 Beiträge seit 2006
vor 17 Jahren
Access Datenbank per Button synchronisieren

Hallo,

ich muss mit Hilfe eines Programmes, welches Datenbestände in ein Replikat einfügt, auch die Replikation durchführen.

Leider habe ich dazu weder im "normalen" Internet, noch hier etwas gefunden. Ich habe mich ein wenig mit JRO beschäftigt, steige aber, wenn ich ehrlich bin, nicht wirklich durch 🤔

Es gibt dort zwar eine syncronize Methode, aber diese verlangt Übergaben, für die es keine Hilfe in C# gibt.

using JRO;

namespace JRO_test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            JRO.Replica Replikat = new Replica();
            JRO.SyncTypeEnum STE = new SyncTypeEnum();
            JRO.SyncModeEnum SME = new SyncModeEnum();
            Replikat.Synchronize("test.mdb", STE, SME);
        }

        
    }
}

So habe ich es aufgebaut, aber da es keine Hilfe zu JRO in der Hilfe(online/offline) gibt, hilft mir das nicht weiter.

Ich bin sicher, er verlangt von mir Werte für STE und SME, aber welche genau, ist mir nicht ersichtlich.

Vielleicht hat ja schonmal jemand mit JRO gearbeitet, und kann mir da auf die Sprünge helfen.

MfG
mora

P.S.: Nein, es muss leider eine Access Datenbank sein, per SQL würde ich es wohl eher hinbekommen 🙂

P.P.S.: Vielleicht habe ich auch das gesammte Konzept der syncronize Methode nicht verstanden, dann kläre man mich bitte auf 😉

1.274 Beiträge seit 2005
vor 17 Jahren

vielleicht hilft dier dieser Link weiter MSDN.

Würde mir aber überlegen die Replication selber zu implementieren. Die Access Lösung ist nicht die stärkste.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
Mora Themenstarter:in
22 Beiträge seit 2006
vor 17 Jahren

Erstmal danke LastGentleman,

war ne Hilfe, nun verstehe ich wenigstens, wie es eigentlich laufen soll... glaube ich zumindest, da ich nun eine komische Fehlermeldung bekomme...

Ich hab mal von VB-Code aus der MSDN

Sub TwoWayDirectSync(strReplica1 As String, _
                     strReplica2 As String)
   Dim repReplica  As New JRO.Replica

   repReplica.ActiveConnection = strReplica1

   ' Sends changes made in each replica to the other.
   repReplica.Synchronize strReplica2, jrSyncTypeImpExp, _
      jrSyncModeDirect

   Set repReplica= Nothing
End Sub

in C#

        private void sync(string designmaster, string replicate)
        {
            Replica replica = new Replica();
            replica.ActiveConnection = designmaster;
            replica.Synchronize(replicate, SyncTypeEnum.jrSyncTypeImpExp, SyncModeEnum.jrSyncModeDirect);
        }

umgebaut.

Übergeben tue ich 2 Datenbankpfade, "designmaster" ist eine Datenbank, die im Netzwerk liegt (übergebe genauen Netzwerkpfad+Name), "replicate" ist das lokale Replikat.

Nun bekomme ich bei

            replica.ActiveConnection = designmaster;

folgende Fehlermeldung:

Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar.

Kann mir jemand sagen, woran das liegt? Weil wenn ich das VB-Beispiel richtig verstehe, will er einfach den Datenbank-Pfad... bin verwirrt 🙂

MfG
mora

1.274 Beiträge seit 2005
vor 17 Jahren

Was seht denn in deinem String designmaster

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
Mora Themenstarter:in
22 Beiträge seit 2006
vor 17 Jahren
sync(@"\\<server>\<pfad>\<name>.mdb", @"<name>.mdb");

das ist der aufruf der Funktion. Also steht in designmaster: \<server>&lt;pfad>&lt;name>.mdb

sorry wegen der änderungen, vertrauliche daten 👅

1.274 Beiträge seit 2005
vor 17 Jahren

Probiers mal statt den Pfad mit einem Connectionstring

Replica .ActiveConnection = @"Data Source=C:\Program Files\Microsoft Office&quot; +
"Office\Samples\Northwind.mdb;" +
"Password=test;User ID=test;" +
"Jet OLEDB:System database=C:\Secured.mdw";

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
Mora Themenstarter:in
22 Beiträge seit 2006
vor 17 Jahren
        private void sync(string designmaster, string replicate)
        {
            Replica replica = new Replica();
            string conn_string = @"Data Source=" + designmaster + ";" +
                                  "Jet OLEDB:System database=" + replicate + ";";
            replica.ActiveConnection = conn_string;
            replica.Synchronize(replicate, SyncTypeEnum.jrSyncTypeImpExp, SyncModeEnum.jrSyncModeDirect);
        }

Hab's mal dahingehend geändert. Passwort und Username gibt es bei der Access-Datenbank nicht.

Problem: selbe Fehlermeldung wie vorher... was ich echt nicht verstehe, "Die Argumente sind vom falschen Typ" impliziert, dass ActiveConnection keinen String als Eingabe akzeptiert, aber im MSDN-Beispiel ist es ein String... die Verwirrung steigt.

MfG
mora

1.274 Beiträge seit 2005
vor 17 Jahren

Schon mal im Access direkt ausprobiert?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

1.274 Beiträge seit 2005
vor 17 Jahren

Hab auch ein Sample gefunden das sieht so aus:

Public Sub DirectSync()
Dim repDM As New JRO.Replica
Dim repReplica As New JRO.Replica
Dim con As New ADODB.Connection

&#39;Open the database.  
con.Open &quot;Provider=Microsoft.Jet.OLEDB.4.0;&quot; &amp; _  
         &quot;Data source=C:\Program Files\Microsoft Office\&quot; &amp; _  
         &quot;Office\Samples\Northwind.mdb;&quot;  

repDM.ActiveConnection = con  

&#39;If a replica of the database exists, it is deleted.  
If (Dir(&quot;C:\Program Files\Microsoft Office\&quot; &amp; _  
        &quot;Office\Samples\Replica of Northwind.mdb&quot;) &lt;&gt; &quot;&quot;) Then  
    Kill (&quot;C:\Program Files\Microsoft Office\&quot; &amp; _  
          &quot;Office\Samples\Replica of Northwind.mdb&quot;)  
End If  

&#39;Create a new replica of the database.  
repDM.CreateReplica &quot;C:\Program Files\Microsoft Office\&quot; &amp; _  
                    &quot;Office\Samples\Replica of Northwind.mdb&quot;, _  
                    &quot;Replica1 for Northwind.mdb&quot;, _  
                    jrRepTypeFull, jrRepVisibilityGlobal  

&#39;New values are put into Table1.  
On Error Resume Next  

con.Execute &quot;DROP TABLE Table1&quot;  

On Error GoTo 0  

con.Execute &quot;CREATE TABLE Table1 (Field1 Int)&quot;  
con.Execute &quot;INSERT INTO Table1 VALUES (1)&quot;  
con.Execute &quot;INSERT INTO Table1 VALUES (2)&quot;  

&#39;Synchronize the values.  
repDM.Synchronize &quot;C:\Program Files\Microsoft Office\&quot; &amp; _  
                  &quot;Office\Samples\Replica of Northwind.mdb&quot;, _  
                  jrSyncTypeImpExp, jrSyncModeDirect  

End Sub

Quelle: MS-KB

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
Mora Themenstarter:in
22 Beiträge seit 2006
vor 17 Jahren

editiert, weil völlig falsch 🙂 so, nochmal:

        private void sync(string designmaster, string replicate)
        {
            OleDbConnection con = new OleDbConnection();
            
            Replica replica = new Replica();

            con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + designmaster + ";";
            con.Open();
            
            replica.ActiveConnection = con;
            replica.Synchronize(replicate, SyncTypeEnum.jrSyncTypeImpExp, SyncModeEnum.jrSyncModeDirect);
        }

So sieht es imo aus. Recht Hübsch, aber neue Fehlermeldung:

Specified cast is not valid.

an folgender stelle:

replica.ActiveConnection = con;

*grummelt vor sich hin* ich versteh's einfach nicht...

1.274 Beiträge seit 2005
vor 17 Jahren

Du must die Connection mittels Dao aufbauen, da Access auch DAO intern hat und den ADO.Net Provider nicht kennt.

lg
L.G.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
Mora Themenstarter:in
22 Beiträge seit 2006
vor 17 Jahren

*hüstel* sagst du mir auch noch wie? hab von DAO mal so gar keine ahnung... und ich find da auch weder einen connection string, noch ein open... vielleicht bin ich aber auch nur blind 🙂

Ich versuch mich mal schlau zu machen, aber wenn du irgendwo einen kurzen link hättest, wär das schon super 🙂

MfG
mora

1.274 Beiträge seit 2005
vor 17 Jahren

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

M
Mora Themenstarter:in
22 Beiträge seit 2006
vor 17 Jahren

gnar, ok, wieso ist das denn so furchtbar einfach 😉


using JRO;
using ADODB;

private void DB_sync(string designmaster, string replikat)
        {
            try
            {
                Replica rep = new Replica();
                Connection con = new Connection();
                con.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + designmaster + ";", "", "", 0);
                rep.ActiveConnection = con;
                rep.Synchronize(replikat, SyncTypeEnum.jrSyncTypeImpExp, SyncModeEnum.jrSyncModeDirect);
                con.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show("Während der Synchronisierung ist ein Fehler aufgetretten.","Synchronisierungsfehler");
            }
        }

Nochmal danke für die ganze Hilfe 🙂

1.274 Beiträge seit 2005
vor 17 Jahren

Bitte schön kein Problem

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein