⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysqldataset.pas

📁 MYSQL 连接控件 MYSQL 连接控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  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 + -