【问题标题】:System.Data.sqlClient will only create default database on serverSystem.Data.sqlClient 只会在服务器上创建默认数据库
【发布时间】:2012-10-04 17:55:23
【问题描述】:

背景:

我正在使用 sql 语句在服务器上创建一个临时数据库,该数据库将存储数据,直到我的客户端程序进一步需要它为止。

问题:

创建数据库的我的 sql 语句正常工作,并在通过 Sql Management Studio 运行时创建具有所有必需规范的数据库,另一方面,当我的程序执行该语句时,它只创建一个具有“默认”设置的数据库,除了名字。

问题:

  1. 这是为什么呢?
  2. 如何让它按照我的规范创建数据库

Sql语句:

在 PRIMARY 上创建数据库临时( 名称 = 温度 , 文件名 = 'C:\Temp.mdf' , 大小 = 2MB , 文件增长 = 10%) 登录 ( 名称 = Temp_Log , 文件名 = 'C:\Temp.ldf' , 大小 = 1MB, 最大大小 = 70MB , 文件增长 = 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();
                }

            }
        }

【问题讨论】:

  • 您是否尝试过在服务器上运行 SQL Profiler 并捕获对服务器执行的确切命令?这可能会为您提供有关它为什么不添加设置的线索。
  • 实际应用了哪些设置?
  • 什么是连接字符串值以及您在 SSMS 中连接的用户?
  • 连接的用户对所有内容拥有完全权限,通过上述代码创建时应用于数据库的设置的日志文件最大大小为 5mb,默认起始大小为 10mb
  • 我在我的一个应用程序中做同样的事情 - 但使用 OleDB - 它工作正常......

标签: c# sql sql-server


【解决方案1】:

您是否尝试过使用 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

但是,如果您坚持使用文本脚本来创建数据库,我会确保您的初始目录在您的连接字符串中设置正确(即“主目录”)并且您的用户拥有必要的权限 -创建数据库/创建任何数据库/更改数据库。如果这仍然没有给您带来任何乐趣,请尝试剥离其余的 C# 代码并独立于其他语句运行 create SQL - 这可能是前面查询的副作用。使用Profiler 准确查看在您添加它们时正在运行的内容。

编辑:

我通过一个使用 SqlClient 的小型 C# 程序针对本地 SQL Server 实例 (2012 SqlLocalDB) 测试了您的脚本,并且在将文件路径更改为我有权写入的路径后它运行得很好(默认情况下,C 的根目录受到保护) .唯一的其他修改是 Primary 大小必须从 3MB 或更多开始。无法创建任何较小的默认表。这可能是您探索的另一种调查途径。

【讨论】:

  • 主数据文件的大小取决于模型数据库,因为它是作为模型数据库的副本创建的。您可以缩小模型数据库以允许更小的初始数据库大小。
  • @TToni - 这很有趣,我从不知道你可以缩小模型。 3MB 默认主大小用于新的 SqlLocalDB 安装。我相信 2005、2008 和 2008 R2 默认有 2MB,但我不知道 OP 使用的是什么版本。
【解决方案2】:

您的替代选择可能是使用 Process 类来运行 sqlcmd.exe 例如。 var process = Process.Start(WORKING_PATH, argument);

%WORKING_PATH% 为“C:\tools\sql\sqlcmd.exe”

%argument% 是“C:\scripts\Create.sql”

在引导验收测试夹具时,我使用此策略将测试数据转储到测试环境中。

干杯

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2012-09-15
    • 2018-07-09
    • 2019-11-25
    • 2013-01-18
    • 2018-09-11
    相关资源
    最近更新 更多