C# System.Data.sqlClient将仅在服务器上创建默认数据库
背景: 我正在使用sql语句在服务器上创建一个临时数据库,该数据库将存储数据,直到我的客户端程序需要它为止 问题: 用于创建数据库的sql语句正常工作,并在通过sql Management studio运行时使用所有必需的规范创建数据库,另一方面,当我的程序执行该语句时,它仅使用“默认”设置(名称除外)创建数据库 问题:C# System.Data.sqlClient将仅在服务器上创建默认数据库,c#,sql,sql-server,C#,Sql,Sql Server,背景: 我正在使用sql语句在服务器上创建一个临时数据库,该数据库将存储数据,直到我的客户端程序需要它为止 问题: 用于创建数据库的sql语句正常工作,并在通过sql Management studio运行时使用所有必需的规范创建数据库,另一方面,当我的程序执行该语句时,它仅使用“默认”设置(名称除外)创建数据库 问题: 为什么会这样 我怎样才能让它用我的规范创建一个数据库 Sql语句: 在主服务器上创建数据库临时文件( NAME=Temp ,FILENAME='C:\Temp.mdf' ,大小
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();
当然,您也可以使用特定凭据连接到服务器:
但是,如果您一直使用文本脚本创建数据库,我会确保您的连接字符串中的初始目录设置正确(即设置为“主”),并且您的用户具有必要的权限-创建数据库/创建任何数据库/更改数据库。如果这仍然没有给您带来任何乐趣,那么尝试剥离其余的C#代码,独立于其他语句运行CREATESQL——可能是前面的查询有副作用。用于在将它们重新添加到中时查看正在运行的内容
编辑:
我通过一个使用SqlClient的小型C#程序,针对本地SQL Server实例(2012 SqlLocalDB)测试了您的脚本,在将文件路径更改为我有写访问权限的路径后,它运行良好(默认情况下保护C的根目录)。唯一的另一个修正是,主要尺寸必须从3MB或更多开始。无法创建任何较小的表和默认表。这可能是您要探索的另一种调查途径。您的替代选项可能是使用Process类运行sqlcmd.exe 如。 var process=process.Start(工作路径、参数) %工作路径%为“C:\tools\sql\sqlcmd.exe” %参数%为“C:\scripts\Create.sql” 在引导验收测试装置时,我使用此策略将测试数据转储到测试环境中
干杯您是否尝试在服务器上运行SQL Profiler并捕获针对服务器执行的确切命令?这可能会为您提供一条线索,说明它为什么不添加设置。实际应用了哪些设置?连接字符串值是多少?您在SSMS中连接的是哪个用户?连接的用户对所有内容都拥有完全权限,通过上述代码创建数据库时应用于数据库的设置的日志文件最大大小为5mb,默认起始大小为10MB,这在我的一个应用程序中实现了完全相同的功能—但使用OleDB—并且工作正常……主数据文件的大小取决于模型数据库,因为它是作为模型数据库的副本创建的。您可以缩小模型数据库以允许更小的初始数据库大小。@TToni-这很有趣,我从来不知道您可以缩小模型。3MB默认主大小用于新的SqlLocalDB安装。我相信2005、2008和2008 R2都有2MB的默认值,但我不知道OP使用的是什么版本。
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();