无法在c#--“”中动态创建SQL表;无效列名”;

本文关键字:SQL 无效 创建 动态 c#-- | 更新日期: 2023-09-27 18:25:24

im试图创建一个具有动态检索值名称的表

这是代码

 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();

但是我得到了一个错误-具有动态值的无效列名

无法在c#--“”中动态创建SQL表;无效列名”;

您没有将字符串用引号括起来。

当引用作为标识符时,不需要引号。因为它是一个对象名称:

... CREATE TABLE C"+nok+"(A char(50), ...

变为:

... CREATE TABLE C1(A char(50), ...

但是,当在WHERE子句中将表的名称引用为时,它不是对象标识符。这是一个列值。name列包含字符串值,因此需要将其与字符串进行比较:

... where name = 'C"+nok+"') CREATE ...

变为:

... where name = 'C1') CREATE ...

表的名称必须介于'name'之间

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);