2

SQL 経由でデータベースを作成するのではなく、空のデータベースを復元することで、ローカル マシン上にデータベースを作成する労力を減らしたいと考えています。

これはこれまでの私のコードです (DataAccess.ApplicationDirectory は "C:\ProgramData\RC Vehicle Management\" です):

 public static void CreateLocalDatabase () {
        const String emptyDatabaseFileName = "EmptyDatabase.bak";

        if(Directory.Exists(DataAccess.ApplicationDirectory) == false) {
            Directory.CreateDirectory(DataAccess.ApplicationDirectory);
        }
        File.WriteAllBytes(Path.Combine(DataAccess.ApplicationDirectory + emptyDatabaseFileName), Resources.RcVehicleManagement);

        using (SqlConnection sqlConnection = DataAccess.LocalMachineConnection()) {
            sqlConnection.Open();
            using (SqlCommand sqlCommand = new SqlCommand("RESTORE DATABASE [@localDatabaseName] " +
                                                          "FROM DISK = '@emptyDatabasePath' " + 
                                                          "WITH NOUNLOAD, REPLACE", sqlConnection)) {
                sqlCommand.Parameters.Add("@localDatabaseName", System.Data.SqlDbType.VarChar).Value = DataAccess.LocalDatabaseConnectionString.InitialCatalog;
                sqlCommand.Parameters.Add("@emptyDatabasePath", System.Data.SqlDbType.VarChar).Value = Path.Combine(DataAccess.ApplicationDirectory, emptyDatabaseFileName);

                sqlCommand.ExecuteNonQuery();
            }
        }
    }

しかし、実行すると、次の例外が発生します(「sqlCommand.ExecuteNonQuery();」で):

Cannot open backup device 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\@emptyDatabasePath'.
Operating system error 2(failed to retrieve text for this error. Reason: 15105).
RESTORE DATABASE is terminating abnormally.

「c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup」からバックアップを取得する理由がわかりません。宣言するパスは「C:\ProgramData\RC Vehicle Management\EmptyDatabase.バク」

私は何を間違っていますか?それとも、「c:\Program Files\Microsoft SQL...\Backup」以外のパスから復元できないのでしょうか?

4

1 に答える 1

3

問題が見つかりました。パラメーターを括弧や引用符で囲むことはできません。

これは機能します:

SqlCommand sqlCommand = new SqlCommand("RESTORE DATABASE @localDatabaseName " +
                                       "FROM DISK = @emptyDatabasePath " +
                                       "WITH NOUNLOAD, REPLACE", sqlConnection)
于 2013-05-13T10:48:15.217 に答える