【发布时间】:2013-10-23 10:31:49
【问题描述】:
我正在尝试使用简单的 CLR 函数来备份 sql 数据库。
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static int BackupDb()
{
using (var conn = new SqlConnection("context connection=true"))
{
conn.Open();
var cmd = new SqlCommand(
@"backup database MyDatabase to disk='d:\temp\MyDatabase.bak' WITH INIT, STATS=10", conn);
cmd.ExecuteNonQuery();
}
return 0;
}
但是这段代码给出了异常
消息 6522,第 16 层,状态 1,第 1 行
执行用户定义的例程或聚合“BackupDb”期间发生 .NET Framework 错误:
System.Data.SqlClient.SqlException:在函数中无效使用副作用运算符“BACKUP DATABASE”。
System.Data.SqlClient.SqlException:
在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔型 breakConnection,Action1 wrapCloseInAction)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQuerySmi(Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 完成,字符串方法名,布尔型 sendToPipe,Int32 超时,布尔型异步写入)
在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
在 UserDefinedFunctions.BackupDb()
【问题讨论】:
-
您不能从函数中更改数据库。就这么简单。并且备份数据库确实会更改该数据库(特别是它如何处理事务日志的部分)
-
谢谢,我创建了 [SqlProcedure] 而不是函数,现在它工作正常。如果您将此评论写为答案,我会接受。
标签: c# sql-server-2012 clr