微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用 .Net c# 程序中的存储过程备份 SQL Server 数据库,但 ssms 中的相同过程可以正常工作

如何解决无法使用 .Net c# 程序中的存储过程备份 SQL Server 数据库,但 ssms 中的相同过程可以正常工作

我写了一个 sql Server 存储过程来备份数据库

ALTER PROCEDURE [dbo].[usp_backup_database]
    (@dbname sysname = NULL)
AS
BEGIN
    SET NOCOUNT ON;

    IF LEN (ISNULL (@dbname,'')) > 0
    BEGIN
        DECLARE @path VARCHAR(256) = 'D:\MSsql\MSsql10_50.MSsqlSERVER\MSsql\Backup\';
        DECLARE @fileName VARCHAR(256);
        DECLARE @fileDate VARCHAR(50) = REPLACE (CONVERT (VARCHAR(50),GETDATE (),126),':','-');

        SET @fileName = @path + @dbname + '_' + @fileDate + '.BAK';

        BEGIN TRY
            BACKUP DATABASE @dbname 
            TO disK = @fileName WITH COMPRESSION;
        END TRY
        BEGIN CATCH
            DECLARE @ErrorMessage NVARCHAR(4000);
            DECLARE @ErrorSeverity INT;
            DECLARE @ErrorState INT;

            SELECT 
                @ErrorMessage  = @fileName + N' ' + ERROR_MESSAGE (),@ErrorSeverity = ERROR_SEVERITY (),@ErrorState    = ERROR_STATE ();

            RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState);
        END CATCH
    END
END

在 SSMS 中调用它工作正常,即 exec usp_backup_database 'dbname' 每次都成功备份 dbname!

但是,我有一个 C# 程序,我从中调用了这个存储过程,但它从不执行任何操作。完全没有例外,只是什么都没有发生。

我开始从 Entity Framework 6 调用它,这引发了一个非常无用的异常,这就是为什么我转而从 .NET 而不是 EF 调用存储过程(这解释了我代码中的时髦 EntityConnectionStringBuilder 构造它只提取较大 EF 连接字符串的 sql 连接字符串部分)。

我通过 .NET 连接到 sql Server 的用户是 sysadmin 角色的成员,所以我认为这不是权限问题。任何人的任何想法?

private static void BackupDatabase(string dbname)
{
        try
        {
            var efcb = new EntityConnectionStringBuilder(Core.WPMMasterConnectionString);

            using (var conn = new sqlConnection(efcb.ProviderConnectionString))
            {
                conn.open();

                using (var cmd = new sqlCommand("dbo.usp_backup_database",conn))
                {
                    cmd.Parameters.Add(new sqlParameter("@dbname",dbname));
                    cmd.ExecuteNonQuery();
                }
            }
        }
        catch (sqlException sqlex)
        {
            displayUtils.ShowLine(sqlex);
        }
        catch (Exception ex)
        {
            displayUtils.ShowLine(ex);
        }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。