Меню сайта
Мини-чат
Чтобы добавить сообщение, необходимо авторизоваться.
Главная » Статьи » Не стандартные примеры на Delphi » Базы Данных

Импорт CSV ASCII

...вот то, что вам нужно. Я использую этот компонент для работы с разделителем при импорте ASCII.

Dave


    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
Категория: Базы Данных | Добавил: DelphiAiX (20.05.2012)
Просмотров: 744 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]