![]() |
|||||||||||||||||
|
|
|||||||||||||||||
|
|
|||||||||
|
Delphi |
DELPHI DEVELOPER SUPPORT
Areas of concentration under: midas Area: midas Problem: Midas is failing under heavy loads. Either a "Server Execution" error occurs or the server just hangs. Area: midas Problem: Using ADO and SQL Server 7. When attempting to Apply updates receive an error, "record was changed by another user." There are no other users. This appears to be caused by a date rounding problem. Area: midas Problem: When an error occurs updating a query that contains a join, conflict information is not available. This is because the code which tries to find the conflicting record is not respecting the pfInWhere ProviderFlag. Workaround:
Replace this method in Provider.pas:
procedure TSQLResolver.GenSelectSQL(Tree:
TUpdateTree; SQL: TStrings;
Params: TParams; Alias: string);
var
i: Integer;
Temp: string;
begin
with PSQLInfo(Tree.Data)^ do
begin
SQL.Add('select');
for i := 0 to Tree.Delta.FieldCount - 1 do
with Tree.Delta.Fields[i] do
if not (DataType in [ftDataSet, ftReference])
and (FieldKind = fkData)
and (pfInWhere in ProviderFlags) then // <
== Fix is here.
SQL.Add(Format('
%s%s%s%1:s,',[QuotedTableDot, QuoteChar,
Origin]));
{ Remove last ',' }
Temp := SQL[SQL.Count-1];
SQL[SQL.Count-1] := Copy(Temp, 1,
Length(Temp) - 1);
SQL.Add(Format(' from %s %s',[QuotedTable,
Alias]));
GenWhereSQL(Tree, SQL, Params,
upWhereKeyOnly, Alias);
end;
end;
Area: midas\socket server Problem: If Blob size is 11 megabytes, an Invalid Pointer exception is returned to client when ApplyUpdates/Refresh are called. Area: midas\tclientdataset Problem: poAutoRefresh does not work for MSSQL Identity or Default columns with ClientDatasets. Workaround: Call Refresh after Applyupdates. Area: midas\tclientdataset Problem: A TLargeintField cannot be used as a calculated field. Workaround:
Replace the CalcFieldTypes in DB.PAS as follows:
procedure TDataSet.BindFields(Binding: Boolean);
const
CalcFieldTypes = [ftString, ftSmallint, ftInteger,
ftWord, ftBoolean,
ftFloat, ftCurrency, ftBCD, ftDate, ftTime,
ftDateTime, ftVariant, ftLargeInt];
Area: midas\tclientdataset Problem: Internally calculated fields are not sorting properly. Workaround:
Replace this method in DBClient.pas:
function
TClientDataSet.CalcFieldsCallBack(RecBuf:
PChar): DBResult;
var
SaveState: TDataSetState;
begin
try
SaveState := SetTempState(dsInternalCalc);
try
CalculateFields(RecBuf);
finally
RestoreState(SaveState);
end;
except
end;
Result := 0;
end;
Area: midas\tclientdataset Problem: Cannot provide from a query that uses an expression in the order by clause such as "ORDER BY UPPER(fldname)" An error: Field 'UPPER(fldname) not found' is generated. Workaround:
Replace this code in GetIndexForOrderBy in
DBCOMMON.PAS:
stFieldName:
begin
LastField := Token;
{ Verify that we parsed a valid field name,
not something like "UPPER(Foo)" }
Dataset.FieldByName(LastField);
Result.Fields := AddField(Result.Fields,
LastField);
end;
Area: midas\tclientdataset Problem: If you try to modify a record that was just inserted to the dataset you will see an error: Mismatch in datapacket. The DataSetProvider control has the poPropagateChanges of the Options property set to true. Area: midas\tclientdataset Problem: When using a client data set saved file if you restart the application after deleting some reconds right before closing down the first session you will get an error message: 'Operation not applicable' //Dataset are cds files// Area: midas\tclientdataset Problem: In certain cases nested client datasets can show the wrong detail record if the current tmaster has no details. Workaround:
Replace this method in DB.PAS:
function TDataSet.GetNextRecord: Boolean;
var
GetMode: TGetMode;
begin
GetMode := gmNext;
if FRecordCount > 0 then
begin
SetCurrentRecord(FRecordCount - 1);
if (State = dsInsert) and (FCurrentRecord =
FActiveRecord) and
(GetBookmarkFlag(ActiveBuffer) = bfCurrent)
then GetMode := gmCurrent;
end else if DataSetField < > nil then
DataSetField.DataSet.UpdateCursorPos;
Result := (GetRecord(FBuffers[FRecordCount],
GetMode, True) = grOK);
if Result then
begin
if FRecordCount = 0 then
ActivateBuffers
else
if FRecordCount < FBufferCount then
Inc(FRecordCount) else
MoveBuffer(0, FRecordCount);
FCurrentRecord := FRecordCount - 1;
Result := True;
end else
CursorPosChanged;
end;
Area: midas\tclientdataset Problem: Calling TClientDataSet.CreateDataSet fails with an invalid parameter error if the FieldDefs for the CDS includes one or more fields of type ftGuid. Workaround:
In DSINTF.PAS replace the following:
FldSubTypeMap: array[TFieldType] of Word = (
0, 0, 0, 0, 0, 0, 0, fldstMONEY, 0, 0, 0, 0, 0, 0,
fldstAUTOINC,
fldstBINARY, fldstMEMO, fldstGRAPHIC,
fldstFMTMEMO, fldstOLEOBJ,
fldstDBSOLEOBJ, fldstTYPEDBINARY, 0,
fldstFIXED, fldstUNICODE,
0, 0, 0, 0, 0, fldstHBINARY, fldstHMEMO, 0, 0, 0,
fldstGUID);
Also, after adding the FieldDef, set the size to 38.
Area: midas\tclientdataset Problem: When applying a status filter for inserted records to a client dataset subsequent edits to the inserted records are not shown. Workaround: Instead of using a StatusFilter to show the inserted records, assign the Delta to another CDS and iterate over it checking the the RecordStatus for rsInserted and process the records in that fashion. Area: midas\tclientdataset Problem: Trying to provide data from a client dataset which contains a wide string field will cause an Access Violation. Workaround:
Requires changes to provider.pas as follows:
procedure
TDataPacketWriter.PutWideStringField(Info:
PPutFieldInfo);
var
W: WideString;
begin
if Info.DataSet.GetFieldData(Info.field, @W, False)
then
begin
Info.Size := Length(W);
FIDSWriter.PutField(fldIsChanged, Info.Size * 2,
PByte(W));
end else
FIDSWriter.PutField(fldIsNull, 0, nil);
end;
Area: midas\tclientdataset Problem: Cannot create a field of type ftWideString in a client dataset by calling CreateDataSet. A ftString field is created instead. Workaround:
Replace this method in DBCLIENT.PAS:
procedure TClientDataSet.EncodeFieldDesc(var
FieldDesc: DSFLDDesc;
const Name: string; DataType: TFieldType; Size,
Precision: Integer;
Calculated: Boolean; Attributes: TFieldAttributes);
begin
with FieldDesc do
begin
FillChar(FieldDesc, SizeOf(FieldDesc), #0);
StrCopy(szName, PChar(Name));
if DataType = ftWideString then
iFldType := fldUNICODE else
iFldType := FieldTypeMap[DataType];
iFldSubType := FldSubTypeMap[DataType];
bCalculated := Calculated;
iFldAttr := Integer(Byte(Attributes));
case DataType of
ftADT, ftArray, ftDataSet, ftString, ftFixedChar,
ftGUID, ftBytes,
ftVarBytes, ftBlob..ftTypedBinary, ftOraClob,
ftOraBlob, ftWideString:
iUnits1 := Size;
ftBCD:
begin
{ Default precision is 32, Size = Scale }
if (Precision > 0) and (Precision < = 32)
then
iUnits1 := Precision else
iUnits1 := 32;
iUnits2 := Size; {Scale}
end;
end;
end;
end;
Area: midas\tclientdataset Problem: If you try to set a WideString type to be a new field of a TClientDataSet you will get an error message: Field 'name' cannot be a calculated or lookup filed. Area: midas\tdatasetprovider Problem: Control over manual transactions is not possible with TDBDatasets. An error message occurs "A user transaction is already in progress." Workaround:
Requires a VCL code change, replace this method
in dbtables.pas:
function TDBDataSet.PSInTransaction: Boolean;
var
Database: TDatabase;
begin
Result := False;
if Assigned(Sessions.List[SessionName]) then
begin
Database :=
Sessions.List[SessionName].DoFindDatabase(Data
baseName, Owner);
Result := Assigned(Database) and
Database.InTransaction;
end;
end;
Area: midas\tdatasetprovider Problem: A mismatch in datapacket error can occur if using the ApplyUpdates method of TCustomProvider (the overloaded version that does not have the OwnerData parameter. Workaround: Call the version of ApplyUpdates that has the OwnerData parameter instead. or Replace this method in Provider.pas: function TCustomProvider.ApplyUpdates(Const Delta: OleVariant; MaxErrors: Integer; out ErrorCount: Integer): OleVariant; var OwnerData: OleVariant; begin Result := ApplyUpdates(Delta, MaxErrors, ErrorCount, OwnerData); end; Area: midas\tprovider Problem: When Server has RegisteredPooled setting, if I run numerous clients against it, each updating a different record, for about 20 minutes, all the clients stop responding, and you have to shut them down with task manager. Area: midas\webmidas Problem: Get error 'Record changed by another user' trying to update detail records with both Netscape and IE. (Note: error only occurs when change is on first record of child. Also, doesn't happen with all servers.) Area: midas\webmidas Problem: When a Midas Server has 95 master records and 830 detail records, a Midas Web App brings Netscape down with out of memory error. Memory usage jumps suddenly from 13 megs to 79 megs. This does not happen with Internet Explorer when using XML Islands.NOTE: These listings are for informational use only. It is not intended for use when calling Borland's Developer Support Department. If you have any suggestions or complaints about these 'Delphi Enhancements and Fixes' pages, please contact the Delphi Administrator. This e-mail address is not intended for support issues. |
|
|
|
|||||
| Made in Borland® Copyright© 1994-2003 Borland Software Corporation. All rights reserved. Report Piracy, Legal Notices, Privacy Policy | |||||