通过参数传递数据类型来更改表会导致语法错误

本文关键字:语法 错误 参数传递 数据类型 | 更新日期: 2023-09-27 18:25:31

我正在使用Visual Studio创建一个程序。在这个程序中,我必须查找所有创建的表,看看列表中是否存在一列,如果不创建的话。为此,我创建了以下变量:

Dictionary<string, List<Dictionary<string, string>>> TABLE_DICT //the string saves the name of the table, the list the columns and types
List<Dictionary<string, string>> TABLE_LIST = new List<Dictionary<string, string>>(); //list of columns in a table with its type
Dictionary<string, string> DICT = new Dictionary<string, string>(); // name of column and the type of this column

代码如下:

try
            {
                conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBstring);
                conn.Open();
                foreach (KeyValuePair<string, List<Dictionary<string, string>>> TABLE_kvp in TABLE_DICT)
                {
                    foreach (Dictionary<string, string> dic in TABLE_kvp.Value)
                    {
                        foreach (KeyValuePair<string, string> kvp in dic)
                        {
                            DataTable dt = conn.GetSchema("Columns", new string[] { null, null, TABLE_kvp.Key, kvp.Key });
                            if (dt.Rows.Count == 0)
                            {
                                OleDbCommand command = new OleDbCommand();
                                command.Connection = conn;
                                command.CommandText = "ALTER TABLE ? ADD COLUMN ? ? ";
                                command.Parameters.AddWithValue("@tablename", TABLE_kvp.Key);
                                command.Parameters.AddWithValue("@col", kvp.Key);
                                command.Parameters.AddWithValue("@val", kvp.Value);
                                command.ExecuteNonQuery();
                                command.Connection.Close();
                            }
                        }
                    }
                }
            }
            catch (OleDbException ex)
            {
                ErrorForm ef = new ErrorForm(ex.Message, this.BackColor);
                ef.ShowDialog(this);
            }

问题是,即使我更改以下stll的命令文本时出现语法错误,代码也会捕获语法错误的异常:

command.CommandText = "ALTER TABLE ? ADD COLUMN [?] ? NULL";
command.CommandText = "ALTER TABLE ? ADD COLUMN [?] ?";
command.CommandText = "ALTER TABLE [?] ADD COLUMN ? ? ";
command.CommandText = "ALTER TABLE ? ADD COLUMN ? MEMO ";

在谷歌上搜索,至少是列表的最后一个,不必出错,或者这是我相信的,但仍然会出错。知道吗?

通过参数传递数据类型来更改表会导致语法错误

DDL语句不能参数化。您需要在代码中连接它。因为你需要这样做,你必须要么
  • 验证参数,
  • 请确保您的参数是可信的

带验证的示例代码:

var validator = new Regex(@"^'w+$");
if (new[] { TABLE_kvp.Key, kvp.Key, kvp.Value }.All(validator.IsMatch))
{
    command.CommandText = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2}", 
        TABLE_kvp.Key,
        kvp.Key,
        kvp.Value);   
}
绑定变量/参数仅用于值,不用于表名。作为应用程序逻辑的一部分,您必须更改表名。

除此之外,您不能使用参数运行DDL命令。它只适用于DML(INSERT、UPDATE、DELETE或调用存储过程)