• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

如何修改数据库名(在SQL语句中),我用的时候出错,急!!

NoReady 2003-11-25 05:15:59
我用以下方式在查询分析器中都可行:
1、alter database oldname modify name=newname方式
2、sp_rename
3、sp_renamedb
但在ado.net中修改数据库名称都出错,提示为:
未能排它地锁定数据库以执行该操作。

请问大侠咋办呢???
...全文
368 点赞 收藏 11
写回复
11 条回复
NoReady 2003年11月26日
我用  txlicenhe(马可) 的方法先调用临时存储过程将数据库关闭,然后再改名,可以了!谢谢。
回复 点赞
NoReady 2003年11月26日
谢谢各位热心的朋友了!

我不是不明白这些原因,而且在自己和别人都没有打开该库的情况下用我自己的3种方法都已经实现过了;而是因为我在写一个类,在这个类中要实现“更改数据库名称”这个方法,但是实际运行时,很多可能要改名的数据库已经被别人使用了,导致我自己修改库名时失败!!!
回复 点赞
xueqs 2003年11月25日
up
回复 点赞
youngby 2003年11月25日
Dim sqlConn as New sqlConnection("server=myServer;User ID=sa;Password=;database=myOldDatabse;Connection Reset=ture;")
sqlConn.Open()
'输出老的数据库名
Console.WriteLine(sqlConn.Database)

'由当前数据库转到master数据库
sqlConn.ChangeDataBase("master")

Dim myCmd as new sqlCommand
with myCmd
.Connection=sqlConn
.CommandText="sp_renamedb"
.CommantType=CommandType.StoreProcedure
End With

Dim prmSql as sqlClient.SqlParameter


'注意输入参数与原存储过程的参数相对应
prmSql=myCmd.Parameters.Add("@dbname",yourOldName)
myCmd.Parameter.Directin=ParameterDirection.Input
prmSql=myCmd.Parameters.Add("@newname",yourNewName)
myCmd.Parameter.Direction=ParameterDirection.Input

sqlConn.Open()
'用executeReader也可以,不过改成executeNonQuery比较合适
Dim dr as sqlDateReader=myCmd.ExecuteNonQuery
dr.close()
SqlConn.Close()
回复 点赞
youngby 2003年11月25日
'说明,你最好先执行马可的存储过程再执行sp_renamedb,马可的存储过程是KILL掉 访问当前数据库的会话的。有参数的存储过程在ADO.NET中的执行参考如下


Dim sqlConn as New sqlConnection("server=myServer;User ID=sa;Password=;database=myOldDatabse;Connection Reset=ture;")
sqlConn.Open()
'输出老的数据库名
Console.WriteLine(sqlConn.Database)

sqlConn.ChangeDataBase("master")

Dim myCmd as new sqlCommand
with myCmd
.Connection=sqlConn
.CommandText="sp_renamedb"
.CommantType=CommandType.StoreProcedure
End With

Dim prmSql as sqlClient.SqlParameter


'注意输入参数与原存储过程的参数相对应
prmSql=myCmd.Parameters.Add("@dbname",yourOldName)
myCmd.Parameter.Directin=ParameterDirection.Input
prmSql=myCmd.Parameters.Add("@newname",yourNewName)
myCmd.Parameter.Direction=ParameterDirection.Input

sqlConn.Open()
Dim dr as sqlDateReader=myCmd.ExecuteReader
dr.close()
SqlConn.Close()
回复 点赞
pengdali 2003年11月25日
这就象你站在凳子上要换凳子一样
回复 点赞
pengdali 2003年11月25日
你应该:

use master
exec sp_renamedb........
回复 点赞
youngby 2003年11月25日
Dim sqlConn as New sqlConnection("server=myServer;User ID=sa;Password=;database=myOldDatabse;Connection Reset=ture;")
sqlConn.Open()
'输出老的数据库名
Console.WriteLine(sqlConn.Database)

sqlConn.ChangeDataBase("master")

Dim myCmd as new sqlCommand
with myCmd
.Connection=sqlConn
.CommandText="sp_renamedb"
.CommantType=CommandType.StoreProcedure
End With

Dim prmSql as sqlClient.SqlParameter
........................


回复 点赞
youngby 2003年11月25日
sqlConn.ChangeDatabase("master")
回复 点赞
NoReady 2003年11月25日
我把查询分析器和企业管理器全关了,用vb.net代码执行是没问题的!
TO: txlicenhe(马可)
你这个存储过程是用来关闭打开的数据库吗?
回复 点赞
txlicenhe 2003年11月25日
数据库不能打开,包括你自己也不能打开。
可以先打开master数据库,再
可用如下方式关闭

use master
go
create proc killspid (@dbname varchar(20))
as
begin
declare @sql nvarchar(500),@temp varchar(1000)
declare @spid int
set @sql='declare getspid cursor for
select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
exec (@sql)
open getspid
fetch next from getspid into @spid
while @@fetch_status =0
begin
set @temp='kill '+rtrim(@spid)
exec(@temp)
fetch next from getspid into @spid
end
close getspid
deallocate getspid
end

--用法
use master
exec killspid '数据库名'
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告