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

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

请问大侠咋办呢???
...全文
410 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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 '数据库名'

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