无法在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();
但是我得到了一个错误-具有动态值的无效列名
您没有将字符串用引号括起来。
当引用表作为标识符时,不需要引号。因为它是一个对象名称:
... 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);