2013-10-23 33 views
0

我想使用简单的CLR函数来备份sql数据库。从CLR功能备份数据库

[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,行的用户定义的例程或聚合 “的backupdb” 执行过程中出现1个 一个.NET Framework错误: System.Data.SqlClient的.SqlException:函数内副作用运算符'BACKUP DATABASE'的无效使用。 System.Data.SqlClient.SqlException: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlCommand.RunExecuteNonQuerySmi(Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion,String methodName,Boolean sendToPipe,Int32 timeout,Boolean asyncWrite) at System.Data。 SqlClient.SqlCommand.ExecuteNonQuery() at UserDefinedFunctions.BackupDb()

+1

您不能在函数内对数据库进行更改。就这么简单。备份数据库确实会更改该数据库(特别是它如何处理事务日志的各个部分) –

+0

谢谢,我创建了[SqlProcedure]而不是函数,现在它工作正常。如果你写这个评论作为答案,我会接受它。 – Milos

回答

1

您无法在函数内对数据库进行更改。就这么简单。并且备份数据库确实会更改该数据库(特别是它如何处理事务日志的各个部分)

如果您想要a)可以进入SQL Server的内容,b)可以让您编写c#代码,和c)让我们对数据库进行更改,适合该定义的唯一对象是CLR Stored Procedure