基本判定是源代码OracleConnection.pp中以下过程的问题:
对于Oracle字段类型的判断未充分考虑
procedure TOracleConnection.AddFieldDefs(cursor: TSQLCursor; FieldDefs: TFieldDefs);
var Param : POCIParam;
tel : ub4;
FieldType : TFieldType;
FieldName : string;
FieldSize : word;
OFieldType : ub2;
OFieldName : Pchar;
OFieldSize : sb4;
OFNameLength : ub4;
NumCols : ub4;
FOciDefine : POCIDefine;
OPrecision : sb2;
OScale : sb1;
begin
Param := nil;
with cursor as TOracleCursor do
begin
if OCIAttrGet(FOciStmt,OCI_HTYPE_STMT,@numcols,nil,OCI_ATTR_PARAM_COUNT,FOciError) = OCI_ERROR then
HandleError;
// Let op, moet gewist worden. En in een keer gealloceerd
Setlength(FieldBuffers,numcols);
for tel := 1 to numcols do
begin
if OCIParamGet(FOciStmt,OCI_HTYPE_STMT,FOciError,Param,tel) = OCI_ERROR then
HandleError;
if OCIAttrGet(Param,OCI_DTYPE_PARAM,@OFieldType,nil,OCI_ATTR_DATA_TYPE,FOciError) = OCI_ERROR then
HandleError;
if OCIAttrGet(Param,OCI_DTYPE_PARAM,@OFieldSize,nil,OCI_ATTR_DATA_SIZE,FOciError) = OCI_ERROR then
HandleError;
FieldSize := 0;
case OFieldType of
OCI_TYPECODE_NUMBER : begin
if OCIAttrGet(Param,OCI_DTYPE_PARAM,@Oprecision,nil,OCI_ATTR_PRECISION,FOciError) = OCI_ERROR then
HandleError;
if OCIAttrGet(Param,OCI_DTYPE_PARAM,@Oscale,nil,OCI_ATTR_SCALE,FOciError) = OCI_ERROR then
HandleError;
if Oscale = 0 then
begin
FieldType := ftInteger;
OFieldType := SQLT_INT;
OFieldSize:= sizeof(integer);
end
else if (oscale = -127) {and (OPrecision=0)} then
begin
FieldType := ftFloat;
OFieldType := SQLT_FLT;
OFieldSize:=sizeof(double);
end
else if (oscale <=4) and (OPrecision<=12) then
begin
FieldType := ftBCD;
FieldSize := oscale;
OFieldType := SQLT_VNU;
OFieldSize:= 22;
end
else FieldType := ftUnknown;
end;
OCI_TYPECODE_CHAR,
OCI_TYPECODE_VARCHAR,
OCI_TYPECODE_VARCHAR2 : begin FieldType := ftString; FieldSize := OFieldSize; inc(OFieldsize) ;OFieldType:=SQLT_STR end;
OCI_TYPECODE_DATE : FieldType := ftDate;
OCI_TYPECODE_TIMESTAMP,
OCI_TYPECODE_TIMESTAMP_LTZ,
OCI_TYPECODE_TIMESTAMP_TZ : begin
FieldType := ftDateTime;
OFieldType := SQLT_ODT;
end;
else
FieldType := ftUnknown;
end;
FieldBuffers[tel-1].buffer := getmem(OFieldSize);
FOciDefine := nil;
if OciDefineByPos(FOciStmt,FOciDefine,FOciError,tel,fieldbuffers[tel-1].buffer,OFieldSize,OFieldType,@(fieldbuffers[tel-1].ind),nil,nil,OCI_DEFAULT) = OCI_ERROR then
HandleError;
if OCIAttrGet(Param,OCI_DTYPE_PARAM,@OFieldName,@OFNameLength,OCI_ATTR_NAME,FOciError) <> OCI_SUCCESS then
HandleError;
setlength(Fieldname,OFNameLength);
move(OFieldName^,Fieldname[1],OFNameLength);
TFieldDef.Create(FieldDefs, FieldDefs.MakeNameUnique(FieldName), FieldType, FieldSize, False, tel);
end;
end;
end;
---------谁有渠道反馈给官网开发者? |