📄 sddb2.pas
字号:
FSQLGetInfo := SDDb2.SQLGetInfo;
FSQLGetStmtAttr := SDDb2.SQLGetStmtAttr;
FSQLGetStmtOption := SDDb2.SQLGetStmtOption;
FSQLGetTypeInfo := SDDb2.SQLGetTypeInfo;
FSQLNumResultCols := SDDb2.SQLNumResultCols;
FSQLParamData := SDDb2.SQLParamData;
FSQLPrepare := SDDb2.SQLPrepare;
FSQLPutData := SDDb2.SQLPutData;
FSQLRowCount := SDDb2.SQLRowCount;
FSQLSetConnectAttr := SDDb2.SQLSetConnectAttr;
FSQLSetConnectOption := SDDb2.SQLSetConnectOption;
FSQLSetCursorName := SDDb2.SQLSetCursorName;
FSQLSetDescField := SDDb2.SQLSetDescField;
FSQLSetDescRec := SDDb2.SQLSetDescRec;
FSQLSetEnvAttr := SDDb2.SQLSetEnvAttr;
FSQLSetParam := SDDb2.SQLSetParam;
FSQLSetStmtAttr := SDDb2.SQLSetStmtAttr;
FSQLSetStmtOption := SDDb2.SQLSetStmtOption;
FSQLSpecialColumns := SDDb2.SQLSpecialColumns;
FSQLStatistics := SDDb2.SQLStatistics;
FSQLTables := SDDb2.SQLTables;
FSQLTransact := SDDb2.SQLTransact;
FSQLBrowseConnect := SDDb2.SQLBrowseConnect;
FSQLBulkOperations := SDDb2.SQLBulkOperations;
FSQLColAttributes := SDDb2.SQLColAttributes;
FSQLColumnPrivileges := SDDb2.SQLColumnPrivileges;
FSQLDescribeParam := SDDb2.SQLDescribeParam;
FSQLExtendedFetch := SDDb2.SQLExtendedFetch;
FSQLForeignKeys := SDDb2.SQLForeignKeys;
FSQLMoreResults := SDDb2.SQLMoreResults;
FSQLNativeSql := SDDb2.SQLNativeSql;
FSQLNumParams := SDDb2.SQLNumParams;
FSQLParamOptions := SDDb2.SQLParamOptions;
FSQLPrimaryKeys := SDDb2.SQLPrimaryKeys;
FSQLProcedureColumns := SDDb2.SQLProcedureColumns;
FSQLProcedures := SDDb2.SQLProcedures;
FSQLSetPos := SDDb2.SQLSetPos;
FSQLTablePrivileges := SDDb2.SQLTablePrivileges;
FSQLDrivers := SDDb2.SQLDrivers;
FSQLBindParameter := SDDb2.SQLBindParameter;
FSQLDriverConnect := SDDb2.SQLDriverConnect;
// DB2 specific CLI APIs (sqlcli1.h)
FSQLBindFileToCol := SDDb2.SQLBindFileToCol;
FSQLBindFileToParam := SDDb2.SQLBindFileToParam;
FSQLGetLength := SDDb2.SQLGetLength;
FSQLGetPosition := SDDb2.SQLGetPosition;
FSQLGetSubString := SDDb2.SQLGetSubString;
FSQLSetColAttributes := SDDb2.SQLSetColAttributes;
FSQLBindParam := SDDb2.SQLBindParam;
{$ELSE}
inherited SetApiCalls( hSqlLibModule );
// DB2 specific CLI APIs (sqlcli1.h)
@FSQLBindFileToCol := GetProcAddress(hSqlLibModule, 'SQLBindFileToCol');
@FSQLBindFileToParam := GetProcAddress(hSqlLibModule, 'SQLBindFileToParam');
@FSQLGetLength := GetProcAddress(hSqlLibModule, 'SQLGetLength');
@FSQLGetPosition := GetProcAddress(hSqlLibModule, 'SQLGetPosition');
@FSQLGetSubString := GetProcAddress(hSqlLibModule, 'SQLGetSubString');
@FSQLSetColAttributes := GetProcAddress(hSqlLibModule, 'SQLSetColAttributes');
// APIs defined only by X/Open CLI (sqlcli1.h)
@FSQLBindParam := GetProcAddress(hSqlLibModule, 'SQLBindParam');
{$ENDIF}
end;
procedure TDB2Functions.ClearApiCalls;
begin
inherited ClearApiCalls;
// DB2 specific CLI APIs (sqlcli1.h)
@FSQLBindFileToCol := nil;
@FSQLBindFileToParam := nil;
@FSQLGetLength := nil;
@FSQLGetPosition := nil;
@FSQLGetSubString := nil;
@FSQLSetColAttributes:= nil;
// APIs defined only by X/Open CLI (sqlcli1.h)
@FSQLBindParam := nil;
end;
procedure LoadSqlLib;
begin
SqlLibLock.Acquire;
try
if (SqlLibRefCount = 0) then begin
hSqlLibModule := HelperLoadLibrary( SqlApiDLL );
if (hSqlLibModule = 0) then
raise ESDSqlLibError.CreateFmt(SErrLibLoading, [ SqlApiDLL ]);
Inc(SqlLibRefCount);
DB2Calls.SetApiCalls( hSqlLibModule );
end else
Inc(SqlLibRefCount);
finally
SqlLibLock.Release;
end;
end;
procedure FreeSqlLib;
begin
if SqlLibRefCount = 0 then
Exit;
SqlLibLock.Acquire;
try
if (SqlLibRefCount = 1) then begin
if FreeLibrary(hSqlLibModule) then
hSqlLibModule := 0
else
raise ESDSqlLibError.CreateFmt(SErrLibUnloading, [ SqlApiDLL ]);
Dec(SqlLibRefCount);
DB2Calls.ClearApiCalls;
end else
Dec(SqlLibRefCount);
finally
SqlLibLock.Release;
end;
end;
{ TIDB2Database }
function TIDB2Database.CreateSqlCommand: TISqlCommand;
begin
Result := TIDB2Command.Create( Self );
end;
function TIDB2Database.GetCalls: TDB2Functions;
begin
Result := FCalls as TDB2Functions;
end;
procedure TIDB2Database.FreeSqlLib;
begin
SDDb2.FreeSqlLib;
end;
procedure TIDB2Database.LoadSqlLib;
begin
SDDb2.LoadSqlLib;
FCalls := DB2Calls;
end;
procedure TIDB2Database.RaiseSDEngineError(AErrorCode, ANativeError: TSDEResult; const AMsg, ASqlState: string);
begin
raise ESDDb2Error.CreateWithSqlState(AErrorCode, ANativeError, AMsg, ASqlState);
end;
function TIDB2Database.GetAutoIncSQL: string;
begin
Result := DB2_SelectAutoIncField;
end;
{ TIDB2Command }
function TIDB2Command.GetSqlDatabase: TIDB2Database;
begin
Result := (inherited SqlDatabase) as TIDB2Database;
end;
procedure TIDB2Command.Connect;
begin
inherited;
// specifies the number of values for each parameter (DB2 CLI v5)
Check( SqlDatabase.OdbcSetStmtAttr( Handle, SQL_ATTR_PARAMSET_SIZE, SQLPOINTER( 1 ), 0 ) );
// (DB2 CLI v5)
Check( SqlDatabase.OdbcSetStmtAttr( Handle, SQL_ATTR_USE_BOOKMARKS, SQLPOINTER( SQL_UB_OFF ), 0 ) );
// Note: This option is an IBM extension
Check(
SqlDatabase.OdbcSetStmtAttr( Handle, SQL_ATTR_CURSOR_HOLD,
SQLPOINTER( SQL_CURSOR_HOLD_ON ), 0 )
);
// Note: This is an IBM defined extension. (DB2 CLI v5)
Check(
SqlDatabase.OdbcSetStmtAttr( Handle, SQL_ATTR_DEFERRED_PREPARE,
SQLPOINTER( SQL_DEFERRED_PREPARE_OFF ), 0 )
);
end;
function TIDB2Command.FieldDataType(ExtDataType: Integer): TFieldType;
begin
case ExtDataType of
// DB2 data types
SQL_GRAPHIC,
SQL_VARGRAPHIC: Result := ftVarBytes;
SQL_LONGVARGRAPHIC,
SQL_BLOB: Result := ftBlob;
SQL_CLOB,
SQL_DBCLOB: Result := ftMemo;
else
Result := inherited FieldDataType( ExtDataType );
end;
end;
function TIDB2Command.SqlDataType(FieldType: TFieldType): Integer;
const
{ Converting from TFieldType to SQL Data Type(DB2) }
Db2SqlDataTypeMap: array[TFieldType] of Integer = ( 0, // ftUnknown
// ftString, ftSmallint, ftInteger, ftWord, ftBoolean
SQL_CHAR, SQL_SMALLINT, SQL_INTEGER, SQL_INTEGER, SQL_SMALLINT,
// ftFloat, ftCurrency, ftBCD, ftDate, ftTime
SQL_DOUBLE, SQL_DOUBLE, 0, SQL_TYPE_DATE, SQL_TYPE_TIME,
// ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob
SQL_TYPE_TIMESTAMP, SQL_BINARY, SQL_BINARY, SQL_INTEGER, SQL_BLOB,
// ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle
SQL_CLOB, SQL_BLOB, SQL_CLOB, 0, 0,
// ftTypedBinary, ftCursor
0, 0
{$IFDEF SD_VCL4},
// ftFixedChar, ftWideString, ftLargeint,
0, 0, SQL_BIGINT,
// ftADT, ftArray, ftReference, ftDataSet
0, 0, 0, 0
{$ENDIF}
{$IFDEF SD_VCL5},
// ftOraBlob, ftOraClob, ftVariant,
0, 0, 0,
// ftInterface, ftIDispatch, ftGuid
0, 0, 0
{$ENDIF}
{$IFDEF SD_VCL6},
// ftTimeStamp, ftFMTBcd
0, 0
{$ENDIF}
);
begin
Result := Db2SqlDataTypeMap[FieldType];
end;
initialization
hSqlLibModule := 0;
SqlLibRefCount:= 0;
SqlApiDLL := DefSqlApiDLL;
DB2Calls := TDB2Functions.Create;
SqlLibLock := TCriticalSection.Create;
finalization
while SqlLibRefCount > 0 do
FreeSqlLib;
SqlLibLock.Free;
DB2Calls.Free;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -