【问题标题】:How convert Advantage API Sample C Code To Delphi如何将 Advantage API 示例 C 代码转换为 Delphi
【发布时间】:2013-12-06 19:06:53
【问题描述】:

我正在尝试将 Advantage Database 文档中的示例代码转换为 Delphi,但似乎无法正确声明变量,从 varType 开始,也无法计算出 MAX_STR_LEN(常量、函数、其他?)。

这是示例中的代码:

 UNSIGNED32 DoDates( void )
 {  
      ADSHANDLE hTable;
      UNSIGNED16 usLength;
      UNSIGNED8 aucDOB[MAX_STR_LEN+1];
      ...
      usLength = MAX_STR_LEN+1
      AdsGetDate( hTable, "DOB", aucDOB, &usLength );
      ... 
 }

我试过的Delphi代码是:

 procedure TForm1.fixARInvoiceEntryHeaderDates;
 var
      tableHandle:ADSHandle;
      aucDOB:pansichar;
      usLength:punsigned16;

 begin
      ...
      AdsGetDate(
      tableHandle,
      'inv_date',
      aucDOB,
      &usLength);
      ...
 end;

【问题讨论】:

  • 顺便说一句,您是否知道 Advantage 有一组 Delphi 组件,它们是 TDataSet 的后代?它们使您可以使用普通的表或查询操作并使用Table.FieldByName('DOB').AsDateTime 访问字段。它们可从 Advantage 网站免费获得。
  • 好的,谢谢。我这样做只是为了修复损坏的日期值(TAdsTable 函数会导致 5095 错误)。

标签: delphi advantage-database-server


【解决方案1】:

MAX_STR_LEN 在 Advantage Client Engine Sample Code 帮助主题中定义为 255,位于您为 DoDates 示例引用的页面的最顶部。他们这样声明是因为他们在整个示例代码中都使用了它,所以它足够大,可以用来返回各种类型的数据(字符、日期和其他类型的字符串内容)。

如果您只打算使用专门用于检索日期的缓冲区,则可以使用更小的缓冲区大小,因为没有任何 ADS 日期类型或格式接近那么长。 (我在下面的示例中使用了 49 个单字节字符(字节)的缓冲区大小,它仍然至少是所需大小的 2 倍。)

这样的事情应该可以工作:

// Reduced because of intended use. See text above, 2nd paragraph.
// If you're using this buffer for things other than dates,
// change to 255 as original code did.

const
  MAX_STR_LEN = 49;  

type
  TCharDateBuffer = array[0..MAX_STR_LEN + 1] of AnsiChar;

var
  DateBuffer: TCharDateBuffer;
  BuffSize: UNSIGNED16;       // From Ace.pas
  tableHandle: ADSHandle;     // From Ace.pas
begin
  // Your code to open the table and get the handle

  BuffSize := MAX_STR_LEN;
  AdsGetDate(tableHandle, 'DOB', DateBuffer, @BuffSize);
end;

不过,如果您使用他们的 TDataSet descendant 组件(例如,TAdsTableTAdsQuery),那么从 Delphi 会容易得多。然后您可以使用普通的TField 属性:

// Retrieve DOB as string
StrDOB := MyAdsTable.FieldByName('DOB').AsString;

// Get DOB as TDateTime
DOB := MyAdsTable.FieldByName('DOB').AsDateTime;

// Set date field to today
MyAdsTable.FieldByName('CHANGED').AsDateTime := Date;

`Advantage TDataSet 组件可从其Product Downloads 页面获得;单击您正在使用的 Advantage 版本的链接,您会在该版本的页面上找到指向组件的链接。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2015-11-27
    • 1970-01-01
    • 2016-05-17
    相关资源
    最近更新 更多