首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB调用存储过程恢复数据库遇到一个奇怪的有关问题,高手来看一下,分不够再加

2012-01-19 
VB调用存储过程恢复数据库遇到一个奇怪的问题,高手来看一下,分不够再加!传递了三个参数:其中有两个路径,参

VB调用存储过程恢复数据库遇到一个奇怪的问题,高手来看一下,分不够再加!
传递了三个参数:其中有两个路径,参数比较长,执行存储过程时,在SQL事件查看器中发现最后有一部分字符被截取了,这是什么原因???
----------------------存储过程如下--------------------

create   proc   p_RestoreDb
@bkfile   nvarchar(1000),     --定义要恢复的备份文件名
@dbname   sysname= ' ',             --定义恢复后的数据库名,默认为备份的文件名
@dbpath   nvarchar(260)= ' ',   --恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@retype   nvarchar(10)= 'DB ',   --恢复类型: 'DB '完事恢复数据库, 'DBNOR '   为差异恢复,日志恢复进行完整恢复, 'DF '   差异备份的恢复, 'LOG '   日志恢复
@filenumber   int=1,       --恢复的文件号
@overexist   bit=1,                 --是否覆盖已经存在的数据库,仅@retype为
@killuser   bit=1               --是否关闭用户使用进程,仅@overexist=1时有效
as
declare   @sql   varchar(8000)

--得到恢复后的数据库名
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)

--得到恢复后的数据库存放目录
if   isnull(@dbpath, ' ')= ' '   set   @dbpath=dbo.f_getdbpath( ' ')

--生成数据库恢复语句
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

  --创建临时表,保存获取的信息
  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

--关闭用户进程处理
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

--恢复数据库
exec(@sql)
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

----------------------VB程序如下:------------------------------
Set   ConnADO   =   New   ADODB.Connection
                ConnADO.ConnectionString   =   "Provider=SQLOLEDB.1;Password= "   &   HostInfo.SqlPassword   &   ";Persist   Security   Info=True;User   ID= "   &   HostInfo.SqlUserName   &   ";Initial   Catalog=master;Data   Source= "   &   HostInfo.SqlHostName
                ConnADO.Open
               
                MyComm.ActiveConnection   =   ConnADO
                MyComm.CommandText   =   "p_RestoreDb "
                MyComm.CommandType   =   adCmdStoredProc
                Set   Param   =   MyComm.CreateParameter( "bkfile ",   adVarChar,   adParamInput,   1000,   NewPath)
                MyComm.Parameters.Append   Param
                Set   Param   =   MyComm.CreateParameter( "dbname ",   adVarChar,   adParamInput,   256,   HostInfo.SqlDataName)
                MyComm.Parameters.Append   Param
                Set   Param   =   MyComm.CreateParameter( "dbpath ",   adVarChar,   adParamInput,   260,   HostInfo.SqlPath)


                MyComm.Parameters.Append   Param
               
                MyComm.Execute

[解决办法]
把路径中的汉字改为英文试试。
[解决办法]
长度过长肯定会被截取的。
改一个短的路径不就得了,干嘛这么死板。
[解决办法]
把你从ini取值的代码贴来看看。

热点排行