新聞中心
在現(xiàn)代的數(shù)據(jù)庫系統(tǒng)中,數(shù)據(jù)的安全性和完整性是至關(guān)重要的。在數(shù)據(jù)庫系統(tǒng)中,事務(wù)是一組原子操作序列,它們組合在一起形成了一個單個的不可分割的工作單元。數(shù)據(jù)庫事務(wù)日志是一種重要的機制,用于保證數(shù)據(jù)庫的數(shù)據(jù)完整性和一致性。本文將深入探討數(shù)據(jù)庫事務(wù)日志是什么,以及它如何保證系統(tǒng)的數(shù)據(jù)完整性和一致性。

公司專注于為企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、微信公眾號開發(fā)、商城網(wǎng)站定制開發(fā),成都微信小程序,軟件按需網(wǎng)站開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗,我們會仔細了解各客戶的需求而做出多方面的分析、設(shè)計、整合,為客戶設(shè)計出具風格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
什么是數(shù)據(jù)庫事務(wù)日志?
數(shù)據(jù)庫事務(wù)日志是一個記錄了所有數(shù)據(jù)庫中操作的詳細信息的文件。它包括了所有的操作,如數(shù)據(jù)修改和刪除,以及任何其他的數(shù)據(jù)庫操作。日志文件記錄了這些操作的順序和時間,以及被修改的數(shù)據(jù)的先前狀態(tài)和修改后的狀態(tài)。它還記錄了每個事務(wù)的開始和結(jié)束時間,并在事務(wù)提交之前記錄所有操作。數(shù)據(jù)庫事務(wù)日志還允許數(shù)據(jù)庫管理系統(tǒng)(DBMS)在數(shù)據(jù)庫崩潰或發(fā)生其他故障時恢復數(shù)據(jù)。
數(shù)據(jù)庫事務(wù)日志的結(jié)構(gòu)如下圖所示:

