没有为 OleDBDataAdapter 的一个或多个必需参数提供值
Posted
技术标签:
【中文标题】没有为 OleDBDataAdapter 的一个或多个必需参数提供值【英文标题】:No value given for one or more required parameters with OleDBDataAdapter 【发布时间】:2013-04-19 17:37:22 【问题描述】:大家好,我意识到这个问题之前已经被问过,但即使我按照答案进行操作,我似乎仍然无法让我的代码正常工作。错误发生在“data_adapter.Fill(temp_table)” 任何有关正在发生的事情的帮助将不胜感激。
string ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = H:\\School Work\\Computing A Level\\Stock checker\\Program\\Morgan's Motors Database.mdb";
string Query = "SELECT * FROM [Car Info] WHERE @x ";
string FirstQuery = null;
int i = 0;
for (i = 0; i < ColumnName.Count - 1; i++)
FirstQuery += string.Format("0 = 1 AND ", ColumnName[i], EnteredFields[i]);
FirstQuery += string.Format("0 = 1", ColumnName[i], EnteredFields[i]);
MessageBox.Show(Query);
OleDbConnection database_connection = new OleDbConnection(ConnStr);
OleDbCommand database_command = new OleDbCommand(Query, database_connection);
database_command.Parameters.AddWithValue("@x", FirstQuery);
OleDbDataAdapter database_adapter = new OleDbDataAdapter();
database_adapter.SelectCommand = new OleDbCommand(database_command.CommandText, database_connection);
DataTable temp_table = new DataTable();
database_adapter.Fill(temp_table);
BindingSource data_source = new BindingSource();
data_source.DataSource = temp_table;
dataGridView1.DataSource = data_source;
编辑:我在重构代码方面取得了一些进展,现在的问题是“?”没有被替换
string ConnStr = "Provider = Microsoft.ACE.OLEDB.12.0;数据源 = H:\School Work\Computing A Level\Stock checker\Program\Morgan's Motors Database.mdb;";
OleDbConnection conn_database = new OleDbConnection();
conn_database.ConnectionString = ConnStr;
OleDbCommand comm_database = new OleDbCommand();
comm_database.CommandText = "SELECT * FROM [Car Info] WHERE ? = ?";
comm_database.Connection = conn_database;
OleDbDataAdapter adap_database = new OleDbDataAdapter(comm_database);
DataTable data_database = new DataTable();
for (int i = 0; i < ColumnName.Count; i++)
comm_database.Parameters.AddWithValue("?", ColumnName[i].ToString());
comm_database.Parameters.AddWithValue("?", EnteredFields[i].ToString());
MessageBox.Show(adap_database.SelectCommand.CommandText);
adap_database.Fill(data_database);
BindingSource bind_database = new BindingSource();
bind_database.DataSource = data_database;
dataGridView1.DataSource = bind_database;
【问题讨论】:
您不应该使用字符串操作来创建查询 - 它会使您受到 SQL 注入攻击。请改用参数。 【参考方案1】:你试过了吗:
database_command.Parameters.AddWithValue("@x", EnteredFields[i]);
而不是:
database_command.Parameters.AddWithValue("@x", FirstQuery);
通常在使用参数时,您只需添加参数名称及其值,而不必将 columnName = 添加到值中。有意义吗?
如果想利用参数,您可以尝试以下代码。我不知道它是否能解决您的问题,但至少它有助于保护您免受 SQL 注入攻击。请让我知道,如果你有任何问题。
string Query = "SELECT * FROM [Car Info] WHERE 0 ";
for (i = 0; i < ColumnName.Count - 1; i++)
FirstQuery += string.Format("0 = @1 AND ", ColumnName[i], ColumnName[i]);
FirstQuery += string.Format("0 = @1", ColumnName[i], ColumnName[i]);
Query = String.Format(Query, FirstQuery);
for (i = 0; i < ColumnName.Count - 1; i++)
database_command.Parameters.AddWithValue("@" + ColumnName[i], EnteredFields[i]);
【讨论】:
我明白你的意思,我想我需要在我的第一篇文章中更清楚一点。输入的查询取决于用户输入的参数数量,例如,用户在一个查询中可能只查找 CarID,但在另一个查询中他们会查找 CarID、制造商和型号,这意味着我需要同一变量中的查询选项,除非我做一个 for 循环,一次添加一个,我不确定它是否会起作用。但是感谢您的帮助! 我的下一个猜测是 EnteredFields 值之一是空白。所以你的 FirstQuery 字符串可能看起来像:CarId = AND MakeId = 1234。 好的,我现在在某个地方贴一个 MessageBox 来测试一下这个想法 不,输入信息时它们都在那里。这可能与输入查询的数据类型有关吗? CarID 是一个整数,而制造商和型号等其他项目是文本。我以前也想过这个,但我不知道如何纠正它 相信Access在出现数据类型转换错误时会抛出上述错误。对于 SQL 类型语句中的整数和布尔值,不需要用引号括起来。例如:CarId =1234 有效。字符串类型字段和 guid 可以。例如:Make = '价值'。通常你可以依靠参数集合来为你设置格式,但是你的 where 子句的方式我猜这不会发生。以上是关于没有为 OleDBDataAdapter 的一个或多个必需参数提供值的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何指示器可以知道OleDbDataAdapter是否根据提供的查询获得了记录?
使用 Jet 的 OleDbDataAdapter 数据类型不匹配