无法在c#中动态创建SQL表 - "无效的列名"

时间:2014-10-01 15:38:12

标签: c# sql

我试图创建一个名为动态检索值的表

这是代码

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

但我使用该动态值获取错误无效的列名称

5 个答案:

答案 0 :(得分:3)

您没有将字符串换成引号。

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

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

变为:

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

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

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

变为:

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

答案 1 :(得分:2)

表格的名称应介于'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 ...

答案 2 :(得分:2)

问题在于:

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 parameters

答案 3 :(得分:1)

该值需要单引号:

... (select name from sysobjects where name = 'C"+nok+"') ...

答案 4 :(得分:1)

您不应该只在您的SQL语句中添加'nok'。您需要使用参数。尝试这样的事情。我只是拿了一小口气:

commandStr = "if not exists (select name from sysobjects where name = 'c@nok')";

然后,当您拥有命令文本时,请替换参数:

command.Parameters.AddWithValue("@nok", nok);