該圖顯示了一個簡單的事務(wù)日志,其中包括了三個事務(wù):T1、T2和T3。每個事務(wù)都包括了一系列操作,如讀取數(shù)據(jù)(R)和寫入數(shù)據(jù)(W)。在日志的開頭,記錄了一個檢查點,它是一個時刻的快照,可以在系統(tǒng)崩潰或重新啟動時使用,以確定數(shù)據(jù)庫中的所有數(shù)據(jù)狀態(tài)。在每個事務(wù)之后,都有一個事務(wù)提交記錄,以標記該事務(wù)已經(jīng)完成。在日志的末尾,記錄了一個終止日志記錄,表示該日志已經(jīng)結(jié)束。
事務(wù)日志如何保證系統(tǒng)的數(shù)據(jù)完整性和一致性?
數(shù)據(jù)庫事務(wù)日志可以通過以下方式保證數(shù)據(jù)庫的數(shù)據(jù)完整性和一致性:
1. 數(shù)據(jù)庫崩潰后的恢復:當數(shù)據(jù)庫系統(tǒng)發(fā)生故障時,例如崩潰或意外關(guān)閉,事務(wù)日志可以幫助管理員恢復數(shù)據(jù)庫的數(shù)據(jù)。因為事務(wù)日志記錄了每個事務(wù)的開始和結(jié)束時間,并在事務(wù)提交之前記錄所有操作,因此管理員可以使用事務(wù)日志來識別未完成的事務(wù)和破壞數(shù)據(jù)的事務(wù),并使用事務(wù)日志中的數(shù)據(jù)來恢復數(shù)據(jù)庫。
2. 備份和恢復: 使用事務(wù)日志還可以進行數(shù)據(jù)庫備份和恢復,以便在數(shù)據(jù)庫系統(tǒng)崩潰或其他應用程序錯誤時還原數(shù)據(jù)庫。與傳統(tǒng)備份不同,使用事務(wù)日志可以使管理員在發(fā)生故障時快速恢復數(shù)據(jù)庫。
3. 系統(tǒng)檢修:事務(wù)日志還可以用于確定已完成的事務(wù)和未完成的事務(wù)。當系統(tǒng)需要進行檢修或其他操作時,系統(tǒng)可以使用事務(wù)日志來確定未完成的事務(wù),并在執(zhí)行維護操作之前事務(wù)進行回滾。
4. 數(shù)據(jù)庫的一致性:使用事務(wù)日志可以確保數(shù)據(jù)庫的一致性,即使系統(tǒng)發(fā)生故障。每個事務(wù)在數(shù)據(jù)庫中執(zhí)行之前,必須向事務(wù)日志中寫入所有操作的記錄。當事務(wù)提交時,對數(shù)據(jù)所做的任何修改都將被寫入日志文件,并在下一個檢查點時將其寫入磁盤。如果系統(tǒng)發(fā)生故障,管理員可以使用日志文件來恢復系統(tǒng),并確保數(shù)據(jù)的一致性。
5. 形成數(shù)據(jù)備份:除了記錄事務(wù)的操作外,事務(wù)日志還可以包含其他有用信息,例如數(shù)據(jù)備份。管理員可以使用事務(wù)日志中的此信息來了解何時執(zhí)行了數(shù)據(jù)備份操作,并幫助確定何時還原數(shù)據(jù)庫。
數(shù)據(jù)庫事務(wù)日志是數(shù)據(jù)庫系統(tǒng)的重要組成部分,用于保證系統(tǒng)數(shù)據(jù)的完整性和一致性。它允許管理員在系統(tǒng)崩潰或其他故障時快速恢復數(shù)據(jù),并確保數(shù)據(jù)庫的一致性和安全性。盡管事務(wù)日志對于數(shù)據(jù)庫系統(tǒng)的性能有些影響,但它對于保證數(shù)據(jù)的安全和完整性是至關(guān)重要的。因此,數(shù)據(jù)庫管理員應該將數(shù)據(jù)庫事務(wù)日志視為數(shù)據(jù)庫系統(tǒng)的一個必備組成部分,并進行適當?shù)木S護和管理。
相關(guān)問題拓展閱讀:
- 用SQL語句備份數(shù)據(jù)庫
- FoxPro到底是個什么軟件,它有什么用處??
用SQL語句備份數(shù)據(jù)庫
利用T-SQL語句,實現(xiàn)數(shù)據(jù)庫的備份和還原的功能
體現(xiàn)了SQL Server中的四個知識點:
1. 獲取SQL Server服務(wù)器上的默認目錄
2. 備份SQL語句的使用
3. 恢復SQL語句的使用,同時考慮了強制恢復時關(guān)閉其他用戶進程的處理
4. 作業(yè)創(chuàng)建SQL語句的使用
/*1.–得到數(shù)坦喊灶據(jù)庫的文件目錄
@dbname 指定要取得目錄的數(shù)據(jù)庫名
如果指定的數(shù)據(jù)不存在,返回安裝SQL時設(shè)置的默認數(shù)據(jù)目錄
如果指定NULL,則返回默認的SQL備份目錄名
*/
/*–調(diào)用示例
select 數(shù)據(jù)庫文件目錄=dbo.f_getdbpath(’tempdb’)
,=dbo.f_getdbpath(’’)
,=dbo.f_getdbpath(null)
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.’) and xtype in (N’FN’, N’IF’, N’TF’))
drop function .
GO
create function f_getdbpath(@dbname sysname)
returns nvarchar(260)
as
begin
declare @re nvarchar(260)
if @dbname is null or db_id(@dbname) is null
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=’master’
else
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
if @dbname is null
set @re=reverse(substring(@re,charindex(’\’,@re)+5,260))+’BACKUP’
else
set @re=reverse(substring(@re,charindex(’\’,@re),260))
return(@re)
end
go
/*2.–備份數(shù)據(jù)庫
*/
/*–調(diào)用示例
–備份當前數(shù)據(jù)庫
exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_db.bak’
–差異備份當前讓扮數(shù)據(jù)庫
exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_df.bak’,@bktype=’DF’
–備份當前數(shù)據(jù)庫日志
exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_log.bak’,@bktype=’LOG’
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.
’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure .
GO
create proc p_backupdb
@dbname sysname=’’, –要備份的數(shù)據(jù)庫名稱,不指定則備份當前數(shù)據(jù)庫
@bkpath nvarchar(260)=’’, –備份文件的存放目錄,不指定則使用SQL默認的備份目錄
@bkfname nvarchar(260)=’’, –備份文件名,文件名中能用\DBNAME\代表數(shù)據(jù)庫名,\DATE\代表日期,\TIME\代表時間
@bktype nvarchar(10)=’DB’, –備份類型:’DB’備份數(shù)據(jù)庫,’DF’ 差異滲碼備份,’LOG’ 日志備份
@appendfile bit=1 –追加/覆蓋備份文件
as
declare @sql varchar(8000)
if isnull(@dbname,’’)=’’ set @dbname=db_name()
if isnull(@bkpath,’’)=’’ set @bkpath=dbo.f_getdbpath(null)
if isnull(@bkfname,’’)=’’ set @bkfname=’\DBNAME\_\DATE\_\TIME\.BAK’
set @bkfname=replace(replace(replace(@bkfname,’\DBNAME\’,@dbname)
,’\DATE\’,convert(varchar,getdate(),112))
,’\TIME\’,replace(convert(varchar,getdate(),108),’:’,’’))
set @sql=’backup ’+case @bktype when ’LOG’ then ’log ’ else ’database ’ end +@dbname
+’ to disk=’’’+@bkpath+@bkfname
+’’’ with ’+case @bktype when ’DF’ then ’DIFFERENTIAL,’ else ’’ end
+case @appendfile when 1 then ’NOINIT’ else ’INIT’ end
print @sql
exec(@sql)
go
/*3.–恢復數(shù)據(jù)庫
*/
/*–調(diào)用示例
–完整恢復數(shù)據(jù)庫
exec p_RestoreDb @bkfile=’c:\db__db.bak’,@dbname=’db’
–差異備份恢復
exec p_RestoreDb @bkfile=’c:\db__db.bak’,@dbname=’db’,@retype=’DBNOR’
exec p_backupdb @bkfile=’c:\db__df.bak’,@dbname=’db’,@retype=’DF’
–日志備份恢復
exec p_RestoreDb @bkfile=’c:\db__db.bak’,@dbname=’db’,@retype=’DBNOR’
exec p_backupdb @bkfile=’c:\db__log.bak’,@dbname=’db’,@retype=’LOG’
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.
’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure .
GO
create proc p_RestoreDb
@bkfile nvarchar(1000), –定義要恢復的備份文件名
@dbname sysname=’’, –定義恢復后的數(shù)據(jù)庫名,默認為備份的文件名
@dbpath nvarchar(260)=’’, –恢復后的數(shù)據(jù)庫存放目錄,不指定則為SQL的默認數(shù)據(jù)目錄
@retype nvarchar(10)=’DB’, –恢復類型:’DB’完事恢復數(shù)據(jù)庫,’DBNOR’ 為差異恢復,日志恢復進行完整恢復,’DF’ 差異備份的恢復,’LOG’ 日志恢復
@filenumber int=1, –恢復的文件號
@overexist bit=1, –是否覆蓋已存在的數(shù)據(jù)庫,僅@retype為
@killuser bit=1 –是否關(guān)閉用戶使用進程,僅@overexist=1時有效
as
declare @sql varchar(8000)
–得到恢復后的數(shù)據(jù)庫名
if isnull(@dbname,’’)=’’
select @sql=reverse(@bkfile)
,@sql=case when charindex(’.’,@sql)=0 then @sql
else substring(@sql,charindex(’.’,@sql)+1,1000) end
,@sql=case when charindex(’\’,@sql)=0 then @sql
else left(@sql,charindex(’\’,@sql)-1) end
,@dbname=reverse(@sql)
–得到恢復后的數(shù)據(jù)庫存放目錄
if isnull(@dbpath,’’)=’’ set @dbpath=dbo.f_getdbpath(’’)
–生成數(shù)據(jù)庫恢復語句
set @sql=’restore ’+case @retype when ’LOG’ then ’log ’ else ’database ’ end+@dbname
+’ from disk=’’’+@bkfile+’’’’
+’ with file=’+cast(@filenumber as varchar)
+case when @overexist=1 and @retype in(’DB’,’DBNOR’) then ’,replace’ else ’’ end
+case @retype when ’DBNOR’ then ’,NORECOVERY’ else ’,RECOVERY’ end
print @sql
–添加移動邏輯文件的處理
if @retype=’DB’ or @retype=’DBNOR’
begin
–從備份文件中獲取邏輯文件名
declare @lfn nvarchar(128),@tp char(1),@i int
–創(chuàng)建臨時表,保存獲取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
–從備份文件中獲取信息
insert into #tb exec(’restore filelistonly from disk=’’’+@bkfile+’’’’)
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+’,move ’’’+@lfn+’’’ to ’’’+@dbpath+@dbname+cast(@i as varchar)
+case @tp when ’D’ then ’.mdf’’’ else ’.ldf’’’ end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
end
–關(guān)閉用戶進程處理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec(’kill ’+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end
–恢復數(shù)據(jù)庫
exec(@sql)
go
/*4.–創(chuàng)建作業(yè)
*/
/*–調(diào)用示例
–每月執(zhí)行的作業(yè)
exec p_createjob @jobname=’mm’,@sql=’select * from syscolumns’,@freqtype=’month’
–每周執(zhí)行的作業(yè)
exec p_createjob @jobname=’ww’,@sql=’select * from syscolumns’,@freqtype=’week’
–每日執(zhí)行的作業(yè)
exec p_createjob @jobname=’a’,@sql=’select * from syscolumns’
–每日執(zhí)行的作業(yè),每天隔4小時重復的作業(yè)
exec p_createjob @jobname=’b’,@sql=’select * from syscolumns’,@fsinterval=4
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.
’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure .
GO
create proc p_createjob
@jobname varchar(100), –作業(yè)名稱
@sql varchar(8000), –要執(zhí)行的命令
@dbname sysname=’’, –默認為當前的數(shù)據(jù)庫名
@freqtype varchar(6)=’day’, –時間周期,month 月,week 周,day 日
@fsinterval int=1, –相對于每日的重復次數(shù)
@time int=開始執(zhí)行時間,對于重復執(zhí)行的作業(yè),將從0點到23:59分
as
if isnull(@dbname,’’)=’’ set @dbname=db_name()
–創(chuàng)建作業(yè)
exec msdb..sp_add_job @job_name=@jobname
–創(chuàng)建作業(yè)步驟
exec msdb..sp_add_jobstep @job_name=@jobname,
@step_name = ’數(shù)據(jù)處理’,
@subsystem = ’TSQL’,
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, –重試次數(shù)
@retry_interval = 5 –重試間隔
–創(chuàng)建調(diào)度
declare @ftype int,@fstype int,@ffactor int
select @ftype=case @freqtype when ’day’ then 4
when ’week’ then 8
when ’month’ then 16 end
,@fstype=case @fsinterval when 1 then 0 else 8 end
if @fsinterval1 set @time=0
set @ffactor=case @freqtype when ’day’ then 0 else 1 end
EXEC msdb..sp_add_jobschedule @job_name=@jobname,
@name = ’時間安排’,
@freq_type=@ftype , –每天,8 每周,16 每月
@freq_interval=1, –重復執(zhí)行次數(shù)
@freq_subday_type=@fstype, –是否重復執(zhí)行
@freq_subday_interval=@fsinterval, –重復周期
@freq_recurrence_factor=@ffactor,
@active_start_time=@time –下午17:00:00分執(zhí)行
go
/*–應用案例–備份方案:
完整備份(每個星期天一次)+差異備份(每天備份一次)+日志備份(每2小時備份一次)
調(diào)用上面的存儲過程來實現(xiàn)
–*/
declare @sql varchar(8000)
–完整備份(每個星期天一次)
set @sql=’exec p_backupdb @dbname=’’要備份的數(shù)據(jù)庫名’’’
exec p_createjob @jobname=’每周備份’,@sql,@freqtype=’week’
–差異備份(每天備份一次)
set @sql=’exec p_backupdb @dbname=’’要備份的數(shù)據(jù)庫名’’,@bktype=’DF’’
exec p_createjob @jobname=’每天差異備份’,@sql,@freqtype=’day’
–日志備份(每2小時備份一次)
set @sql=’exec p_backupdb @dbname=’’要備份的數(shù)據(jù)庫名’’,@bktype=’LOG’’
exec p_createjob @jobname=’每2小時日志備份’,@sql,@freqtype=’day’,@fsinterval=2
/*–應用案例2
生產(chǎn)數(shù)據(jù)核心庫:PRODUCE
備份方案如下:
1.設(shè)置三個作業(yè),分別對PRODUCE庫進行每日備份,每周備份,每月備份
2.新建三個新庫,分別命名為:每日備份,每周備份,每月備份
3.建立三個作業(yè),分別把三個備份庫還原到以上的三個新庫。
目的:當用戶在produce庫中有所有的數(shù)據(jù)丟失時,均能從上面的三個備份庫中導入相應的TABLE數(shù)據(jù)。
–*/
declare @sql varchar(8000)
–1.建立每月備份和生成月備份數(shù)據(jù)庫的作業(yè),每月每1天下午16:40分進行:
set @sql=’
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_m.bak’’
set @path=dbo.f_getdbpath(null)+@fname
–備份
exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname
–根據(jù)備份生成每月新庫
exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_月’’
–為周數(shù)據(jù)庫恢復準備基礎(chǔ)數(shù)據(jù)庫
exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DBNOR’’
–為日數(shù)據(jù)庫恢復準備基礎(chǔ)數(shù)據(jù)庫
exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’DBNOR’’
’
exec p_createjob @jobname=’每月備份’,@sql,@freqtype=’month’,@time=
–2.建立每周差異備份和生成周備份數(shù)據(jù)庫的作業(yè),每周日下午17:00分進行:
set @sql=’
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_w.bak’’
set @path=dbo.f_getdbpath(null)+@fname
–差異備份
exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’DF’’
–差異恢復周數(shù)據(jù)庫
exec p_backupdb @bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DF’’
’
exec p_createjob @jobname=’每周差異備份’,@sql,@freqtype=’week’,@time=
–3.建立每日日志備份和生成日備份數(shù)據(jù)庫的作業(yè),每周日下午17:15分進行:
set @sql=’
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_l.bak’’
set @path=dbo.f_getdbpath(null)+@fname
–日志備份
exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’LOG’’
–日志恢復日數(shù)據(jù)庫
exec p_backupdb @bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’LOG’’
’
exec p_createjob @jobname=’每周差異備份’,@sql,@freqtype=’day’,@time=171500
這個說的對!
/*1.–得到數(shù)據(jù)庫的文件目錄
@dbname 指定要取得目錄的數(shù)據(jù)庫名
如果指定的數(shù)據(jù)不存在,返回安裝SQL時設(shè)置的默認數(shù)據(jù)目錄
如果指定NULL,則返回默認的SQL備份目錄名
*/
/*–調(diào)用示例
select 數(shù)據(jù)庫文件目錄=dbo.f_getdbpath(’tempdb’)
,=dbo.f_getdbpath(’’)
,=dbo.f_getdbpath(null)
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.’) and xtype in (N’FN’, N’IF’, N’TF’))
drop function .
GO
create function f_getdbpath(@dbname sysname)
returns nvarchar(260)
as
begin
declare @re nvarchar(260)
if @dbname is null or db_id(@dbname) is null
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=’master’
else
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
if @dbname is null
set @re=reverse(substring(@re,charindex(’\’,@re)+5,260))+’BACKUP’
else
set @re=reverse(substring(@re,charindex(’\’,@re),260))
return(@re)
end
go
/*2.–備份數(shù)據(jù)庫
*/
/*–調(diào)用示例
–備份當前數(shù)據(jù)庫
exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_db.bak’
–差異備份當前數(shù)據(jù)庫
exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_df.bak’,@bktype=’DF’
–備份當前數(shù)據(jù)庫日志
exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_log.bak’,@bktype=’LOG’
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.
’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure .
GO
create proc p_backupdb
@dbname sysname=’’, –要備份的數(shù)據(jù)庫名稱,不指定則備份當前數(shù)據(jù)庫
@bkpath nvarchar(260)=’’, –備份文件的存放目錄,不指定則使用SQL默認的備份目錄
@bkfname nvarchar(260)=’’, –備份文件名,文件名中能用\DBNAME\代表數(shù)據(jù)庫名,\DATE\代表日期,\TIME\代表時間
@bktype nvarchar(10)=’磨純DB’, –備份類型:’瞎茄咐DB’備份數(shù)據(jù)庫,’DF’ 差異備份,’LOG’ 日志備份
@appendfile bit=1 –追加/覆蓋備份文件
as
declare @sql varchar(8000)
if isnull(@dbname,’’)=’’ set @dbname=db_name()
if isnull(@bkpath,’’)=’’ set @bkpath=dbo.f_getdbpath(null)
if isnull(@bkfname,’’)=’’ set @bkfname=’\納源DBNAME\_\DATE\_\TIME\.BAK’
set @bkfname=replace(replace(replace(@bkfname,’\DBNAME\’,@dbname)
,’\DATE\’,convert(varchar,getdate(),112))
,’\TIME\’,replace(convert(varchar,getdate(),108),’:’,’’))
set @sql=’backup ’+case @bktype when ’LOG’ then ’log ’ else ’database ’ end +@dbname
+’ to disk=’’’+@bkpath+@bkfname
+’’’ with ’+case @bktype when ’DF’ then ’DIFFERENTIAL,’ else ’’ end
+case @appendfile when 1 then ’NOINIT’ else ’INIT’ end
print @sql
exec(@sql)
go
/*3.–恢復數(shù)據(jù)庫
*/
/*–調(diào)用示例
–完整恢復數(shù)據(jù)庫
exec p_RestoreDb @bkfile=’c:\db__db.bak’,@dbname=’db’
–差異備份恢復
exec p_RestoreDb @bkfile=’c:\db__db.bak’,@dbname=’db’,@retype=’DBNOR’
exec p_backupdb @bkfile=’c:\db__df.bak’,@dbname=’db’,@retype=’DF’
–日志備份恢復
exec p_RestoreDb @bkfile=’c:\db__db.bak’,@dbname=’db’,@retype=’DBNOR’
exec p_backupdb @bkfile=’c:\db__log.bak’,@dbname=’db’,@retype=’LOG’
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.
’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure .
GO
create proc p_RestoreDb
@bkfile nvarchar(1000), –定義要恢復的備份文件名
@dbname sysname=’’, –定義恢復后的數(shù)據(jù)庫名,默認為備份的文件名
@dbpath nvarchar(260)=’’, –恢復后的數(shù)據(jù)庫存放目錄,不指定則為SQL的默認數(shù)據(jù)目錄
@retype nvarchar(10)=’DB’, –恢復類型:’DB’完事恢復數(shù)據(jù)庫,’DBNOR’ 為差異恢復,日志恢復進行完整恢復,’DF’ 差異備份的恢復,’LOG’ 日志恢復
@filenumber int=1, –恢復的文件號
@overexist bit=1, –是否覆蓋已存在的數(shù)據(jù)庫,僅@retype為
@killuser bit=1 –是否關(guān)閉用戶使用進程,僅@overexist=1時有效
as
declare @sql varchar(8000)
–得到恢復后的數(shù)據(jù)庫名
if isnull(@dbname,’’)=’’
select @sql=reverse(@bkfile)
,@sql=case when charindex(’.’,@sql)=0 then @sql
else substring(@sql,charindex(’.’,@sql)+1,1000) end
,@sql=case when charindex(’\’,@sql)=0 then @sql
else left(@sql,charindex(’\’,@sql)-1) end
,@dbname=reverse(@sql)
–得到恢復后的數(shù)據(jù)庫存放目錄
if isnull(@dbpath,’’)=’’ set @dbpath=dbo.f_getdbpath(’’)
–生成數(shù)據(jù)庫恢復語句
set @sql=’restore ’+case @retype when ’LOG’ then ’log ’ else ’database ’ end+@dbname
+’ from disk=’’’+@bkfile+’’’’
+’ with file=’+cast(@filenumber as varchar)
+case when @overexist=1 and @retype in(’DB’,’DBNOR’) then ’,replace’ else ’’ end
+case @retype when ’DBNOR’ then ’,NORECOVERY’ else ’,RECOVERY’ end
print @sql
–添加移動邏輯文件的處理
if @retype=’DB’ or @retype=’DBNOR’
begin
–從備份文件中獲取邏輯文件名
declare @lfn nvarchar(128),@tp char(1),@i int
–創(chuàng)建臨時表,保存獲取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
–從備份文件中獲取信息
insert into #tb exec(’restore filelistonly from disk=’’’+@bkfile+’’’’)
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+’,move ’’’+@lfn+’’’ to ’’’+@dbpath+@dbname+cast(@i as varchar)
+case @tp when ’D’ then ’.mdf’’’ else ’.ldf’’’ end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
end
–關(guān)閉用戶進程處理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec(’kill ’+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end
–恢復數(shù)據(jù)庫
exec(@sql)
go
/*4.–創(chuàng)建作業(yè)
*/
/*–調(diào)用示例
–每月執(zhí)行的作業(yè)
exec p_createjob @jobname=’mm’,@sql=’select * from syscolumns’,@freqtype=’month’
–每周執(zhí)行的作業(yè)
exec p_createjob @jobname=’ww’,@sql=’select * from syscolumns’,@freqtype=’week’
–每日執(zhí)行的作業(yè)
exec p_createjob @jobname=’a’,@sql=’select * from syscolumns’
–每日執(zhí)行的作業(yè),每天隔4小時重復的作業(yè)
exec p_createjob @jobname=’b’,@sql=’select * from syscolumns’,@fsinterval=4
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’.
’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure .
GO
create proc p_createjob
@jobname varchar(100), –作業(yè)名稱
@sql varchar(8000), –要執(zhí)行的命令
@dbname sysname=’’, –默認為當前的數(shù)據(jù)庫名
@freqtype varchar(6)=’day’, –時間周期,month 月,week 周,day 日
@fsinterval int=1, –相對于每日的重復次數(shù)
@time int=開始執(zhí)行時間,對于重復執(zhí)行的作業(yè),將從0點到23:59分
as
if isnull(@dbname,’’)=’’ set @dbname=db_name()
–創(chuàng)建作業(yè)
exec msdb..sp_add_job @job_name=@jobname
–創(chuàng)建作業(yè)步驟
exec msdb..sp_add_jobstep @job_name=@jobname,
@step_name = ’數(shù)據(jù)處理’,
@subsystem = ’TSQL’,
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, –重試次數(shù)
@retry_interval = 5 –重試間隔
–創(chuàng)建調(diào)度
declare @ftype int,@fstype int,@ffactor int
select @ftype=case @freqtype when ’day’ then 4
when ’week’ then 8
when ’month’ then 16 end
,@fstype=case @fsinterval when 1 then 0 else 8 end
if @fsinterval1 set @time=0
set @ffactor=case @freqtype when ’day’ then 0 else 1 end
EXEC msdb..sp_add_jobschedule @job_name=@jobname,
@name = ’時間安排’,
@freq_type=@ftype , –每天,8 每周,16 每月
@freq_interval=1, –重復執(zhí)行次數(shù)
@freq_subday_type=@fstype, –是否重復執(zhí)行
@freq_subday_interval=@fsinterval, –重復周期
@freq_recurrence_factor=@ffactor,
@active_start_time=@time –下午17:00:00分執(zhí)行
go
/*–應用案例–備份方案:
完整備份(每個星期天一次)+差異備份(每天備份一次)+日志備份(每2小時備份一次)
調(diào)用上面的存儲過程來實現(xiàn)
–*/
declare @sql varchar(8000)
–完整備份(每個星期天一次)
set @sql=’exec p_backupdb @dbname=’’要備份的數(shù)據(jù)庫名’’’
exec p_createjob @jobname=’每周備份’,@sql,@freqtype=’week’
–差異備份(每天備份一次)
set @sql=’exec p_backupdb @dbname=’’要備份的數(shù)據(jù)庫名’’,@bktype=’DF’’
exec p_createjob @jobname=’每天差異備份’,@sql,@freqtype=’day’
–日志備份(每2小時備份一次)
set @sql=’exec p_backupdb @dbname=’’要備份的數(shù)據(jù)庫名’’,@bktype=’LOG’’
exec p_createjob @jobname=’每2小時日志備份’,@sql,@freqtype=’day’,@fsinterval=2
/*–應用案例2
生產(chǎn)數(shù)據(jù)核心庫:PRODUCE
備份方案如下:
1.設(shè)置三個作業(yè),分別對PRODUCE庫進行每日備份,每周備份,每月備份
2.新建三個新庫,分別命名為:每日備份,每周備份,每月備份
3.建立三個作業(yè),分別把三個備份庫還原到以上的三個新庫。
目的:當用戶在produce庫中有所有的數(shù)據(jù)丟失時,均能從上面的三個備份庫中導入相應的TABLE數(shù)據(jù)。
–*/
declare @sql varchar(8000)
–1.建立每月備份和生成月備份數(shù)據(jù)庫的作業(yè),每月每1天下午16:40分進行:
set @sql=’
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_m.bak’’
set @path=dbo.f_getdbpath(null)+@fname
–備份
exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname
–根據(jù)備份生成每月新庫
exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_月’’
–為周數(shù)據(jù)庫恢復準備基礎(chǔ)數(shù)據(jù)庫
exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DBNOR’’
–為日數(shù)據(jù)庫恢復準備基礎(chǔ)數(shù)據(jù)庫
exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’DBNOR’’
’
exec p_createjob @jobname=’每月備份’,@sql,@freqtype=’month’,@time=
–2.建立每周差異備份和生成周備份數(shù)據(jù)庫的作業(yè),每周日下午17:00分進行:
set @sql=’
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_w.bak’’
set @path=dbo.f_getdbpath(null)+@fname
–差異備份
exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’DF’’
–差異恢復周數(shù)據(jù)庫
exec p_backupdb @bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DF’’
’
exec p_createjob @jobname=’每周差異備份’,@sql,@freqtype=’week’,@time=
–3.建立每日日志備份和生成日備份數(shù)據(jù)庫的作業(yè),每周日下午17:15分進行:
set @sql=’
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_l.bak’’
set @path=dbo.f_getdbpath(null)+@fname
–日志備份
exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’LOG’’
–日志恢復日數(shù)據(jù)庫
exec p_backupdb @bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’LOG’’
’
exec p_createjob @jobname=’每周差異備份’,@sql,@freqtype=’day’,@time=
這個說的對!
用SQL2023還原bak文件
1.右擊SQL Server 2023實例下的“數(shù)據(jù)庫”文件夾。就是master等數(shù)據(jù)庫上一級的那個圖標。選擇“所有任務(wù)”,“還原數(shù)據(jù)庫”
2.在“還原為數(shù)據(jù)庫”中填上你希望恢復的數(shù)據(jù)庫名字。這個名字應該與你的源碼中使用的數(shù)據(jù)庫名字一致。
3.在彈出的對話框中,選“從設(shè)備”
4.點擊“選擇設(shè)備”
5.點擊“添鏈橘加”
6.點擊“文件名”文本框右側(cè)的“…”按鈕,選中你的“.BAK”文件,并點擊確定回到“選擇還原設(shè)備”對話框。
7.點擊確定回到“還原數(shù)據(jù)庫”對話框。
8.點擊“選項”選項卡
9.將所有“移至物理文件名”下面的路徑,改為你想還原后的將數(shù)據(jù)庫文件保存到的路徑。如果你不希望改變,可以直接點擊確定。這時便肢弊恢復歷喚族成功了。
FoxPro到底是個什么軟件,它有什么用處??
Visual FoxPro 6.0 關(guān)系數(shù)敬鄭洞據(jù)庫管理系統(tǒng)亮枯是新一代數(shù)據(jù)庫管理系統(tǒng)的杰出代表,以它強大的性能、完整而又豐富的工具、超高速的速度、極其友好的界面叢好,以及完備的兼容性等特點,吸引眾多的國內(nèi)外用戶,倍受廣大用戶的歡迎
Visual FoxPro 6.0 及它的中文版,是可運行于Windows 95和Windows NT平臺的數(shù)據(jù)庫開發(fā)系統(tǒng),它不僅可以簡化數(shù)據(jù)庫管理,而且能使應用程序的開發(fā)流程更為合理。
Visual FoxPro 6.0 使組織數(shù)據(jù)、定義數(shù)據(jù)庫規(guī)則和建立應用程序等工作變得簡單易行。用戶利用可視化的設(shè)計工具和向?qū)В梢钥焖賱?chuàng)建表單,查詢和打印報表。
visual foxpro是數(shù)據(jù)庫管理系統(tǒng),是介于數(shù)據(jù)庫和用戶的管理系統(tǒng),集成開發(fā)語言,提供數(shù)據(jù)庫操作前端界面的制作,提供c/s模式開發(fā),提供api和activitx函數(shù)和控件的接口,是開發(fā)小型數(shù)據(jù)庫的前端工具。
數(shù)據(jù)庫管理系統(tǒng)是一個能夠提供數(shù)據(jù)錄入、修改、查詢的數(shù)據(jù)操作軟件,具有數(shù)據(jù)定義、數(shù)據(jù)操作、數(shù)據(jù)存儲與管理、數(shù)據(jù)維護、通信等功能,且能夠允許多用戶賀薯使用。另外,數(shù)據(jù)庫管理系統(tǒng)的發(fā)展與計算機技術(shù)發(fā)展密切相關(guān)。而且近年來,計算機網(wǎng)彎拍咐絡(luò)逐漸成為人們生活的重要組成部分。
擴展資料:
按功能劃分,數(shù)據(jù)庫管理系統(tǒng)大致可分為6個部分:
(1)模式翻譯:提供數(shù)據(jù)定義語言(ddl)。用它書寫的數(shù)據(jù)庫模式被翻譯為內(nèi)部表示。數(shù)據(jù)庫的邏輯結(jié)構(gòu)、完整性約束和物理儲存結(jié)構(gòu)保存在內(nèi)部的數(shù)據(jù)字典中。數(shù)據(jù)庫的各種數(shù)據(jù)操作(如查找、修改、插入和刪除等)和數(shù)據(jù)庫的維護管理都是以數(shù)據(jù)庫模式為依據(jù)的。
(2)應用程序的編譯:把包含著訪問數(shù)據(jù)庫語句的應用程序,編譯成在dbms支持下可運行的目標程序。
(3)交互式查詢:提供易使用的交互式查詢語言,如SQL.DBMS負責執(zhí)行查詢命令,并將查詢結(jié)果顯示在屏幕上。
(4)數(shù)據(jù)的組織與存?。禾峁?shù)據(jù)在外圍儲存設(shè)備上的物理組織與存取方法。
(5)事務(wù)運行管理:提供事務(wù)運行管理及運行日志,事務(wù)運行的安全性監(jiān)控和數(shù)據(jù)完整性檢查,事務(wù)的并發(fā)控制及系統(tǒng)恢復等功能。
(6)數(shù)據(jù)庫的維護:為數(shù)據(jù)庫管理員提供軟件支持,包括數(shù)據(jù)安全控制、完整性保障、數(shù)據(jù)庫備份、數(shù)據(jù)庫重組以及性能監(jiān)控等維護埋純工具。
以下是我2023年在網(wǎng)上下載的一篇專論,它曾經(jīng)使我堅定而熱烈的走上學習VFP之路,今天在此奉獻全文,一是贈給同道者,二是想差歷堅定猶疑者,三是想反擊輕蔑(VFP)
者?;蛟SVFP本身的強大就已經(jīng)證明了它的價值,并不需要我在這里的聒噪!
您真的了解Visual FoxPro嗎
作為市場上最靈活和功能最強大的數(shù)據(jù)庫管理系統(tǒng),Visual FoxPro擁有悠久而輝煌的發(fā)展歷史。它初創(chuàng)時是Fox Software公司的FoxBASE產(chǎn)品,“Fox”(這是國際編程界對她的稱呼)一種可靠、便捷和蘆察高效的程序員用的數(shù)據(jù)庫產(chǎn)品而名聞遐邇。 世界上沒有一種產(chǎn)品像 Visual FoxPro 那樣運行,她是獨一無二的!許多人在享受了Visual FoxPro的服務(wù)后卻說不清她是什么。就讓我們沿著她的發(fā)展軌跡了解了解她吧!這會使您能對她有更深刻的認識。
FoxPro隸屬于一種名為Xbase的DBMS類別。Xbase這個術(shù)語很常見,他表示諸如FoxPro、dBASEIII PLUS、dBASEIV、FoxBASE+以及ARAGO的語言。Xbase最初起源于一個大型機使用的DBMS,這個DBMS叫做JPLDIS(噴射推動實驗室數(shù)據(jù)庫管理和信息檢索系統(tǒng))。這個DBMS 是由美國人Jeb Long在1972年開發(fā)成功的。到目前為止全世界的開發(fā)者和程序員已經(jīng)編寫了幾千萬行的Xbase代碼。
追溯到80年代末,F(xiàn)oxBASE是dBase的克隆系統(tǒng)。只要是dBASEIII能做的工作,F(xiàn)oxBASE就能做得更好更快。FoxBASE雖然擁有某些全新的特征,但她并沒有真正重大的技術(shù)突破,只是為了運行得更快更好,而更重要的是它與dBASEIII兼容。
FoxPro 1.0首先背離了與兼容的原則。她開始在圖形用戶界面的設(shè)計和軟件開發(fā)方法中采用一些新的思路,從而使她領(lǐng)先于當時年前景已不妙的dBASEIV。從2.0開始,F(xiàn)oxPro才真正形成了她自己的特色。當FoxPro 2.0推出時,它包含了若干項關(guān)鍵技術(shù),給PC數(shù)據(jù)庫開發(fā)市場帶來了革命性的變化。這些技術(shù)是:
1.加入了Rushmore技術(shù),她能從事許多難以想象的復雜工作。突然之陪慶茄間,帶有以百萬計數(shù)的記錄的表格在PC數(shù)據(jù)庫系統(tǒng)中不僅成為可能,而且可以非常容易地加以實現(xiàn),無需轉(zhuǎn)用其他比較昂貴的技術(shù);Rushmore最重要的優(yōu)點在于它是完全自動化的,不用用戶花費精力和時間。因為有了Rushmore技術(shù),再加上Fox天生的快速,即使在今天Visual FoxPro仍然是最快的桌面數(shù)據(jù)庫引擎。
2.加入了Rushmore技術(shù),她能從事許多難以想象的復雜工作。突然之間,帶有以百萬計數(shù)的記錄的表格在PC數(shù)據(jù)庫系統(tǒng)中不僅成為可能,而且可以非常容易地加以實現(xiàn),無需轉(zhuǎn)用其他比較昂貴的技術(shù);Rushmore最重要的優(yōu)點在于它是完全自動化的,不用用戶花費精力和時間。因為有了Rushmore技術(shù),再加上Fox天生的快速,即使在今天Visual FoxPro仍然是最快的桌面數(shù)據(jù)庫引擎。
3.SQL語句是FoxPro 2.0推出的另一項具有革命性意義的關(guān)鍵技術(shù)。Fox的開發(fā)人員首次用單一語句取代了整個程序過程,并且這種支持是內(nèi)含于Fox數(shù)據(jù)引擎之中的。SQL語言曾經(jīng)并且現(xiàn)在仍然是強大的數(shù)據(jù)語言。
FoxPro 2.0還推出了某種所見即所得的開發(fā)報表和屏幕的工具。FoxPro 2.0確實具備了我們今天的Visual FoxPro擁有的一些出色的功能。GUI設(shè)計服務(wù)、SQL和極快的數(shù)據(jù)訪問,是她明顯的特征。
FoxPro 2.5有for DOS、for Windows版,不過那個Windows版只是具有看上去像“Windows”的DOS應用程序的外觀。特別是那個DOS下的版本絕對是經(jīng)典之作,觀察身邊是不是還有很多這樣的系統(tǒng)在運行著?當時有人這樣評價:這個軟件已經(jīng)無法再快了,除非硬件升級……
直到1995年春天Visual FoxPro推出時,才出現(xiàn)了FoxPro的又一次重大改進。這時Microsoft已經(jīng)收購了Fox Software公司。Visual FoxPro 3.0增加了一些人們企盼已久的特性,使PC數(shù)據(jù)庫開發(fā)界大為震驚。我們可以看到:Visual FoxPro與FoxPro是由很大差別的,不要再把Visual FoxPro成為FoxPro了。這些特性是:
1.數(shù)據(jù)庫容器(Database Container),也叫DBC,她增加了開發(fā)人員多年盼望的對存儲過程的支持、與表格相關(guān)聯(lián)的數(shù)據(jù)規(guī)則和一系列的附加數(shù)據(jù)功能。
2.遠程數(shù)據(jù)的無縫連接。談到連接遠程數(shù)據(jù)的處理,大家往往會想到RDO、ADO、BDE等處理數(shù)據(jù)引擎,那么Visual FoxPro利用什么實現(xiàn)遠程數(shù)據(jù)的無縫連接?Visual FoxPro本身的數(shù)據(jù)處理引擎,這和其他任何開發(fā)工具都是不同的!Visual FoxPro數(shù)據(jù)處理引擎通過ODBC驅(qū)動程序與遠程數(shù)據(jù)庫服務(wù)器“通話”,遠程數(shù)據(jù)庫服務(wù)器的ODBC驅(qū)動程序能將Visual FoxPro數(shù)據(jù)轉(zhuǎn)化成可由他們解釋的數(shù)據(jù);相反,Visual FoxPro的ODBC驅(qū)動程序也能將遠程數(shù)據(jù)轉(zhuǎn)化成可由Visual FoxPro數(shù)據(jù)引擎處理的數(shù)據(jù)??梢?,只要遠程數(shù)據(jù)庫有ODBC驅(qū)動程序,就可以用Visual FoxPro最為客戶端軟件。常見的SQL Server、Oracle、Access等數(shù)據(jù)庫都提供ODBC驅(qū)動程序。
在Visual FoxPro中實際操作遠程數(shù)據(jù)有兩種方法,遠程視圖和SPT技術(shù)。視圖(View)是可更新的SQL光標,增加了一整套的數(shù)據(jù)訪問方法,用于數(shù)據(jù)處理、GUI顯示和報表制作。它支持兩種類型的視圖,即本地視圖和遠程視圖。本地視圖是基于Visual FoxPro表格的視圖,遠程視圖是基于任何ODBC數(shù)據(jù)源的視圖。另外為了使Visual FoxPro成為完整的C/S開發(fā)環(huán)境,除視圖之外Visual FoxPro還支持SPT(SQL Pass Through)技術(shù)來完成視圖無法完成的工作,比如數(shù)據(jù)庫服務(wù)器的用戶管理、存儲過程調(diào)用等。View與SPT技術(shù)的產(chǎn)生后,Visual FoxPro就成為訪問遠程數(shù)據(jù)的主要工具。從總體來看,創(chuàng)建整個企業(yè)范圍內(nèi)的應用程序和使用存儲在遠程數(shù)據(jù)源中的數(shù)據(jù),幾乎與使用Visual FoxPro表格本身一樣容易,處理在數(shù)據(jù)存取時增加了一些命令、函數(shù),數(shù)據(jù)處理與普通的Visual FoxPro編程沒有任何區(qū)別。再次指出:Remote View與SPT技術(shù)是由Visual FoxPro數(shù)據(jù)處理引擎直接支持的,這與在VB、VC++中的外部數(shù)據(jù)訪問技術(shù)不同(他們使用組件,如:DAO、RDO、ADO……),所以用Visual FoxPro訪問遠程數(shù)據(jù)的效率很高,并能把遠程數(shù)據(jù)與本地數(shù)據(jù)完美的融合在一起,更大程度地提高開發(fā)效率和程序運行效率。
完全支持面向?qū)ο蠹夹g(shù)(OOP)。充分而健壯的實現(xiàn)了面向?qū)ο蟮奶幚矸绞酱蟠蟾纳屏塑浖_發(fā)條件。健壯的對象模型和創(chuàng)建你自己的類及子類的所用的功能,形成了一種全新的軟件開發(fā)手段。
Visual FoxPro 5.0是3.0的升級版本,它是一個32位的系統(tǒng)。具備了使用和創(chuàng)建COM服務(wù)器的功能,并開始支持在Internet上發(fā)布Visual FoxPro。從這個版本開始,Visual FoxPro進入了Visual studio家族,并且Visual FoxPro將不再升級的謠言也是在這個是其出現(xiàn)。
在Visual FoxPro 6.0出現(xiàn)之前,微軟計劃推出DNA,就是今天的.NET,并承諾把Visual FoxPro發(fā)展成健壯的中間層工具,所以這以后Visual FoxPro的變化初級用戶就不太容易感覺了。Visual FoxPro 6.0也沒有根本上的變化,不過有些變化還是相當明顯的。Access和Assign這兩種方法在控制放入你的對象中的數(shù)據(jù)方面很有創(chuàng)意。運用新的Component Gallery(組件庫)和Foundation Classes(基礎(chǔ)類),你能很容易地轉(zhuǎn)向創(chuàng)建面向?qū)ο蟮膽贸绦虻墓ぷ?。對COM支持的更好,在Server Pack 3后我們可以用Visual FoxPro創(chuàng)建多線程的COM組件。
Visual FoxPro的語言是由Xbase、SQL、OOP構(gòu)成的。我不知道這樣分解是否合理,我只是從FoxPro的發(fā)展歷史得出以上結(jié)論的。其實以上三者在Visual FoxPro完美的融合在一起了,已經(jīng)與Visual FoxPro血脈相連、不可分割,很多語句、函數(shù)很難區(qū)分它屬于哪個門類(也沒必要)。再者Xbase這一叫法也不十分妥當,這樣容易讓人誤會,好像Visual FoxPro的語言是沒有發(fā)展的“死語言”、是十幾年前的“老古董”,其實在FoxPro每一次升級中(現(xiàn)在已是Visual FoxPro 7)都會對這部分語言進行修訂、增補。我看還是這樣:Visual FoxPro語言就叫她:“Visual FoxPro語言”,她既不同于任何以往的Xbase(最多有歷史淵源),也不同于其它的編程語言。這就象Delphi那樣,是Object Pascal語言,不是以前的Pascal;VB就是VB,不是以前的 Basic。
從Fox進入可視化的時代后,對COM技術(shù)的支持一直是Visual FoxPro在過去、現(xiàn)在、將來不斷改進的地方。面向?qū)ο蟪绦蛟O(shè)計(OOP)的更大的好處就在于代碼的重復使用。然而,OOP只是一種解決代碼重復使用的一種優(yōu)秀的方案(solution)。單純利用OOP技術(shù)不僅要求所有對象都必須用一種語言完成,并且你還需要得到原程序代碼嵌入應用程序(就像我們在Visual FoxPro開發(fā)使用Class那樣)。如果對象是有你或你的公司完成的這些可能不是什么問題,但如果對象是由其他人或其他公司寫的這就是問題了……再者為了節(jié)省資源我們常希望把一對象放在遠程的計算機上供許多應用程序使用,怎樣簡單、安全完成這個任務(wù)呢?看來,單有OOP是不行的!于是微軟提出了Component Object Model(COM)技術(shù),有了它我們就不需要把對象源程序嵌入我們的應用程序中,就可以使用其他語言開發(fā)的對象,就可以分布的使用對象了。
ActiveX documents 允許用戶在一個應用程序中編輯另一個應用程序的document。我們把Word文檔嵌入或鏈接到Visual FoxPro中,就可以不離開Visual FoxPro編輯Word文檔了。
ActiveX controls 為開發(fā)人員提供了增加的系統(tǒng)功能的方法,典型的應用就是各類ActiveX控件的使用來加強用戶界面。這里要說明的是Visual FoxPro不支持(7.0也不支持)“集裝箱式的”ActiveX 控件,比如Cool bar控件。
Automation 允許用戶在一個應用程序中操縱另外一個應用程序或組件,典型的應用就是Visual FoxPro 與Office 的OLE-Automation應用。
Remote Automation 或者稱 Distributed COM (DCOM)與Automation技術(shù)差不多,只是它支持組件的分布,這就是微軟的分布式應用戰(zhàn)略。
Visual FoxPro 不支持Active controls(ActiveX)的開發(fā),但支持server components的開發(fā),也就是在Automation、Remote Automation中使用的組件都可以用Visual FoxPro來開發(fā)。Visual FoxPro的這種能力是從5.0開始具有的,到了6.0的SP 3已經(jīng)可以開發(fā)出多線程的組件了,這些在上文已經(jīng)有過論述。Visual FoxPro未來的版本一定會對Automation,特別是Remote Automation有更好的支持,無論是開發(fā)server components,還是由Visual FoxPro充當客戶程序。
綜上所述,Visual FoxPro是創(chuàng)建關(guān)鍵任務(wù)的、企業(yè)范圍的、面向?qū)ο蟮膯螌哟巍㈦p層次、多層次應用程序的重要開發(fā)工具,這些應用程序可以在本地或全球范圍內(nèi)進行配置。
一.Visual FoxPro 已經(jīng)過時了嗎?
恕我直言,這樣的問題我真的聽膩了。這個問題我聽了好幾年了。從謠言出現(xiàn)到今天Visual FoxPro的版本已經(jīng)生了兩次變化,就是Visual FoxPro 6.0 與馬上就要推出的Visual FoxPro 7.0(去年低本人已經(jīng)得到了Visual FoxPro 7.0的Beta 1)。我不能保證是否會有Visual FoxPro 9.0(這就像我不能保證微軟是否在那時還存在一樣),但我可以肯定Visual FoxPro 8.0一定會在一兩年后面世??梢赃@樣認為,只要不出意外情況(比如微軟倒閉、業(yè)界發(fā)生了重大的變革等),F(xiàn)ox就會不斷地發(fā)展!
在國外,一個程序員、一家公司把他們使用的開發(fā)工具視作一項投資,作為Visual FoxPro的開發(fā)廠商微軟公司就必須保護客戶的投資權(quán)益,這是很基本的商業(yè)原則,微軟絕對不敢隨意淘汰有著50萬用戶的Fox,除非永遠不想賺這50萬用戶的錢了。據(jù)我所知Visual J++已經(jīng)被淘汰了,可能支持他的用戶群過于單薄已是個重要原因吧!
為什么會有Visual FoxPro 要淘汰的傳聞呢,我不是很清楚。但這兩年微軟對Visual FoxPro的不宣傳態(tài)度卻是為這股謠言起到了推波助瀾的作用。另外Visual FoxPro 確實是一個容易引起誤會的產(chǎn)品,初級用戶很容易對她產(chǎn)生“不怎么樣的”評判,于是加上那謠言就產(chǎn)生了“Visual FoxPro 就真的要淘汰了”的幻覺了。
二.為什么說Visual FoxPro 是容易引起誤會的產(chǎn)品呢?我總結(jié)以下幾點原因:
產(chǎn)品定位導致Visual FoxPro變化不易為人們感覺。微軟要把Visual FoxPro作為三層構(gòu)架(或是多層構(gòu)架,叫.Net也可以)的中間層開發(fā)工具。
什么是三層構(gòu)架呢?之一層是用戶界面:它包含了用戶界面,讓使用者輸入,輸出,查詢等工作;第三層是資料層:它就是用來放資料的地方,一般是指后端數(shù)據(jù)庫,主要有包括 Oracle、SQL Server 等,它主要是提供一個很大的地方,來有規(guī)則的存放數(shù)據(jù);第二層是商務(wù)邏輯層(中間層):有人要說了:存取資料,直接從之一層跳到第三層可不可以?當然可以,沒有人規(guī)定不能走后門,而且從后門直接抓資料,既快又好,那為什么搞出個第二層呢?商務(wù)規(guī)則是經(jīng)常變化的,比如上班從8 點改為10 點,那電腦怎那么知道老板因為不景氣少讓大家上二個小時班呢?它一定無法知道,你必須告訴它,這時問題就來了,如果你有很多部電腦,例如:100 臺,你就得一部部換新程序。如果這是一個掛在Internet上的網(wǎng)絡(luò)程序,難道總讓用戶download新程序不成?于是就提出了中間層的概念——把處理相同業(yè)務(wù)程序歸攏在一起,一切工作由它完成(由它連接著后臺數(shù)據(jù)庫與前端用戶界面,執(zhí)行商務(wù)邏輯),這樣老板再有什么新花樣就不必擔心了——改一個程序就行了。
中間層是沒有圖形界面設(shè)計的代碼編寫,并且是OOP方式的代碼編寫,不僅要熟悉后臺數(shù)據(jù)庫的特性,還要考慮前臺界面工具的特性,最重要的是商務(wù)邏輯的構(gòu)架,同時還要求懂得IIS、MTS(COM+)、NT的安全設(shè)置等復雜枯燥的東西。如果您仔細研究一下Visual FoxPro在近年來的重要改進,微軟確實向著這個目標花了很大的力氣,成效是令人滿意的。但由于這種變化屬于深層次的升級,不易被人感覺,往往就導致人們誤以為:Visual FoxPro不再發(fā)展了。
不要以為Visual FoxPro是“低端產(chǎn)品”,無論從數(shù)據(jù)庫(DBF Base)品質(zhì)還是開發(fā)環(huán)境評價Visual FoxPro,他都是一個“高端工具”。
許多人認為Visual FoxPro只能用來開發(fā)單用戶系統(tǒng)或是文件服務(wù)器構(gòu)架的小型網(wǎng)絡(luò)系統(tǒng)——這是謬誤——這種無知的言論在許多講C/S、三層構(gòu)架的書中都有(特別是一些VB、PB、Delphi的數(shù)據(jù)庫編程書)。我可以很負責任的告訴大家完全可以用Visual FoxPro開發(fā)C/S結(jié)構(gòu)的系統(tǒng)。這里說的C/S構(gòu)架絕對是正宗的,不是用什么F/S構(gòu)架在糊弄大家。在C/S構(gòu)架中我們常常選擇Visual FoxPro作為客戶端開發(fā)工具,以O(shè)racle、SQL Server等網(wǎng)絡(luò)數(shù)據(jù)庫壓在后臺,使用Visual FoxPro內(nèi)置的Remote View和SPT技術(shù),這樣就可以完美地解決問題。這里不能詳細展開,只特別介紹Visual FoxPro的本地引擎在開發(fā)中的作用。Visual FoxPro的本地引擎特別強大(上文我們說過處理百萬條記錄不費吹灰之力),我們在設(shè)計系統(tǒng)時可以十分簡單的將遠程數(shù)據(jù)與本地數(shù)據(jù)結(jié)合,很簡單、很有效地控制網(wǎng)絡(luò)數(shù)據(jù)流量、提高系統(tǒng)工作效率(我看過不少VB、Delphi、PB的書,他們很少在怎樣控制網(wǎng)絡(luò)數(shù)據(jù)流量、提高系統(tǒng)工作效率論述,不知是不屑一顧,還是其他什么原因)。
我認為Visual FoxPro的本地引擎在C/S構(gòu)架下起碼有三項偉大的用途。其一:非經(jīng)常變動數(shù)據(jù)的本地存。我國的郵政編碼與地區(qū)的關(guān)系是相對穩(wěn)定的數(shù)據(jù),而且數(shù)據(jù)量也不是太小,我想總有上千個記錄(我沒仔細考察過具體情況),我們把這些信息存儲在客戶端的計算機中,就可以在使用郵政編碼及其相關(guān)信息時從本地得到數(shù)據(jù),這樣能使高系統(tǒng)效率同時節(jié)省網(wǎng)絡(luò)資源(這是C/S開發(fā)的重要原則),只在郵政編碼發(fā)生變化時在服務(wù)器上統(tǒng)一更新,下載更新客戶機上的數(shù)據(jù)。如果用別的軟件實現(xiàn)同樣的功能,絕對比Visual FoxPro麻煩而且效果絕對不及Visual FoxPro,這因為Visual FoxPro的數(shù)據(jù)引擎直接支持遠程數(shù)據(jù)讀取,能很好的融合本地數(shù)據(jù)與遠程數(shù)據(jù);其二:離線數(shù)據(jù)包。單位里總有人出差,在千萬里路之外能不能拿著筆記本為客戶發(fā)訂單、與客戶簽合同,就像在自己的辦公室一樣?當他回到公司時只要把筆記本連到服務(wù)器中,發(fā)送更新就行了。Visual FoxPro的離線視圖是經(jīng)濟且高效安全的方案(當然您可以使用遠程撥入或建一個Web網(wǎng)站,這些Visual FoxPro可能干)。其實離線數(shù)據(jù)包還有一個重要的功能:當下載的數(shù)據(jù)是大量的(除非萬不得已請不要這樣設(shè)計系統(tǒng)),這種情況下使用離線視圖可以數(shù)據(jù)集自動轉(zhuǎn)化為物理表,充分利用Visual FoxPro的高速與靈活,完成后連線更新后端數(shù)據(jù)源——一切都很簡單。我認為:離線視圖絕對是Visual FoxPro在C/S系統(tǒng)中的一個賣點,雖然ADO也支持類似的東西,但肯定不及Visual FoxPro有效率;其三:數(shù)據(jù)驅(qū)動。您是否知道,Visual FoxPro中絕大多數(shù)文件格式實際上都是DBF文件,如DBC、SCX、FRX等,他們都可以由Visual FoxPro的本地引擎驅(qū)動完成復雜的任務(wù)。在設(shè)計C/S結(jié)構(gòu)時如果要存儲用戶設(shè)置、自定義文件格式,用Visual FoxPro的本地引擎幫忙絕對比其他軟件簡單,因為你用的是換湯不換藥的方法,但它簡單、有效率。
在三層構(gòu)架中,Visual FoxPro可以從當任意一層的任務(wù),但本人以為大中型系統(tǒng)的數(shù)據(jù)庫部分應以網(wǎng)絡(luò)數(shù)據(jù)庫為主??蛻舳私缑嬗肰isual FoxPro也是可以的,但一般限于企業(yè)內(nèi)部,在Internet上我們通常使用IE作為客戶界面。在三層構(gòu)架中Visual FoxPro最勝任中間層的開發(fā),它簡單(開發(fā)難度與普通的Visual FoxPro項目相差不大)、快速的字符串生成、支持COM技術(shù)、它支持(MTS)COM+技術(shù)、它支持XML(Visual FoxPro 7.0將提供4個或更多與XML有關(guān)的函數(shù))、它具有強大本地數(shù)據(jù)引擎、靈活的數(shù)據(jù)處理方式、它支持多線程的服務(wù)組件的開發(fā)。
可能有人要問:用ASP+腳本語言一樣可以開發(fā)Web系統(tǒng),何必加個中間層。的確,目前在市面上與多討論Web的書都直接使用腳本語言來開發(fā)整個系統(tǒng),這是十分不正確的做法,甚至有寫書還說硬件越來越快,因此使用腳本語言來開發(fā)整個系統(tǒng)并沒有什么關(guān)系。會說出這樣話的作者通常都是沒有實際開發(fā)Web應用經(jīng)驗的人。腳本語言,如VBScript是一種解釋性語言,運行效率很低,他們只合適作為膠水程序。開發(fā)Web系統(tǒng)正統(tǒng)的做法是:把應用邏輯編寫成COM、DCOM對象,或是MTS/COM+對象然后用少量的腳本語言來驅(qū)動/使用這些對象。這樣系統(tǒng)開發(fā)時工作量會大一些,但它符合開發(fā)任何數(shù)據(jù)庫應用程序的最基本的原則:分離應用邏輯與用戶界面。這樣系統(tǒng)就會變的容易維護了——你可以經(jīng)常變換那些膠水程序來改變Web頁面,應用邏輯變換時你又可以改變某一個邏輯對象,而不用為雜亂且關(guān)系復雜的代碼發(fā)愁。再者,由于Visual FoxPro是高效、靈活的數(shù)據(jù)處理語言,任何商業(yè)邏輯都可以用它來代碼化,并且您可以獲得幾十倍甚至上百倍于ASP+腳本語言的運行效率,以及更為強健的執(zhí)行效果。
解決了上面一個問題,又有人會提出:我可以用VB、VC++建立對象組件時,為何我要用Visual FoxPro 來建立相同的組件? 微軟對這一問題有專門的評論,大意為:快、重復使用性、跨語言重復使用性?!翱臁笔侵赣肰isual FoxPro開發(fā)的組件擷取、處理資料都極為迅速,并且Visual FoxPro能夠非常迅速的建立字符串。到底有多快,我想數(shù)據(jù)處理、存取的速度大家平時都領(lǐng)教過了,字符串生成速度我這里有個數(shù)據(jù)不妨一看,這是臺灣的一位高手做的試驗——將1M的數(shù)據(jù)寫入文本中,結(jié)果VC++ 6.0程序用了3.5秒、VB 6.0程序用了11秒、Java 1.1.5用了24秒、Visual FoxPro 6.0用了7秒;“重復使用性”是指Visual FoxPro具備OOP的功能;“跨語言重復使用性”是指Visual FoxPro編寫的對象編譯以后成為COM、COM+對象組件,這樣就可以在其他語言中使用它了。
三.Visual FoxPro 的語言看上去蠻難的
人們在贊揚 Visual FoxPro 始終是褒揚他的易學易用,我不同意這種觀點(我不知道他們站在什么立場上說話)。我看問題的角度是“成為一名還過得去的 Visual FoxPro 程序員”,我的結(jié)論是Visual FoxPro 作為一個開發(fā)工具并不是好學的。這不是說Visual FoxPro的語法、概念像C那么繁復,而是指:即使是簡單的應用,也要掌握很多Visual FoxPro的概念、語法、函數(shù),可能還要較深入了解OOP——往往讓人摸不到深淺。比如,拿數(shù)據(jù)庫系統(tǒng)最重要的功能——查詢來講,Visual FoxPro就“花樣繁多”。我曾統(tǒng)計過,不算“List、Browse”等交互式命令,Visual FoxPro起碼支持4條命令(Find,Seek,Locate,Select-SQL)、3個函數(shù)(Lookup(),Seek(),Indexseek()),(當然其中有的已經(jīng)淘汰)這些命令的關(guān)鍵字、函數(shù)的參數(shù)眾多,有的要求索引, 有的可以用索引但要求優(yōu)化索引……而這在VB、Delphi中絕對就只是兩三個方法的事情。從上面的例子中如果您只看到了Visual FoxPro的繁雜,那么您就完全錯了:在VB、Delphi實現(xiàn)查詢功能的原理與Visual FoxPro應是一樣的,但他們封裝了許多環(huán)節(jié),而Visual FoxPro就把許多東西更低階(當然不如VC++那么低層次,但是已經(jīng)比使用對象的語言難多了)的展示給我們,所以Visual FoxPro的開發(fā)者往往比使用其他的開發(fā)工具開發(fā)者更會思考、更懂得的數(shù)據(jù)庫開發(fā)的真諦,因為工具逼迫他們朝這個方向努力……
用Visual FoxPro有助于提高程序員對數(shù)據(jù)庫概念的理解。許多在Visual FoxPro程序員中不是問題的問題往往成為那些使用對象處理數(shù)據(jù)的程序員的噩夢。比如在Visual FoxPro中數(shù)據(jù)緩沖、事務(wù)處理都是重要的概念(事實上要干活就必須了解這些東西),在其他開發(fā)環(huán)境中一味強調(diào)方便快速往往忽視程序員的基本概念培養(yǎng),編出的東西要么效率不高、要么老出問題。讀書人都懂得:基本概念、基本理論是命根子,這就是Visual FoxPro帶給我們的好處。
有趣的是Visual FoxPro繁、難也就到這個程度了 ,他的學習難度曲線是所有語言中最平穩(wěn)的——不像在有些語言中,基礎(chǔ)開發(fā)十分容易,一旦深入?yún)s難度很高。在Visual FoxPro中初級應用、中級應用、高級應用的難度差異很小——就是那些似曾相識的語句、易于理解的函數(shù)。Visual FoxPro的這種高級應用不太難,初級應用不十分容易的特性,對初入門者來講是無法體會其中的妙處的,這就造成了Visual FoxPro的不太友好形象;
同時,Visual FoxPro的難度卻帶來了很多的好處(前文我已談了很多),Visual FoxPro比其他語言在數(shù)據(jù)處理上更快速、更靈活,數(shù)據(jù)處理方式更多、更完備。設(shè)想一下用Visual FoxPro開發(fā)數(shù)據(jù)對象時,我們可以使用豐富多彩的語句、函數(shù),實現(xiàn)十分復雜、變化多端的功能,用其他語言開發(fā)數(shù)據(jù)對象,它們的功能只能是建立在已有的數(shù)據(jù)對象的功能之上(這叫繼承),變化就少了,功能就弱了。如果要實現(xiàn)Visual FoxPro的Xbase+SQL 那樣靈活、強大的功能恐怕要使用底層的API了——這太可怕了!
OOP不僅是指“面向?qū)ο蟆钡拈_發(fā)環(huán)境,更是一種開發(fā)思想、開發(fā)技術(shù),Visual FoxPro 在后者上做得更好。
我們講過Visual FoxPro完全支持OOP的開發(fā),但有趣的是在數(shù)據(jù)處理方面,微軟實際上沒有提供什么現(xiàn)成的對象(FFC是Visual FoxPro 6.0才有的,且封裝性、適應性都不盡如人意),這一點我不知是Visual FoxPro的福氣還是禍害。說“福氣”這將逼迫程序員掌握這門并不太簡單的技術(shù)(可能用“思想方法”更恰當),而不是簡單地使用對象。OOP對于中間層的開發(fā)來講是很重要的,因為COM組件必須是建立在OOP思想上的,要開發(fā)這種組件就必須掌握OOP技術(shù);講“禍害”這使Visual FoxPro變得不易于學習和使用了(就我個人而言,真正體會到“用Visual FoxPro應會編制數(shù)據(jù)處理對象”這一問題也是在使用了Visual FoxPro好長時間之后的事情了)。事實上現(xiàn)在很多誹謗攻擊Visual FoxPro的人都沒有深刻的認識這一問題——他們只感到Visual FoxPro用起來不及Delphi、PB、VB容易,但他們從不想該怎樣開發(fā)數(shù)據(jù)處理對象,到編寫COM組件時就要他們的命了。那些“精英們”大多不懂OOP,他們只懂“點”操作符號——仿佛對象的使用就是OOP,他們有什么資格來批評我們呢?
四.Visual FoxPro的界面能力真的很差嗎?
我認為最為數(shù)據(jù)庫系統(tǒng)的開發(fā)工具微軟為我們提供的那些內(nèi)置控件加上十幾個附送的ActiveX控件已經(jīng)夠用了。
我們討論Visual FoxPro控件應從兩方面入手,之一就是界面美觀問題,再就是數(shù)據(jù)處理、分析是否方便。很多人很在意的前一個問題,我倒是不以為然——控件不多特別是美化界面的控件不多并不代表Visual FoxPro就開發(fā)不出賞心悅目的軟件,我的感受是軟件界面的專業(yè)化程度、高級別的審美、整體的效果要比個別的界面特效重要千萬倍,實際效果可要好上千萬倍??纯磭庥肰isual FoxPro編制的程序您就會明白這個道理了;我對Visual FoxPro的不滿在于數(shù)據(jù)處理、分析控件不全,特別是缺少了一批數(shù)據(jù)分析控件。比如沒有可以與數(shù)據(jù)捆綁的圖表控件、沒有可以列示捆綁交叉表的表格控件、沒有可以捆綁數(shù)據(jù)的數(shù)據(jù)透視表格控件……在這個問題上Visual FoxPro確實應該向Delphi、PB等軟件學習,這是我們對未來的Visual FoxPro的期望!
五.Visual FoxPro與OLE DB、ADO
ADO是Windows環(huán)境下主流的數(shù)據(jù)存取的解決方案,那些以對象操作數(shù)據(jù)的語言基本上都使用ADO實現(xiàn)數(shù)據(jù)存取,如:VC++、VB、Delphi。在Visual FoxPro的開發(fā)環(huán)境中好像看不到ADO的影子,是不是Visual FoxPro不支持ADO呢?ADO其實是一組COM對象,Visual FoxPro支持COM,當然支持ADO。
我認為:Visual FoxPro對ADO的支持只是停留在較低的水平。這并不是說Visual FoxPro限制了什么ADO的功能(所有功能都能用),而是指:用起來不方便,不像在VB、Delphi中方便。這種不方便主要體現(xiàn)在ADO的Recordset無法與Visual FoxPro的內(nèi)置控件捆綁。其原因是:Visual FoxPro 不認識ADO的Recordset,只能將記錄逐條
visual foxpro是數(shù)據(jù)庫管理系統(tǒng),是介于數(shù)據(jù)庫和用戶的管理系統(tǒng),集成開發(fā)語言,提供數(shù)據(jù)庫操作前端界面的制作,提供c/s模式開發(fā),提供api和activitx函數(shù)和控件的接口,是開發(fā)小型數(shù)據(jù)庫的前端工具.
非常適合家庭,小型清脊鉛企業(yè),事業(yè)單野差位的數(shù)據(jù)庫開發(fā),開發(fā)答好效率高,界面友好.不過數(shù)據(jù)庫安全方面沒有sql和oracl等大型數(shù)據(jù)庫好.
數(shù)據(jù)庫事務(wù)日志 active的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫事務(wù)日志 active,數(shù)據(jù)庫事務(wù)日志:保證系統(tǒng)的數(shù)據(jù)完整性和一致性,用SQL語句備份數(shù)據(jù)庫,FoxPro到底是個什么軟件,它有什么用處??的信息別忘了在本站進行查找喔。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
網(wǎng)頁題目:數(shù)據(jù)庫事務(wù)日志:保證系統(tǒng)的數(shù)據(jù)完整性和一致性(數(shù)據(jù)庫事務(wù)日志active)
當前網(wǎng)址:http://www.dlmjj.cn/article/ccsdcss.html


咨詢
建站咨詢
