[英]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.