3

バックグラウンド:

私はSQLステートメントを使用してサーバー上にTempデータベースを作成しています。このデータベースは、クライアントプログラムでさらに必要になるまでデータを保存します。

問題:

データベースを作成するためのSQLステートメントは正しく機能し、SQL Management Studioで実行すると、必要なすべての仕様でデータベースが作成されます。一方、プログラムがステートメントを実行すると、名前を除いて「デフォルト」設定のデータベースのみが作成されます。 。

質問:

  1. どうしてこれなの?
  2. 自分の仕様でデータベースを作成するにはどうすればよいですか?

SQLステートメント:

CREATE DATABASE Temp ON PRIMARY(NAME = Temp、FILENAME ='C:\ Temp.mdf'、SIZE = 2MB、FILEGROWTH = 10%)LOG ON(NAME = Temp_Log、FILENAME ='C:\ Temp.ldf'、SIZE = 1MB、MAXSIZE = 70MB、FILEGROWTH = 10%)

コード:

public void AcuConvert()
        {
            using (DestD)
            {
                SqlCommand command = new SqlCommand();
                DestD.Open();
                command.Connection = DestD;
                foreach (var item in Entity.SqlDestinationQueries.ToList())
                {
                    command.CommandText = item.Query; 
                    command.ExecuteNonQuery();    //This is where the command is run
                }
                foreach (var item in Entity.SystemQueries.ToList())
                {
                    command.CommandText = item.Query.Replace("@Sys", SysD.Database);
                    command.ExecuteNonQuery();
                }
                foreach (var item in Entity.InsertQueries.ToList())
                {
                    command.CommandText = item.Query.Replace("@Source", SourceD.Database); ;
                    command.ExecuteNonQuery();
                }

            }
        }
4

2 に答える 2

5

生の SQL ステートメントの代わりにSQL Server 管理オブジェクトを使用してみましたか?

例えば:

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

...

// Connect to the default instance
Server server = new Server();
// Establish new database details
Database database = new Database(server, "MyTempDB");
// Add primary filegroup details
database.FileGroups.Add(new FileGroup(database, "PRIMARY"));

// Set Primary datafile properties
DataFile primaryFile = new DataFile(database.FileGroups["PRIMARY"],
    "MyTempDB_Data", "C:\\MyTempDB.mdf");
primaryFile.Size = 2048;   // Sizes are in KB
primaryFile.GrowthType = FileGrowthType.Percent;
primaryFile.Growth = 10;
// Add to the Primary filegroup
database.FileGroups["PRIMARY"].Files.Add(primaryFile);

// Define the log file
LogFile logfile = new LogFile(database, "MyTempDB_Log", "C:\\MyTempDB_Log.ldf");
logfile.Size = 1024;
logfile.GrowthType = FileGrowthType.Percent;
logfile.Growth = 10;
logfile.MaxSize = 70 * 1024;
// Add to the database
database.LogFiles.Add(logfile);

// Create
database.Create();
database.Refresh();

もちろん、特定の資格情報を使用してサーバーに接続することもできます。

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.server.aspx

ただし、テキスト スクリプトを使用してデータベースを作成することに行き詰まっている場合は、接続文字列で初期カタログが正しく (つまり、「マスター」に) 設定されており、ユーザーが必要な権限を持っていることを確認します - CREATE DATABASE /データベースの作成/データベースの変更。それでも問題が解決しない場合は、残りの C# コードを削除して、他のステートメントとは別に create SQL を実行してみてください。前のクエリの副作用がある可能性があります。プロファイラーを使用して、それらを再度追加するときに何が実行されているかを正確に確認してください。

編集:

SqlClientを使用して小さなC#プログラムを介してローカルSQL Serverインスタンス(2012 SqlLocalDB)に対してスクリプトをテストしましたが、ファイルパスを書き込みアクセス権のあるパスに変更した後、問題なく実行されました(Cのルートはデフォルトで保護されています)。その他の唯一の変更点は、プライマリ サイズを 3MB 以上から開始する必要があることでした。これより小さいデフォルトのテーブルは作成できませんでした。これは、あなたが探索するための別の調査手段になる可能性があります。

于 2012-10-10T21:06:01.163 に答える
0

別のオプションとして、Processクラスを使用してsqlcmd.exeを実行することもできます。var process = Process.Start(WORKING_PATH、argument);

%WORKING_PATH%は「C:\ tools \ sql\sqlcmd.exe」です

%argument%は「C:\ scripts\Create.sql」です

私はこの戦略を使用して、受け入れテストフィクスチャをブートストラップするときにテストデータをテスト環境にダンプします。

乾杯

于 2012-10-16T08:51:04.363 に答える