簡體   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