[英]Unable to create SQL Table dynamically in c# — “invalid column name”
即時通訊試圖創建一個具有動態檢索值的名稱的表
這是代碼
string nok="";
while (reader.Read())
{
noo = reader.GetInt32(3);
nok = noo.ToString();
MessageBox.Show(noo.ToString());
}
con.Close();
var commandStr = "If not exists (select name from sysobjects where name = C"+nok+") CREATE TABLE C"+nok+"(A char(50),B char(50),C char(50),D char(50),E char(50),F char(50),G char(50),H char(50),I char(50),J char(50),K char(50),L char(50),M char(50),N char(50),O char(50))";
MessageBox.Show(commandStr);
con.Open();
using (SqlCommand command = new SqlCommand(commandStr, con))
command.ExecuteNonQuery();
但是我收到一個錯誤的無效列名稱與該動態值
您沒有將字符串用引號引起來。
將表作為標識符引用時,不需要引號。 因為它是一個對象名稱:
... CREATE TABLE C"+nok+"(A char(50), ...
變成:
... CREATE TABLE C1(A char(50), ...
但是,當在WHERE
子句中將表名引用為值時,它不是對象標識符。 這是列值。 name
列包含字符串值,因此需要與字符串進行比較:
... where name = 'C"+nok+"') CREATE ...
變成:
... where name = 'C1') CREATE ...
表的名稱應在“名稱”之間
var commandStr = "If not exists (select name from sysobjects where name = 'C"+nok+"') CREATE TABLE C"+nok+"(A char(50),B char(50),C char(50),D char(50),E char(50),F char(50),G char(50),H char(50),I char(50),J char(50),K char(50),L char(50),M char(50),N char(50),O char(50))";
檢查表/對象是否存在的更簡便方法
IF OBJECT_ID('C" + nok + "') IS NULL CREATE TABLE ...
問題在這里:
select name from sysobjects where name = C"+nok+"
當您在oracle中運行此語句時,執行的語句將是:
select name from sysobjects where name = CWHATEVER
由於CWHATEVER不在引號中,因此它將被視為列名而不是字符串值。 為此,它必須用單引號引起來:
select name from sysobjects where name = 'C"+nok+"'
但是,這使您可以進行SQL注入。 我強烈建議您改用sql參數 。
該值需要用單引號引起來:
... (select name from sysobjects where name = 'C"+nok+"') ...
您不應該只是在SQL語句中添加“ nok”。 您需要使用一個參數。 嘗試這樣的事情。 我只是拍了個小片段:
commandStr = "if not exists (select name from sysobjects where name = 'c@nok')";
然后,當您擁有命令文本時,替換參數:
command.Parameters.AddWithValue("@nok", nok);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.