Sinds 2 weken ben ik bezig geweest om een query-tool te maken om data te gebruiken uit een navision database(native). Zo'n tool kan connectie maken via c/front en odbc. Ik heb hier een reference guide voor c/front in c++ en natuurlijk de cfront.dll.
ik ben begonnen met een kleine opzet dwz ff rustig connectie maken, kijken welke tabellen erzijn, data ophalen etc. Dit allemaal via een listbox voor de resultaten, console.writeline voor waar hij de functies ingaat, en een editbox voor mijn commands.
(navision 3.60, driver is 3.70, code gemaatk in visual c# .net)
Het is me gelukt om:
-connectie te maken en te disconnecten
-Tabellen opvragen
-de velden van een tabel opvragen
Maar ik zit nu bij de records op te vragen. Het lukt me niet op waardes te vragen en in een array/string te zetten.
dll inlaad stukje
htable is een pointer naar de tabel en hrecord een pointer naar de record.
dit is het gedeelte van de parser:
Wat hij returned is: "4 temp string". Dus de functie werkt maar de waarde wordt niet in s gezet.
Volgens de reference is de 1e parameter een void*. Dit betekend dat hij alles kan returnen, alleen hoe vang ik dat op in C#?
In de reference staat een voorbeeldje in c++ met deze void* en geeft als 1e een char array mee, dus:
geeft terug "4". Weederom geen data.
omdat de 1e parameter een in/out variable is heb ik ipv s, ref s gebruikt. Dit bij beide voorbeelden geen succes.
bij voorbeeld 1:
bij voorbeeld 2:
Heeft iemand welles met de SDK van Navision gewerkt of een eenzelfde probleem ondervonden met void* en heeft hiervoor tips/oplossing?
ik ben begonnen met een kleine opzet dwz ff rustig connectie maken, kijken welke tabellen erzijn, data ophalen etc. Dit allemaal via een listbox voor de resultaten, console.writeline voor waar hij de functies ingaat, en een editbox voor mijn commands.
(navision 3.60, driver is 3.70, code gemaatk in visual c# .net)
Het is me gelukt om:
-connectie te maken en te disconnecten
-Tabellen opvragen
-de velden van een tabel opvragen
Maar ik zit nu bij de records op te vragen. Het lukt me niet op waardes te vragen en in een array/string te zetten.
dll inlaad stukje
code:
1
2
| [DllImport("cfront.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int DBL_GetFieldData( string dst, int dstsize, int hTable, int hrecord, int fieldnr); |
htable is een pointer naar de tabel en hrecord een pointer naar de record.
dit is het gedeelte van de parser:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| case "lr" : //list records
int hrecord = DBL_AllocRec(htable);
DBL_InitRec(htable, hrecord);
string s = "temp string";
if (DBL_FindRec(htable, hrecord ,"-") )
{
int j = DBL_GetFieldData(s,100,htable, hrecord,1); //j is het aantal bytes van de data
Result.Add(Convert.ToString(j) + s);
Console.WriteLine("eerste record gevonden");
};
DBL_FreeRec(record);
break; |
Wat hij returned is: "4 temp string". Dus de functie werkt maar de waarde wordt niet in s gezet.
Volgens de reference is de 1e parameter een void*. Dit betekend dat hij alles kan returnen, alleen hoe vang ik dat op in C#?
In de reference staat een voorbeeldje in c++ met deze void* en geeft als 1e een char array mee, dus:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| case "lr" : //list records
int hrecord = DBL_AllocRec(htable);
DBL_InitRec(htable, hrecord);
char[] s = new char[100];
if (DBL_FindRec(htable, hrecord ,"-") )
{
int j = DBL_GetFieldData(s,100,htable, hrecord,1);
for (int k = 0 ; k < 100 ; k++)
{
temp = temp + s[k];
}
Result.Add(Convert.ToString(j) + temp);
Console.WriteLine("eerste record gevonden");
};
DBL_FreeRec(record);
break; |
geeft terug "4". Weederom geen data.
omdat de 1e parameter een in/out variable is heb ik ipv s, ref s gebruikt. Dit bij beide voorbeelden geen succes.
bij voorbeeld 1:
code:
1
2
3
| An unhandled exception of type 'System.NullReferenceException' occurred in csharptest.exe Additional information: Object reference not set to an instance of an object. |
bij voorbeeld 2:
code:
1
2
3
| An unhandled exception of type 'System.Runtime.InteropServices.MarshalDirectiveException' occurred in csharptest.exe Additional information: Can not marshal parameter #1: Ansi char arrays can not be marshaled as byref or as an unmanaged-to-managed parameter. |
Heeft iemand welles met de SDK van Navision gewerkt of een eenzelfde probleem ondervonden met void* en heeft hiervoor tips/oplossing?
[ Voor 4% gewijzigd door PoweRoy op 06-02-2006 13:54 ]
[This space is for rent]