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 😉
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
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
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
sync(@"\\<server>\<pfad>\<name>.mdb", @"<name>.mdb");
das ist der aufruf der Funktion. Also steht in designmaster: \<server><pfad><name>.mdb
sorry wegen der änderungen, vertrauliche daten 👅
Probiers mal statt den Pfad mit einem Connectionstring
Replica .ActiveConnection = @"Data Source=C:\Program Files\Microsoft Office" +
"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
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
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
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'Open the database. con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data source=C:\Program Files\Microsoft Office\" & _ "Office\Samples\Northwind.mdb;" repDM.ActiveConnection = con 'If a replica of the database exists, it is deleted. If (Dir("C:\Program Files\Microsoft Office\" & _ "Office\Samples\Replica of Northwind.mdb") <> "") Then Kill ("C:\Program Files\Microsoft Office\" & _ "Office\Samples\Replica of Northwind.mdb") End If 'Create a new replica of the database. repDM.CreateReplica "C:\Program Files\Microsoft Office\" & _ "Office\Samples\Replica of Northwind.mdb", _ "Replica1 for Northwind.mdb", _ jrRepTypeFull, jrRepVisibilityGlobal 'New values are put into Table1. On Error Resume Next con.Execute "DROP TABLE Table1" On Error GoTo 0 con.Execute "CREATE TABLE Table1 (Field1 Int)" con.Execute "INSERT INTO Table1 VALUES (1)" con.Execute "INSERT INTO Table1 VALUES (2)" 'Synchronize the values. repDM.Synchronize "C:\Program Files\Microsoft Office\" & _ "Office\Samples\Replica of Northwind.mdb", _ 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
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...
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
*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
"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
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 🙂
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