繁体   English   中英

使用 C# 动态创建数据库

[英]Create Database Dynamically Using C#

我正在尝试使用以下代码创建数据库:

var createDatabaseQuery = "exec ('CREATE DATABASE ' + @db)";

var sqlCommand = new SqlCommand(createDatabaseQuery, sqlConnection);
sqlCommand.Parameters.Add("@db", SqlDbType.Text);
sqlCommand.Parameters["@db"].Value = "DbName";

sqlCommand.ExecuteNonQuery();

以上工作完美,但我尝试按如下方式进行连接,它会引发异常:

var sqlCommand = new SqlCommand(createDatabaseQuery, sqlConnection);
sqlCommand.Parameters.Add("@db", SqlDbType.Text);
sqlCommand.Parameters["@db"].Value = "DbName" + CustomId; //Doing the concatenation here

例外:

System.Data.SqlClient.SqlException (0x80131904):'-' 附近的语法不正确

我知道,可能有更好的方法来做到这一点。 但是有什么办法可以使上述工作?

是时候了解 SQL 真正复杂的一面了。

你想写它的方式——在很多方面都是不正确的。 调试 SQL。 不关心C#代码,看SQL...

在您的情况下 - 命名转换。

表格、数据库等不能包含“-” - 或者它们必须被标记。

CREATE DATABASE my-database -> 错误 CREATE DATABASE [my-database] -> 正确,[] 括号名称,因此...没有尝试处理“-”。

这在 SQL 文档中非常清楚,但是很多人忽略了一部分(主要是因为在大多数情况下它无关紧要)。 他们可能想知道为什么生成器将每个项目名称都括起来(数据库、模式、表、列)。 嗯,这就是原因。 你认为“-1”是什么意思? 减一、处理或名称的一部分 - 服务器无法确定这一点。 帮助他。

您需要确保使用QUOTENAME正确引用名称,因为它包含需要 escaping 的字符。

var createDatabaseQuery = "exec ('CREATE DATABASE ' + QUOTENAME(@db))";

此外,参数类型应为nvarchar(128)

sqlCommand.Parameters.Add("@db", SqlDbType.NVarChar, 128).Value = "DbName" + CustomId;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM