2012-10-04 59 views
3

背景:System.Data.SqlClient的只會在服務器上創建默認數據庫

我使用SQL語句來創建,直到它被我的客戶端程序,進一步需要將數據存儲在服務器上的臨時數據庫。

問題:

我的SQL語句來創建數據庫的正常運行,當通過SQL Management Studio中運行創建包含所有需要的規格數據庫,在另一方面,當我的程序執行該語句只創建一個數據庫除了名稱以外的「默認」設置。

問題:

  1. 這是爲什麼?
  2. 我怎樣才能使創建數據庫與我的規格

SQL語句:

CREATE DATABASE溫度ON PRIMARY( NAME =溫度 ,FILENAME =「C:\ Temp.mdf ' ,SIZE = 2MB ,FILEGROWTH = 10%)登錄( 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(); 
       } 

      } 
     } 
+2

您是否嘗試過在服務器上運行SQL Profiler並捕獲對服務器執行的確切命令?這可能會給你一個線索,爲什麼它不添加設置。 – SchmitzIT

+0

實際應用了哪些設置? –

+0

什麼是連接字符串值和您在SSMS中連接的用戶? – Rikki

回答

5

您是否嘗試過使用SQL Server Management Objects代替原始的SQL語句?

例如:

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

但是,如果你堅持使用文字腳本爲了創建你的數據庫,我會確保你的初始目錄在連接字符串中正確設置(即'master'),並且你的用戶具有必要的權限 - CREATE DATABASE/CREATE ANY DATABASE/ALTER DATABASE。如果這仍然沒有給你帶來任何喜悅,那麼嘗試剝去其餘的C#代碼並獨立於其他語句運行create SQL - 可能是前面的查詢有副作用。使用Profiler,看看到底發生了什麼跑,你在加回

編輯:

我使用的SqlClient通過一個小的C#程序測試腳本對本地SQL Server實例(2012 SqlLocalDB),它跑了將文件路徑更改爲我有權訪問的文件路徑(C的根目錄受默認保護)後,就好了。唯一的另一個修正是主要尺寸必須從3MB或更多。任何較小的和默認的表格都無法創建。這可能是您探索的另一個調查途徑。

+0

主數據文件必須有多大取決於模型數據庫,因爲它是作爲模型數據庫的副本創建的。您可以縮小模型數據庫以允許較小的初始數據庫大小。 – TToni

+0

@Toni - 這很有趣,我從來不知道你可以縮小模型。 3MB的默認主要大小是用於新的SqlLocalDB安裝。我相信2005,2008和2008 R2有一個2MB的默認值,但我不知道OP使用的是什麼版本。 –

0

您的替代選項可能是使用Process類來運行sqlcmd。例如 例如。 var process = Process.Start(WORKING_PATH,argument);

%WORKING_PATH%爲 「C:\工具\ SQL \ sqlcmd.exe」

%的說法%爲 「C:\腳本\ Create.sql」

我用這個策略來轉儲測試數據在引導驗收測試夾具時進入測試環境。

乾杯

相關問題