Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Импорт CSV ASCII

01.01.2007
unit Cdbascii;
 
interface
 
uses
 
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, DbiErrs, DbiTypes, DbiProcs, DB, DBTables;
 
type
 
  TAsciiDelimTable = class(TTable)
  private
{ Private declarations }
    fQuote: Char;
    fDelim: Char;
  protected
{ Protected declarations }
    function CreateHandle: HDBICur; override;
    procedure SetQuote(newValue: Char);
    procedure SetDelim(newValue: Char);
  public
{ Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
{ Эти свойства не должны больше публиковаться }
    property IndexFieldNames;
    property IndexName;
    property MasterFields;
    property MasterSource;
    property UpdateMode;
  published
{ Published declarations }
    property Quote: Char read fQuote write setQuote default '"';
    property Delim: Char read fDelim write setDelim default ',';
  end;
 
procedure Register;
 
implementation
 
uses DBConsts;
 
procedure Register;
begin
 
  RegisterComponents('Data Access', [TAsciiDelimTable]);
end;
 
constructor TAsciiDelimTable.Create(AOwner: TComponent);
begin
 
  inherited Create(AOwner);
  Exclusive := True;
  TableType := ttASCII;
  fQuote := '"';
  fDelim := ',';
end;
 
destructor TAsciiDelimTable.Destroy;
begin
 
  inherited Destroy;
end;
 
{ Рабочий код }
 
function CheckOpen(Status: DBIResult): Boolean;
begin
 
  case Status of
    DBIERR_NONE:
      Result := True;
    DBIERR_NOTSUFFTABLERIGHTS:
      begin
        if not Session.GetPassword then DbiError(Status);
        Result := False;
      end;
  else
    DbiError(Status);
  end;
end;
 
function TAsciiDelimTable.CreateHandle: HDBICur;
const
 
  OpenModes: array[Boolean] of DbiOpenMode = (dbiReadWrite, dbiReadOnly);
  ShareModes: array[Boolean] of DbiShareMode = (dbiOpenShared, dbiOpenExcl);
var
 
  STableName: array[0..SizeOf(TFileName) - 1] of Char;
  SDriverType: array[0..12] of Char;
begin
 
  if TableName = '' then DBError(SNoTableName);
  AnsiToNative(DBLocale, TableName, STableName, SizeOf(STableName) - 1);
  StrPCopy(SDriverType, 'ASCIIDRV-' + Quote + '-' + Delim);
  Result := nil;
  while not CheckOpen(DbiOpenTable(DBHandle, STableName, SDriverType,
    nil, nil, 0, OpenModes[ReadOnly], ShareModes[Exclusive],
    xltField, False, nil, Result)) do {Повтор}
    ;
end;
 
procedure TAsciiDelimTable.SetQuote(newValue: Char);
begin
 
  if Active then
{    DBError(SInvalidBatchMove); };
  fQuote := newValue;
end;
 
procedure TAsciiDelimTable.SetDelim(newValue: Char);
begin
 
  if Active then
{    DBError(SInvalidBatchMove); };
  fDelim := newValue;
end;
 
end.

Взято из Советов по Delphi от Валентина Озерова

Сборник Kuliba