通过参数传递数据类型来更改表会导致语法错误
本文关键字:语法 错误 参数传递 数据类型 | 更新日期: 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 ";
在谷歌上搜索,至少是列表的最后一个,不必出错,或者这是我相信的,但仍然会出错。知道吗?
- 验证参数,或
- 请确保您的参数是可信的
带验证的示例代码:
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或调用存储过程)