【问题标题】:Export blob from remote sql server and save to file on disk where sql server is located [C#]从远程 sql server 导出 blob 并保存到 sql server 所在磁盘上的文件 [C#]
【发布时间】:2014-02-24 05:10:35
【问题描述】:

我需要做什么: 我正在为我的公司开发备份和恢复工具。备份远程 SQL 数据库没有任何问题。但是我在恢复它们时遇到了问题。我目前正在远程 SQL 上创建一个临时表,其中保存了数据库的二进制文件。

现在我需要将此二进制字段从远程 SQL Server 导出到需要保存在远程磁盘上的文件。该工具需要在本地机器上启动,因此无法在远程服务器上运行。

当前代码部分:

using (SqlConnection conn = new SqlConnection(sqlConnectionString))
            {
                System.Data.SqlClient.SqlCommand commandAdd = new SqlCommand("CREATE TABLE dbo.tempTable (filename char(50), blob image);", conn);
                conn.Open();

                if (commandAdd.ExecuteNonQuery() != 0)
                {
                    byte[] fileBytes = System.IO.File.ReadAllBytes(fileSource);
                    System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("INSERT INTO dbo.tempTable (blob,filename) values (@blob,@name)", conn);
                    command.Parameters.AddWithValue("blob", fileBytes);
                    command.Parameters.AddWithValue("name", dbName);

                    if (command.ExecuteNonQuery() != 0)
                    {
                        // This is just for testing if i get binary back
                        // string SQL = "SELECT blob FROM dbo.tempTable";
                        // SqlCommand cmd = new SqlCommand(SQL, conn);
                        // byte[] byt = (byte[])cmd.ExecuteScalar();

                        // I think Problem is within this 2 lines..
                        Server server = new Server(new ServerConnection(conn));
                        server.ConnectionContext.ExecuteReader("'bcp.exe \"SELECT blob FROM dbo.tempTable\" queryout " + destinationSource + " -T -c'");

                        Restore restore = new Restore();
                        restore.Database = "_" + dbName;
                        restore.Action = RestoreActionType.Database;
                        restore.ReplaceDatabase = true;
                        restore.Devices.AddDevice(destinationSource, DeviceType.File);
                        restore.ReplaceDatabase = true;
                        restore.NoRecovery = false;
                        Server sqlServer = new Server(new ServerConnection(conn));
                        restore.SqlRestore(sqlServer);
                    }
                }

                SqlCommand commandDelete = new SqlCommand("DROP TABLE dbo.tempTable", conn);
                commandDelete.ExecuteNonQuery();
                conn.Close();
            }

谢谢

【问题讨论】:

    标签: c# sql-server export blob bcp


    【解决方案1】:

    好的,我再试一次。 看这里:https://www.simple-talk.com/sql/t-sql-programming/the-tsql-of-text-files/

    --then we execute the BCP to save the file
      SELECT  @Command = 'bcp "select BulkCol from ['
              + @MySpecialTempTable + ']'
              + '" queryout '
              + @Filename + ' '
             + CASE WHEN @Unicode=0 THEN '-c' ELSE '-w' END
              + ' -T -S' + @@servername
      EXECUTE @RESULT= MASTER..xp_cmdshell @command, NO_OUTPUT
    

    您可以从 c# 代码调用 xp_cmdshell 来在服务器上执行命令(并保存文件)

    【讨论】:

    • 我现在的问题是我不知道如何将它插入到我的 c# 代码中并让它工作.. 我找到了很多例子,但从来没有让它在 c# 中工作..
    【解决方案2】:

    你可以在远程服务器上使用FILESTREAM 吗?您可以将备份保存到 FILESTREAM 列中,这会将其保存到磁盘,您可以配置 FILESTREAM 以使流可用于其他进程(在本例中为 SQL Server 本身)。

    例如,如果 FILESTREAM 列名为“Backup”,您可以使用 Backup.PathName() 获取相应的路径并使用它来发出 RESTORE 命令,我认为这将是解决您的问题的一个非常优雅的解决方案(不使用 xp_cmdshell 或类似的讨厌的解决方法)。

    这样一个“文件流备份表”的简单示例是

    CREATE TABLE MyBackup
    (
      BackupName VARCHAR(100),                -- To identify the backup
      BackupContent VARBINARY(max) FILESTREAM -- To store the physical backup
    );
    

    您在尝试创建此类表时可能会遇到错误,具体取决于在给定服务器和数据库上是启用还是禁用 FILESTREAM 功能(默认情况下禁用)。

    【讨论】:

    • 不知道,'CREATE' 语法应该如何呢?抱歉,我是使用 SQL 和远程服务器开发的新手。..
    • 我相应地修改了我的答案
    • 似乎无法正常工作。“随机 FILESTREAM-Filegroup 在此数据库中不可用。”
    • @Relax:好吧,您必须与 SQL Server 管理员交谈,然后才能配置此功能。如果这不可能,FILESTRAEM 方法将不适合您。
    • 我们在 SQL - Server 配置工具中激活了 FILESTREAM 并重新启动了服务器。什么都没发生。还是一样的错误信息..
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多