我试图创建一个名为动态检索值的表
这是代码
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();
但我使用该动态值获取错误无效的列名称
答案 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);