[ASP.NET / Delphi] Text velden van database uitlezen mislukt

Pagina: 1
Acties:

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
We proberen tekst (memo) uit een ms access database te halen.
Dit gebeurd d.m.v. Delphi 8, en gebruiken een BdpDataReader.

Echter, van de bijv. 1500 karakters krijgen we er maar 1000 terug (ongeveer)
Oftewel, de output wordt gewoon ergens afgekapt en dat gebeurd zonder verdere foutmeldingen of fouten.

De code:
code:
1
2
3
4
5
6
7
8
9
10
11
lengte : integer;
startindex : integer;
buffer : array of char;

lengte := Reader.GetChars(index, 0, nil, 0, 0);
if lengte > 0 then begin
  startindex:=0;
  SetLength(buffer,lengte);
  Reader.GetChars(index,startindex,buffer,0,lengte);
  Result:=buffer;
end;


Simpel... Na veel documentatie te hebben doorgelezen, gebruiken we nu sequentialAccess bij het uitvoeren van de SQL query.

Volgens de deze site (borland): http://bdn.borland.com/article/0,1410,31939,00.html
kan er niet vanaf een bepaalde offset gestart worden met lezen in zo'n memo. Anders hadden we de data wel in stappen uitgelezen, (natuurlijk is dit vaak en zorgvuldig geprobeerd en getest).
BLOB data can be accessed as a byte array or a character array by calling GetBytes() or GetChars() . A null buffer passed to these methods returns the size of the BLOB data available. The current implementation of BdpDataReader does not support fetching BLOB data by specifying offsets.
Wie weet hier meer van? Kortere teksten dan 1000 tekens worden moeiteloos uitgelezen. Langere worden afgekapt zonder onze opdracht. :(

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Weet je zeker dat je niet herhaaldelijk getchars moet aanroepen (hoewel de documentatie zou zeggen van niet). Bijvoorbeeld omdat hij jouw elke keer gedeelten van <1000 tekens terug geeft?

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
ja dat weet ik vrijwel zeker... omdat dat simpelweg niet werkt.

Met de BdpDataAdapter kun je niet vanaf een bepaalde offset beginnen.
En hij geeft bovendien niet de waarde: 'uitgelezen aantal chars' terug,
maar dat is het belangrijkste zo net nog niet.

Verwijderd

Heb dit gevonden misschien heb je er wat aan.
Delphi:
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
procedure TWinForm19.Button1_Click(sender: System.Object; e: System.EventArgs);
var
  TempSQL: string;
  Reader: bdpDataReader;
  Str: System.string;
  AC: array of Char;
  Len: integer;
begin
  TempSQL := 'SELECT NOTES FROM BIOLIFE WHERE SPECIES_NO = 90020';
  BdpCommand1.CommandText := TempSQL;
  bdpCommand1.Connection.Open;
  try
    Reader := BdpCommand1.ExecuteReader(CommandBehavior.SequentialAccess);
    while Reader.Read do
    begin
      Len := Reader.GetChars(0, 0, nil, 0, 0);
      SetLength(AC, Len);
      Reader.GetChars(0, 0, AC, 0, Len);
      Str := System.String.Create(AC);
    end;
    TextBox1.Text := Str;
  finally
    bdpCommand1.Connection.Close;
  end;
end;

Bron:
http://www.lemanix.com/nick/archive/2004/02/28/170.aspx

[ Voor 3% gewijzigd door Verwijderd op 02-10-2004 22:27 ]


  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
code:
1
2
3
      Str := System.String.Create(AC);
    end;
    TextBox1.Text := Str;


Het zou hem dan hier in moeten zitten...
Een System.String.Create ... maar ik betwijfel het want als ik
AC bekijk (breakpoint) dan staat ook maar dat deel erin wat ik uiteindelijk terugkrijg...

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
Zitten hier nog experts op dit vlak?

Zou het hem ook in de databasedriver kunnen zitten? Ik verklaar die dingen namelijk ook niet heilig....

  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

Is de inhoud van die text veld ook door je eigen applicatie ingevuld?

Als dit wel het geval is dan even die code hier zetten.

Anders werkt GetString niet i.p.v. GetChars? Het is toch een text column?

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
cimbom schreef op 07 oktober 2004 @ 13:55:
Is de inhoud van die text veld ook door je eigen applicatie ingevuld?

Als dit wel het geval is dan even die code hier zetten.

Anders werkt GetString niet i.p.v. GetChars? Het is toch een text column?
Ja het is een Memo (vanuit Access gezien) dus dit komt neer op een Text of een blob. Komt op hetzelfde neer. (mediumblob, mediumtext, longblob, longtext in mysql gezien) Alleen de ene kan alleen ASCII accepteren en de andere base64/bytes?

  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

Ik heb het met delphi 8 geprobeerd maar ik kreeg het ook niet aan de praat.
Met VS.NET c# was het gelijk goed.
met Oledb componenten.

Het rare was ook dat met delphi componenten kreeg bij var Len 2 keer zo lange lengte terug. Dus als er 1100 karakters zijn dan zag ik bij debuggen Len waarde krijgen van 2200. Maar bij mij lukte helemaal niet om Str variable goed in te vullen. Het kreeg iedere keer maar 1 karakter als waarde terwijl AC wel ingevuld was.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 15:35

Tomatoman

Fulltime prutser

cimbom schreef op 07 oktober 2004 @ 23:38:
Het rare was ook dat met delphi componenten kreeg bij var Len 2 keer zo lange lengte terug. Dus als er 1100 karakters zijn dan zag ik bij debuggen Len waarde krijgen van 2200.
Dat duidt erop dat je geen string terugkrijgt, maar een WideString (een unicode string). Probeer de string eens te lezen als een array of WideChar in plaats van een array of Char.

Een goede grap mag vrienden kosten.


  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
Als ik de result van de code in een bestand schrijf, krijg ik op de plaats waar tekens horen te staan, na het punt waar mijn tekst stopt: spaties...

[ Voor 14% gewijzigd door Cheater op 09-10-2004 10:49 ]


  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
hardnekkige oplossing:

oledb als dataprovider gebruiken, en geen Bdpcomponenten...

It solves all problems, maar brengt misschien nieuwe problemen met zich mee... Het hele project wordt nu omgebouwd naar de oledb manier.

[ Voor 1% gewijzigd door Cheater op 09-10-2004 13:17 . Reden: typo ]


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 16:34

alienfruit

the alien you never expected

Hmm, ik ben juist overgestapt van ADODB na de BDP componenten :)

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 20-05 23:28
Ik zou zeggen test METEEN eerst of je kunt wat wij niet konden (het probleem van hierboven). Als je dan ziet dat het zo'n gekloot is zul je vast wel weer overstappen naar een ander....
Pagina: 1