?? database.pas
字號:
unit DataBase;
interface
uses sysutils,Windows,pub,Classes,db,math, Graphics,printers,StdCtrls,Dialogs,ADODB,forms,inifiles,Controls,XMLDoc, XMLIntf;
function OpenConn(ADOConn: TADOConnection;const AReConnect:boolean=false;Const ANewDBName:string =''):boolean;//開始連接數(shù)據(jù)庫,成功返回true,否則返回失敗
function GetObjectType(Atext:string): TTreeHitType;
function GetDataBase(ADOConn: TADOConnection):TStrings;//返回所有數(shù)據(jù)庫名稱
function GetObjects(ADOConn: TADOConnection;const ADBName:string;const AObjectType:string):TStrings;
function CreateDataBaseDL(ADOConn: TADOConnection ;ACombobox:Tcombobox):boolean; //返回數(shù)據(jù)庫名稱
function CreateTableViewDL(ADOConn: TADOConnection;
const ADBName:string;const AObjectType:string;ACombobox:Tcombobox):boolean;
function GetTableDef(ADOConn: TADOConnection;Const ATableName:string;
var ATableInfo: TTableInfo;
const fk_index:bool=false //是否返回外鍵和索引信息
):boolean;//返回表/試圖的結構 ;結果在ATableInfo中
function GetTableRecordCount(ADOConn: TADOConnection;Const ATableName:string;
Const Atop:integer;//-1 表示全部
const AWhere:string;out Count:integer):string;
//得到表中的記錄數(shù)量 返回錯誤信息
function GetDataSetDef(ADOConn: TADOConnection;Const ASQL:string;
var ATableInfo: TTableInfo):boolean; overload;//以字符串返回DS結構;結果在ATableInfo中
function GetDataSetDef(ADOConn: TADOConnection;ATSP_Info:TSP_Info;
var ATableInfo: TTableInfo):boolean; overload;//以字符串返回DS結構;結果在ATableInfo中
function GetSPParameters(ADOConn: TADOConnection;Const ASPName:string;
var ATSP_Info: TSP_Info):boolean;
//返回存儲過程參數(shù),結果存在 ATSP_Parameters
function SQLDataToCDataType(Const ASQLDataType:string):string; //將來數(shù)據(jù)庫類型轉換成C#類型
function FieldTypeToCDataType(Const AFieldType:TFieldType):string;
//將來執(zhí)行SQL語句返回的字段類型轉換成C#類型
function ExeSQL(ADOConn: TADOConnection;Const ASQL:string):string;
//執(zhí)行SQL,返回錯誤;如果沒有錯誤,則返回空
function GetViewScript(ADOConn: TADOConnection;
const AViewName:string):string;
//返回視圖的腳本
function GetViewComments(ADOConn: TADOConnection;
const AViewName:string):string;
//返回視圖的SQL備注
function GetSPScript(ADOConn: TADOConnection; const ASPName:string):string;
//返回存儲過程腳本
function ObjectExists(ADOConn: TADOConnection;const ObjectNAme:string):boolean;
function RemoveRemark(SQLStr:String):string;// 祛除SQL中的備注
procedure AnalysisViewScript(const ASQLStr:String;
out ATables:string;out AViewFields:TCodeValueList); // )
//ATables 返回與視圖相關的表 ,以逗號隔開
//ViewFields返回 視圖字段
//Code 為視圖字段別名
//Value為實際的字段名,TableName.Fieldname的形式
function GetNullExpression(Const CDataType :string):string;
function GetTableNameByRefOrder(ADOConn: TADOConnection;const ADBName:string):TStrings;//按得到表名稱按引用的順序,用于生成插入表數(shù)據(jù)
function GetReferences(ADOConn: TADOConnection;const ADBName:string):TCodeValueList ;
//得到引用關系,用于排插入順序
function GetSQLDataTypes(ADOConn: TADOConnection;out ADataTypes:TCodeValueList):Boolean;//
//code 是類型,包括字定義類型 value是 原始類型
implementation
uses UDbConnSetting, Unit_des;
function FieldTypeToSQLDataType(Const AFieldType:TFieldType):string;
//將來執(zhí)行SQL語句返回的字段類型轉換成SQL Server類型
begin
case AFieldType of
ftLargeint: result:='bigint';
ftBytes: result:='binary';
ftBoolean: result:='bit';
//ftString: result:='char';
ftDateTime: result:='datetime';
ftBCD: result:='decimal';
ftFloat: result:='float';
ftBlob: result:='image';
ftInteger: result:='int';
//ftBCD: result:='money';
// ftWideString: result:='nchar';
ftMemo: result:='ntext';
// ftBCD: result:='numeric';
ftWideString: result:='nvarchar';
// ftFloat: result:='real';
// ftDateTime: result:='smalldatetime';
ftSmallint: result:='smallint';
//ftBCD: result:='smallmoney';
//ftMemo: result:='text';
//ftBytes: result:='timestamp';
ftWord: result:='tinyint';
ftGuid: result:='uniqueidentifier';
ftVarBytes: result:='varbinary';
ftString: result:='varchar';
end;
end;
//********************
function GetObjectType(Atext:string): TTreeHitType;
var XType:string;
P:integer;
begin
Xtype:=trim(Atext) ;
P:=pos('.', Xtype);
Xtype:=copy(Xtype,p+1,length(Xtype));
if Xtype='用戶表' then Result:=pub.tShowTable
else
if Xtype='視圖' then Result:=pub.tShowView
else
if Xtype='存儲過程' then Result:=pub.tShowSP
end;
function TryOpenConn(ADOConn: TADOConnection):boolean;//開始連接數(shù)據(jù)庫,成功返回true,否則返回失敗
begin
try
ADOConn.Open ;
result:=true;
exit;
except
result:=false;
end;
end;
function SettingConnectionString:string;//通過設置窗口得到連接串
begin
with TfrmDbConnSetting.Create(nil) do
try
if ShowModal=mrOk then
result:= DBConnSetting;
finally
free;
end;
end;
function OpenConn(ADOConn: TADOConnection;const AReConnect:boolean=false;Const ANewDBName:string =''):boolean;//開始連接數(shù)據(jù)庫,成功返回true,否則返回失敗
var FileName:string;
TmpStr:string;
SvrAddress:string;
Integrated:boolean;
UID:string;
pwd:String;
// DBName:string ;
begin
result:=false;
if AReConnect then
begin
ADOConn.Close;
ADOConn.ConnectionString :='';
end;
if ADOConn.Connected then
begin
result:=true;
exit;
end;
if ADOConn.ConnectionString <>'' then //有連接串,嘗試打開
result:=TryOpenConn(ADOConn);
if result then exit;
///////////////////////////////////////
Filename:=ExtractFileDir(Application.ExeName) + '\conn.ini';
if FileExists(Filename) then//看是否有保存的
with TIniFile.Create(Filename) do
try
begin
SvrAddress:=ReadString('Parameters','ServerName','');
TmpStr :=ReadString('Parameters','LoginType','');
Integrated:= TmpStr='1';
UID:=ReadString('Parameters','UID','');
TmpStr:= ReadString('Parameters','SaveSetting','');
if TmpStr='1' then //保存密碼
begin
TmpStr :=ReadString('Parameters','Pwd','');
pwd :=Unit_des.DESryStrHex(TmpStr,pub.DESKey);
ADOConn.ConnectionString :=pub.BuildConnstring(SvrAddress,Integrated,UID,pwd,ANewDBName);
end
else
ADOConn.ConnectionString :=SettingConnectionString;
end;//if FileExists(Filename) then//看是否有保存的
finally
free;
end
else
ADOConn.ConnectionString :=SettingConnectionString;
//***********************
if ADOConn.ConnectionString <>'' then //有連接串,嘗試打開
result:=TryOpenConn(ADOConn)
else
result:=false;
end;
//AObjectType:U,V,P
function GetObjects(ADOConn: TADOConnection;const ADBName:string;const AObjectType:string):TStrings;
begin
result:=TStringList.Create ;
with TADOQuery.Create(nil) do
try
Connection :=ADOConn;
if Database.OpenConn(ADOConn,true,ADBName) then
begin
SQL.Text :='select owner = user_name(uid), name from '+ADBName+'.dbo.sysobjects o where type=N'''+AObjectType
+''' and ISNULL(OBJECTPROPERTY(o.id, N''IsMSShipped''), 1)=0 and name<>''dtproperties'' and name<>''sysdiagrams'' order by name';
Open ;
while not Eof do
begin
result.Add(FieldByName('owner').AsString+'.'+ FieldByName('name').AsString + '');
Next;
end;
end//if(Database.OpenConn(ADOConn) then
finally
free;
end;
end;
function GetDataBase(ADOConn: TADOConnection):TStrings;//返回所有數(shù)據(jù)庫名稱
begin
result:=TStringList.Create ;
with TADOQuery.Create(nil) do
try
Connection :=ADOConn;
if Database.OpenConn(ADOConn) then
begin
SQL.Text :='select * from master.dbo.sysdatabases where name not in(''master'',''model'',''msdb'',''tempdb'') order by name';
Open ;
while not Eof do
begin
result.Add(Fields[0].AsString);
Next;
end;
end//if(Database.OpenConn(ADOConn) then
finally
free;
end;
end;
function CreateDataBaseDL(ADOConn: TADOConnection ;ACombobox:Tcombobox):boolean; //返回數(shù)據(jù)庫名稱
begin
try
ACombobox.Items:=GetDataBase(ADOConn);
result:=true;
except
result:=false;
end;
end;
function CreateTableViewDL(ADOConn: TADOConnection;
const ADBName:string;const AObjectType:string;
ACombobox:Tcombobox):boolean;
begin
try
ACombobox.Items :=DataBAse.GetObjects(ADOConn,ADBName,AObjectType);
result:=true;
except
result:=false;
end;
end;
//
function GetCommentsByFullFieldName(ADOConn: TADOConnection;
const AFullFieldName:string):string;
//得到字段的備注 AFullFieldName至少需要包括表名和字段名稱owner.tablename.fieldname/tablename.fieldname
var TS:TStrings;
SQLStr:string;
OwnerName:string;
TableName:string;
FieldName:string;
I:integer;
begin
TS:=pub.SplitString(AFullFieldName,'.');
for I:=0 to TS.Count -1 do
if trim(TS[I]) ='' then
TS.Delete(I);
result:='';
try
if TS.Count<=1 then exit;//沒有表名稱
if TS.Count = 2 then //tablename.fieldname
begin
OwnerName:= 'dbo';
TableName:=TS[0];
FieldName:=TS[1];
end else //>=3
begin
OwnerName:=TS[TS.count-3];;
TableName:=TS[TS.count-2];
FieldName:=TS[TS.count-1];
end;
SQLStr:='select cast(xp.[value] as nvarchar(4000)) from ::::fn_listextendedproperty '
+ ' (NULL, N''user'', N'''+OwnerName+''', N''table'', N'''+TableName+''', N''column'', N''' +
FieldName
+''') xp where xp.name'
+' = N''MS_Description''';
with TADOQuery.Create(nil) do
try
Connection :=ADOConn;
if Database.OpenConn(ADOConn) then
begin
SQL.Text :=SQLStr;
open;
if Recordcount>0 then
result:=Fields[0].AsString ;
//**************
Close;
end;
finally
free;
end;
finally
TS.Free ;
end;
end;
//***********************************
function GetCommentsFromTables(ADOConn: TADOConnection;
const AFieldName:string;const ATables:string):string;
//從表中得到字段的備注
//多個表用逗號隔開
var TS:TStrings;
SQLStr:string;
OwnerName:string;
TableName:string;
FieldName:string;
I:integer;
P:integer;
begin
TS:=pub.SplitString(ATables,',');
for I:=0 to TS.Count -1 do
if trim(TS[I]) ='' then
TS.Delete(I);
result:='';
try
if TS.Count=0 then exit;//列表中沒有表名稱
OwnerName:='';
FieldName:=AFieldName;
with TADOQuery.Create(nil) do
try
Connection :=ADOConn;
if Database.OpenConn(ADOConn) then
begin
for I:=0 to TS.Count -1 do
begin
TableName:=TS[i];
P:=pos('.', TableName);
if P<>0 then
begin
OwnerName:=copy(TableName,1,P-1);
if OwnerName='' then
TableName:=copy(TableName,P+1,length(TableName));
end;
OwnerName:='dbo'; //20070329
SQLStr:='select cast(xp.[value] as nvarchar(4000)) from ::::fn_listextendedproperty '
+ ' (NULL, N''user'', N'''+OwnerName+''', N''table'', N'''+TableName+''', N''column'', N''' +
FieldName
+''') xp where xp.name'
+' = N''MS_Description''';
Close;
SQL.Text :=SQLStr;
open;
if Recordcount>0 then
begin
result:=Fields[0].AsString ;
break;//找到了,跳出去
end;
//**************
Close;
end;
end;
finally
free;
end;
finally
TS.Free ;
end;
end;
function IsField(const AFieldName:string):boolean;
//判斷視圖字段是否來自一個實際的字段
//排除 數(shù)字,字符串,函數(shù),@@,帶操作符的
var F:Extended;//臨時變量
B:boolean;
j:integer;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -