在SQL Server中以编程方式创建数据库

22

我如何通过编程方式创建数据库,需要哪些最少的信息才能实现?

不要提供 "SQL Server Management Object API" 的建议。

6个回答

29

你可以使用 SQL Server Management Object API(参见任务“创建、修改和删除数据库”):

 var srv = new Server();
 var db = new Database(srv, "mydb");
 db.Create();

如何入门信息请点击这里。在安装 SQL Server 时,你需要安装客户端 SDK,SMO 组件位于 C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies。

或者,如果不想依赖这些组件,也可以使用 ADO.Net 运行 DDL 语句(例如参考此问题):

using (var connection = new SqlConnection(myConnectionString))
{
    connection.Open();
    var command = connection.CreateCommand();
    command.CommandText = "CREATE DATABASE mydb";
    command.ExecuteNonQuery();
}  

显然,您需要正确的连接字符串:已知的 SQL Server 实例和具有 CREATE DATABASE 权限的用户。


1
你应该使用具有正确权限的用户。您可以通过使用相同的凭据连接到 SQL Management Studio 并手动创建 DB 来测试此功能。 - jeroenh
足够简单,继续发布您的连接字符串。您有SA用户吗?也许可以使用它? - RandomUs1r
这和在Visual Studio中创建数据库项目一样吗?那是否使用SSMO API?基本上,我克隆了一个数据库,现在我想以我提供的连接字符串为基础进行程序化发布。完成了。 - Piotr Kula
1
请注意,SMO类在.NET 4.0中不可用:https://connect.microsoft.com/SQLServer/feedback/details/643811/net-4-0-compatible-smo - stefan.s
如果您遇到登录问题,请尝试将以下内容添加到连接字符串中:Integrated Security = true; - user1234433222
显示剩余2条评论

8
Create database 'Databasename'

5
当然,这很愚蠢,我只是使用了一个不存在/虚构的连接字符串来创建数据库:P - Pascal

7

来自创建者的说法:

// your connection string
string connectionString = "Server=(local)\\netsdk;uid=sa;pwd=;database=master";

// your query:
var query = GetDbCreationQuery();

var conn = new SqlConnection(connectionString);
var command = new SqlCommand(query, conn);

try
{
    conn.Open();
    command.ExecuteNonQuery();
    MessageBox.Show("Database is created successfully", "MyProgram", 
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
    MessageBox.Show(ex.ToString());
}
finally
{
    if ((conn.State == ConnectionState.Open))
    {
        conn.Close();
    }
}

要使用默认设置在默认位置创建,只需执行以下操作:

static string GetDbCreationQuery()
{
    // your db name
    string dbName = "MyDatabase";

    // db creation query
    string query = "CREATE DATABASE " + dbName + ";";

    return query;
}

或者,将其创建在特定位置:

static string GetDbCreationQuery()
{
    // your db name
    string dbName = "MyDatabase";

    // path to your db files:
    // ensure that the directory exists and you have read write permission.
    string[] files = { Path.Combine(Application.StartupPath, dbName + ".mdf"), 
                       Path.Combine(Application.StartupPath, dbName + ".ldf") };

    // db creation query:
    // note that the data file and log file have different logical names
    string query = "CREATE DATABASE " + dbName +
        " ON PRIMARY" +
        " (NAME = " + dbName + "_data," +
        " FILENAME = '" + files[0] + "'," +
        " SIZE = 3MB," +
        " MAXSIZE = 10MB," +
        " FILEGROWTH = 10%)" +

        " LOG ON" +
        " (NAME = " + dbName + "_log," +
        " FILENAME = '" + files[1] + "'," +
        " SIZE = 1MB," +
        " MAXSIZE = 5MB," +
        " FILEGROWTH = 10%)" +
        ";";

    return query;
}

即使执行失败,也可以再试一次。数据库文件可能已经被创建。

0

您需要连接信息:服务器,可能是实例,一个在该服务器/实例上具有创建数据库权限的用户以及相应的密码。然后,您可以使用SMO来创建数据库。这里是一个小的PowerShell示例,您可以非常容易地“翻译”为C#,例如:

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

$s = New-Object Microsoft.SqlServer.Management.Smo.Server($ServerInstance)

# Instantiate the database object and add the filegroups
$db = New-Object Microsoft.SqlServer.Management.Smo.Database($s, $DatabaseName)
$primaryFG = New-Object Microsoft.SqlServer.Management.Smo.FileGroup($db, 'PRIMARY')
$db.FileGroups.Add($primaryFG)

# Create Data file
$syslogname = $DatabaseName + '_SysData'
$dbdsysfile = New-Object Microsoft.SqlServer.Management.Smo.DataFile($primaryFG, $syslogname)
$primaryFG.Files.Add($dbdsysfile)
$dbdsysfile.FileName = $s.MasterDBPath + '\' + $syslogname + '.mdf'
$dbdsysfile.Size = [double](5.0 * 1024.0)
$dbdsysfile.GrowthType = 'KB'
$dbdsysfile.Growth = 10000.0
$dbdsysfile.IsPrimaryFile = 'True'

# Create Log file
$loglogname = $DatabaseName + '_Log'
$dblfile = New-Object Microsoft.SqlServer.Management.Smo.LogFile($db, $loglogname)
$db.LogFiles.Add($dblfile)
$dblfile.FileName = $s.MasterDBLogPath + '\' + $loglogname + '.ldf'
$dblfile.Size = [double](10.0 * 1024.0)
$dblfile.GrowthType = 'KB'
$dblfile.Growth = 10000.0

# Create database with READ_COMMITTED_SNAPSHOT isolation level.
# Other options can be set on $db object before calling Create.
$db.IsReadCommittedSnapshotOn = $true

$db.RecoveryModel = [Microsoft.SqlServer.Management.Smo.RecoveryModel]::Simple
$db.Create()

0

你需要打开到服务器的连接,即你需要一个服务器和实例名称。

你还需要适当的访问权限来创建数据库,所以根据服务器上的身份验证设置,你可能需要一些用户名和密码。

从服务器名称和身份验证信息中,你可以构造一个连接字符串并打开连接。

然后你可以使用CREATE DATABASE SQL命令(参见MSDN这里)。该命令的唯一必需参数是一个数据库名称


0
假设您有权发出CREATE DATABASE语句,您可以像执行其他查询一样执行此操作。
我必须强调的是,这需要在服务器上具有相当高的权限,并且仅限于QA和生产环境中的DBA。
因此,我建议确保您的连接使用Windows集成安全性。这样,当适当的DBA运行您的应用程序时,应用程序将按要求正常工作。
创建数据库后,您还需要执行T-SQL来创建登录和用户。我认为创建表/视图语句是显而易见的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接