簡體   English   中英

無法在C#中動態創建SQL表-“無效的列名”

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM