Toon posts:

[C#.NET, Caché] Hoe connect ik in C#.NET met een Caché-odb?

Pagina: 1
Acties:
  • 288 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Wil dus in C#.NET een Caché (http://www.intersystems.com) OODB raadplegen. Voor Caché is een ODBC-driver beschikbaar en die heb ik geïnstalleerd. Ik kan dus een system-dns aanmaken voor een Caché database. Nou blijkt C# niet via een system-dns met een database te kunnen babbelen. Dus heb je een OLEDB- of SQLConnection nodig.
Deze connecties willen een zogenaamde connectionString die aangeeft om welke driver en welke datasource het gaat. En daar beginnen de foutmeldingen.
Bij het gebruik van een OLEDBConnection treedt de volgende foutmelding op:

InvalidOperationException: The 'InterSystems ODBC' provider is not registered on the local machine.

code:
1
2
3
OleDbConnection myAccessConn = new OleDbConnection("Provider=InterSystems ODBC;
Persist Security Info=False;User ID=joris; 
password=joris;Data Source=TRIAL1DB");


Bij het gebruik van SQLConnection de volgende foutmelding:

ArgumentException: Unknown connection option in connection string: provider.

code:
1
2
3
SqlConnection myConnection = new SqlConnection("Provider=InterSystems ODBC;
Persist Security Info=False;User ID=joris; 
password=joris;Data Source=TRIAL1DB");



Waarschijnlijk gaat het om de naam van de driver (Provider=InterSystems ODBC), deze klopt misschien niet. Hoe kom ik erachter wat wel de juiste naam is. Op de site van InterSystems is daarover niks te vinden. De connectionstring heb ik deels op de volgende manier gekregen:

I create a .txt file on my desktop
rename it to .udl
double click it
Presto! Connection builder pops up
rename it again to .txt
double click it
voila: there is notepad with my connection string

Wat kan ik nu nog doen, zit er een probleem in de connectionstring of zou je via C# helemaal geen Caché database kunnen raadplegen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Een SqlConnection moet je zowiezo niet gebruiken, aangezien die enkel werken met SQL Server databases vanaf versie 7.

Met OleDb zou je in princiepe met iedere RDBMS een connectie moeten kunnen leggen. Echter, caché is een OODBMS, dus ik weet niet of dit zomaar gaat.
Misschien levert Caché wel zelf DataProviders voor z'n DBMS? Misschien kan je dat eens checken?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Mooi de SQLConnection valt dus al af, maar ik neem aan dat je met die DataProvider de odbc-driver bedoelt die ik aan het begin al noemde. Ik krijg ook met OLEDB geen connectie via deze odbc-driver met de Caché-database. Op de site van intersystems staat bijvoorbeeld ook een jdbc:caché koppeling.

Ik neem aan dat de odbc-driver genoeg is om via OLEDB (en dus C#) de database te kunnen raadplegen? Maar hoe doe je dat?

  • sander_g
  • Registratie: Juli 2002
  • Laatst online: 27-05 16:48
Misschien heb je hier wat aan (ODBC .NET Data Provider):
http://www.microsoft.com/...65078E32B1&displaylang=en

Garmin Fēnix 7 Pro | https://www.strava.com/athletes/30783039


Verwijderd

Topicstarter
Heb de ODBC .NET dataprovider geistalleerd en de 2.8 versie van MDAC ook geinstalleerd. Volgens mij kan hij nu de InterSystems ODBC driver vinden, maar krijg nu de volgende foutmelding:
code:
1
2
3
4
5
6
[OdbcException: ERROR [08S01] [Caché ODBC][State : 08S01][Native Code 461]
[C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\aspnet_wp.exe]
UNKNOWN MSG
ERROR [01000] [Microsoft][ODBC Driver Manager] The driver doesn't 
support the version of ODBC behavior that the application requested 
(see SQLSetEnvAttr).]


Maak nu op de volgende manier een verbinding:
code:
1
2
3
OdbcConnection myConn = new OdbcConnection("DRIVER=InterSystems ODBC;
user=joris;password=joris;DATABASE=TRIAL1DB;");
myConn.Open();


Wordt gek 8)7
Wat kan ik nu nog doen?

Verwijderd

Topicstarter
Heb oplossing gevonden. Werk nu met activeX van .NET en kan daardoor rechtstreeks met de Caché objecten werken binnen .NET.
Hieronder de code waarmee een property of method van een Caché-object opgehaald kan worden uit de database (code = C#). Hiervoor moet binnen .NET wel een referentie aangemaakt worden om met Caché objecten te kunnen werken.
code:
1
2
using System.Reflection;
using CacheObject;

en verderop in de class
code:
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
makeConnection(){
  String connectionStr = "cn_iptcp:127.0.0.1[1972]:TRIAL"
  Factory factory = new CacheObject.Factory();
  factory.Connect(connectionStr);
  //parameters die je aan methode van caché wil geven
  Object [] parameters = new Object[0];
  //Object aanmaken
  ObjInstance obj = (ObjInstance) factory.OpenId("User.Klanten", i.ToString(), 0);
  //property van Caché object ophalen
  getProperty(obj, "Naam");
  //method van Caché object ophalen
  invokeMethod(obj, "getNaam", parameters)+"<br>";  
}

static object getProperty(ObjInstance cacheObject, String name) {
  return cacheObject.GetType().InvokeMember(name,  
                    System.Reflection.BindingFlags.GetProperty, 
                    null, cacheObject, null);
}

static object invokeMethod(ObjInstance cacheObject, String name, 
                                           Object [] parameters)  {
  return cacheObject.GetType().InvokeMember(name, 
                    BindingFlags.InvokeMethod, null, cacheObject, null);
}


De OODB is nu eigenlijk transparant, je kunt code kloppen zonder dat je specifieke objecten aan hoeft te maken. Maar je moet dus wel weten hoe je OODB in elkaar steekt.
Pagina: 1