【问题标题】:Create Database Dynamically Using C#使用 C# 动态创建数据库
【发布时间】:2022-01-10 15:08:25
【问题描述】:

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

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): '-' 附近的语法不正确

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

【问题讨论】:

  • 为什么你的查询中有-,是来自CustomId吗?如果您将查询更改为exec ('CREATE DATABASE @db') 或只是CREATE DATABASE @db,会发生什么?
  • @Luke Vo 发生了同样的事情。
  • CustomId 包含什么?奇怪的是,错误标识了“-”字符,但我在查询中的任何地方都看不到该字符。您确定错误来自发布的查询吗?
  • 我正在为 CustomId @JohnG 使用 guid。得到它并工作。

标签: c# .net-core


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    另外,参数类型应该是nvarchar(128)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多