# LibNoDave DB Länge



## The-Cook (28 Mai 2009)

Hallo zusammen,

gibt es eine Möglichkeit die DB länge auszulesen?


----------



## Ralle (28 Mai 2009)

Mit der Suchfunktion und genau deinen Begriffen hättest du folgendes gefunden:
http://www.sps-forum.de/showthread.php?t=27877&highlight=Libnodave+DB+L%E4nge


----------



## The-Cook (28 Mai 2009)

vielen dank für die antwort.

ich muss allerdings das ganze unter C# entwickeln. und hab kein plan von java


----------



## argv_user (28 Mai 2009)

Außer zu Backup-Zwecken bei Systemen, die ich nicht kenne, sehe ich
keine Veranlassung dazu, daher die vielleicht 
blöde Frage: warum willst Du überhaupt eine DB-Länge ermitteln?
Würde mich mal interessieren.

Ansonsten funktioniert fast immer die Methode mit dem Ausprobieren:
Kann ich n Worte lesen ? Ja: probiere n+1, Nein: war eins zuviel.


----------



## The-Cook (28 Mai 2009)

Habe mal so angefangen:

public struct DaveBlockInfo
{
public char[] type;
public char[] x1;
public char[] w1;
public char[] pp; /* allways 'pp' */
public short[] x2; /* 00 4A */
public short number; /* the block's number */
public short[] x3 ; /* ? */
public short length; /* the block's length */
public char[] x4;
public char[] name;
public char[] x5;
}

[DllImport("libnodave.dll"/*, PreserveSig=false */ )]
protected static extern int daveGetBlockInfo(IntPtr daveCon, ref DaveBlockInfo daveBlockInfo, int type, int db);
public int GetDBLength(int db)
{
DaveBlockInfo dbi = new DaveBlockInfo();
dbi.type = new char[2];
dbi.x1 = new char[2];
dbi.w1 = new char[2];
dbi.pp = new char[2];
dbi.x2 = new short[4];
dbi.x3 = new short[26];
dbi.x4 = new char[16];
dbi.name = new char[8];
dbi.x5 = new char[12];
int ret = daveGetBlockInfo(this.daveConnection.pointer, ref dbi, libnodave.daveDB, db);
 
return ret;
}
 

vielleicht kann mir hier jemand weiterhelfen.

Bekomme folgende Fehlermeldung:

"Das angegebene Array hat nicht den erwarteten Typ."


----------



## RobiHerb (3 Juni 2009)

*Nur eine Auffälligkeit*

Soweit ich sehe, ist der struct Member length nicht initialisiert, somit auch nach meinem C# Verständnis nicht allociert (auch int sind Objekte).

Vielleicht hilft es?


----------



## The-Cook (3 Juni 2009)

Vielen Dank für die Antwort.

Habe einen Weg gefunden:


```
[SIZE=2][COLOR=#0000ff]private[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] GetLenght([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] nr, [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] blockType)
{
[/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] ret = [/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2].MinValue;
[/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] len = 0;
[/SIZE][SIZE=2][COLOR=#0000ff]byte[/COLOR][/SIZE][SIZE=2][] blockBuffer = [/SIZE][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]byte[/COLOR][/SIZE][SIZE=2][65536];
[/SIZE][SIZE=2][COLOR=#0000ff]this[/COLOR][/SIZE][SIZE=2].daveConnection.getProgramBlock(blockType, nr, blockBuffer, [/SIZE][SIZE=2][COLOR=#0000ff]ref[/COLOR][/SIZE][SIZE=2](len));
ret = [/SIZE][SIZE=2][COLOR=#2b91af]libnodave[/COLOR][/SIZE][SIZE=2].getU16from(blockBuffer, 34);
 
[/SIZE][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] ret;
}
[/SIZE]
```


----------

