📄 mysqldataset.pas
字号:
Pos := FDataSet.RecNo;
if (Pos < 0) and (FDataSet.RecordCount > 0) then Pos := 0
else if Pos >= FDataSet.RecordCount then Pos := FDataSet.RecordCount - 1;
if (Pos >= 0) and (Pos < FDataSet.RecordCount) then begin
Rec := FDataSet.Records[Pos];
if Assigned(Rec) then
Result := Rec.Data[FField.FieldNo-1];
end;
end;
function TMySQLBlobStream.Read(var Buffer; Count: Longint): Longint;
begin
Result := 0;
if FOpened then begin
if Count > Size - FPosition then Result := Size - FPosition
else Result := Count;
if Result > 0 then begin
if FCached then begin
Move(PChar(FDataSet.GetBlobData(FField, FBuffer))[FPosition], Buffer,
Result);
Inc(FPosition, Result);
end
else begin
Move(PChar(GetBlobFromRecord(FField))[FPosition], Buffer,
Result);
Inc(FPosition, Result);
end;
end;
end;
end;
function TMySQLBlobStream.Write(const Buffer; Count: Longint): Longint;
var
Temp: TBlobData;
begin
Result := 0;
if FOpened and FCached and (FMode <> bmRead) then begin
Temp := FDataSet.GetBlobData(FField, FBuffer);
if Length(Temp) < FPosition + Count then
SetLength(Temp, FPosition + Count);
Move(Buffer, PChar(Temp)[FPosition], Count);
FDataSet.SetBlobData(FField, FBuffer, Temp);
Inc(FPosition, Count);
Result := Count;
FModified := True;
end;
end;
function TMySQLBlobStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
case Origin of
0: FPosition := Offset;
1: Inc(FPosition, Offset);
2: FPosition := GetBlobSize + Offset;
end;
Result := FPosition;
end;
procedure TMySQLBlobStream.Truncate;
begin
if FOpened and FCached and (FMode <> bmRead) then begin
FDataSet.SetBlobData(FField, FBuffer, '');
FModified := True;
end;
end;
function TMySQLBlobStream.GetBlobSize: Longint;
begin
Result := 0;
if FOpened then
if FCached then
Result := Length(FDataSet.GetBlobData(FField, FBuffer))
else
Result := Length(GetBlobFromRecord(FField))
end;
//**********************************************************************
// TMySQLDatasetBase
//**********************************************************************
constructor TMySQLDatasetBase.Create;
begin
FOptions := [doShareConnection,doMacrosEnabled,doMacroCheck,do2KStrToMemo,doUseCursor];
FConstraints := TCheckConstraints.Create(Self);
FCustomFieldDefs := TFieldDefs.Create(Self);
FIndexDefs := TIndexDefs.Create(Self);
FMasterFields := TStringList.Create;
FMasterLink := TMasterDataLink.Create(Self);
FMasterLink.OnMasterChange := MasterChanged;
FMasterLink.OnMasterDisable := MasterDisabled;
FInTransaction := False;
FResultChanged := False;
FResultComplete := False;
FResult := nil;
FResultType := rtLocal;
FReadOnly := False;
FServer := nil;
FConnection := nil;
FDatabaseName := '';
FTableName := '';
FFieldName := '';
FMemoToStrLimit := 65536;
FFieldInfo := TStringList.Create;
FDBInfo := TStringList.Create;
FDBInfo.Sorted := True;
FDBInfo.Duplicates := dupIgnore;
FTableInfo := TStringList.Create;
FTableInfo.Sorted := True;
FTableInfo.Duplicates := dupIgnore;
FRecInfo := nil;
FSQL := TStringList.Create;
FSQLUpdate := TStringList.Create;
FSQLInsert := TStringList.Create;
FSQLDelete := TStringList.Create;
FSQLBatch := TStringList.Create;
FSQLCached := TStringList.Create;
TStringList(FSQL).OnChanging := SQLChanging;
TStringList(FSQLUpdate).OnChanging := SQLChanging;
TStringList(FSQLInsert).OnChanging := SQLChanging;
TStringList(FSQLDelete).OnChanging := SQLChanging;
TStringList(FSQLBatch).OnChanging := SQLChanging;
TStringList(FSQL).OnChange := SQLChange;
TStringList(FSQLUpdate).OnChange := SQLChange;
TStringList(FSQLInsert).OnChange := SQLChange;
TStringList(FSQLDelete).OnChange := SQLChange;
TStringList(FSQLBatch).OnChange := SQLChange;
FMacros := TParams.Create(Self);
{$IFNDEF CONSOLEAPP}
FCursor := crSQLWait;
{$ENDIF}
SetMacroString(DefaultMacroString);
FSQL.Add('select '+FMacroStringStart+'$FIELDS'+FMacroStringEnd+' from '+FMacroStringStart+'$TABLENAME'+FMacroStringEnd+' '+FMacroStringStart+'JOIN'+FMacroStringEnd+' '+FMacroStringStart+'WHERE'+FMacroStringEnd+' '+FMacroStringStart+'GROUPBY'+FMacroStringEnd+' '+FMacroStringStart+'ORDER'+FMacroStringEnd+' '+FMacroStringStart+'LIMIT'+FMacroStringEnd);
FSQLUpdate.Add('update '+FMacroStringStart+'$TABLENAME'+FMacroStringEnd+' set '+FMacroStringStart+'$MODIFIED$FIELDS&VALUES'+FMacroStringEnd+' where '+FMacroStringStart+'$PRIMARYFIELDS&VALUES'+FMacroStringEnd);
FSQLInsert.Add('insert into '+FMacroStringStart+'$TABLENAME'+FMacroStringEnd+' set '+FMacroStringStart+'$MODIFIED$FIELDS&VALUES'+FMacroStringEnd);
FSQLDelete.Add('delete from '+FMacroStringStart+'$TABLENAME'+FMacroStringEnd+' where '+FMacroStringStart+'$PRIMARYFIELDS&VALUES'+FMacroStringEnd);
FLastInsertID := '0';
FAffectedRows := '0';
FQueryInfo := '';
inherited;
end;
constructor TMySQLTable.Create;
begin
inherited;
FOptions := [doShareConnection,doMacrosEnabled,doMacroCheck,do2KStrToMemo,doRetrieveFieldValues,doRetrieveIndexDefs,doUseCursor];
end;
destructor TMySQLDatasetBase.Destroy;
begin
Close;
if Assigned(Server) then Server.UnregisterClient(Self);
DeactivateConnection;
inherited;
Server := nil;
FreeAndNil(FConstraints);
FreeAndNil(FCustomFieldDefs);
FreeAndNil(FIndexDefs);
FreeAndNil(FMasterLink);
FreeAndNil(FMasterFields);
FreeAndNil(FDBInfo);
FreeAndNil(FTableInfo);
FreeAndNil(FRecInfo);
FreeAndNil(FFieldInfo);
FreeAndNil(FSQL);
FreeAndNil(FSQLUpdate);
FreeAndNil(FSQLInsert);
FreeAndNil(FSQLDelete);
FreeAndNil(FSQLBatch);
FreeAndNil(FSQLCached);
FreeAndNil(FMacros);
end;
procedure TMySQLDatasetBase.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
// Reading of forms which have been designed with older versions of the MyComponents
// This converts the properties to the new place in Options
Filer.DefineProperty('AllFieldValues', ReadAllFieldValues, nil, False);
Filer.DefineProperty('MacrosEnabled', ReadMacrosEnabled, nil, False);
end;
procedure TMySQLDatasetBase.ReadAllFieldValues(Reader: TReader);
begin
if Reader.ReadBoolean then
Include(FOptions,doRetrieveFieldValues)
else
Exclude(FOptions,doRetrieveFieldValues);
end;
procedure TMySQLDatasetBase.ReadMacrosEnabled(Reader: TReader);
begin
if Reader.ReadBoolean then
Include(FOptions,doMacrosEnabled)
else
Exclude(FOptions,doMacrosEnabled);
end;
procedure TMySQLDatasetBase.Execute(const WaitFor: boolean=False);
begin
{$IFDEF MSWINDOWS}
if doThreadedUpdate in Options then
ThreadDatasetOpen(Self,FOnThreadOpened,WaitFor)
else begin
Open;
if Assigned(FOnThreadOpened) then FOnThreadOpened(Self);
end;
{$ELSE}
Open;
{$ENDIF}
end;
procedure TMySQLDatasetBase.ActivateConnection;
begin
if Active then Exit;
if not Assigned(Server) then MYSQLError(nil,nil,-1,'No dataset server selected for open');
if not Server.Connected then Server.Connected := True;
if not Server.Connected then {exit; }MYSQLError(Server.Driver,nil,-1,'Dataset server could not connect');
if ShareConnection then
FConnection := Server.Driver.Connection
else
if not Assigned(FConnection) then FConnection := Server.AllocConnection;
if not Assigned(FConnection) then MYSQLError(Server.Driver,FConnection,-1,'No server connection');
if not IsCursorOpen then Server.SelectDatabase(FDatabaseName,FConnection);
end;
procedure TMySQLDatasetBase.DeactivateConnection;
begin
if Assigned(Server) and Assigned(FConnection) then begin
ClearRest;
Server.FreeConnection(FConnection);
// 2004-06-25
// if not ShareConnection then Server.FreeConnection(FConnection)
// else FConnection := nil;
end;
end;
procedure TMySQLDatasetBase.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
end;
procedure TMySQLDatasetBase.ConnectEvent(Sender: TObject; Connecting: Boolean);
begin
if not Connecting and Active then Close;
end;
function TMySQLDatasetBase.GetSelectFields: string;
var
i: integer;
S: string;
begin
Result := '*';
if Self is TMySQLTable then exit;
if not DefaultFields and (Fields.Count>0) then begin
S := '';
for i := 0 to Fields.Count-1 do if Fields[i].FieldKind=fkData then S := S+FormatIdentifier(Fields[i].FieldName)+',';
if length(S)>0 then begin
SetLength(S,length(S)-1);
Result := S;
end;
end;
end;
function TMySQLDatasetBase.GetMasterAndFilter: string;
var
i: integer;
S,F: string;
begin
if Filtered and (length(Filter)>0) then
F := '('+Filter+')'
else
F := '';
Result := F;
if Assigned(FMasterLink) and Assigned(FMasterLink.DataSource) and (FMasterFields.Count>0) then begin
S := '';
for i := 0 to FMasterFields.Count-1 do
if Assigned(FMasterLink.DataSet) and (FMasterLink.Active) and (FMasterLink.Dataset.Active) and
Assigned(FMasterLink.DataSet.FindField(FMasterFields.Values[FMasterFields.Names[i]])) and
(FMasterLink.Dataset.RecordCount>0) and
not(FMasterLink.DataSet.FindField(FMasterFields.Values[FMasterFields.Names[i]]).IsNull) then
S := S+'('+FormatIdentifier(FMasterFields.Names[i])+'='+QEscFieldValue(FMasterLink.DataSet.FieldByName(FMasterFields.Values[FMasterFields.Names[i]]))+') AND '
else
S := S+'('+FormatIdentifier(FMasterFields.Names[i])+'=NULL) AND ';
if (length(S)>0) and (length(F)=0) then SetLength(S,length(S)-5)
else S := S+F;
Result := S;
end;
end;
procedure TMySQLDatasetBase.SetFiltered(Value: boolean);
begin
if Value<>Filtered then begin
inherited;
if Active then Refresh;
end;
end;
procedure TMySQLDatasetBase.SetFilterText(const Value: string);
begin
if Value<>Filter then begin
ParseSQL(Value);
inherited;
if Active and Filtered then Refresh;
end;
end;
function TMySQLDatasetBase.GetMasterFields: string;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -