OleDb Adapter.Fill() "No value given for one or more parameters"
OleDb Adapter.Fill() "No value given for one or more parameters"
我正在尝试使用 adapter.fill()
方法从 Access 数据库中提取数据并将其显示在 DataViewGrid 中,但一直收到错误消息“没有为一个或多个参数指定值”。这仅在我尝试通过串联包含变量 userID、userPIN、accountNo 时发生。这三个变量取自先前表单的文本框数据。当我将查询字符串简化为 "SELECT * FROM STATEMENT"
时,我只收到一个空白的 dataViewGrid,这也很奇怪。我已经搜索了几天的解决方案,但无济于事。非常感谢任何帮助。
string query = "select * from statement where userID = '" + userID + "' and userPIN ='" + userPIN + "' and account_no = " + account_no; //cmd in string form for use with OleDbAdapter
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\ATM Project Folder\Bank1.accdb";
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(query, conn);
// dataset object
DataSet ds = new DataSet();
adapter.Fill(ds);
// Bind dataset
dataGridView1.DataSource = ds.DefaultViewManager;
让我们正确地做到这一点:
string query = "select * from statement where userID = @u and userPIN = @p and account_no = @a"
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\ATM Project Folder\Bank1.accdb";
var adapter = new OleDbDataAdapter(query, connString);
//call these in the same order that the placeholders appear in the sql. Ole does not use the names
//when you upgrade to sql server, cease using AddWithValue: https://www.dbdelta.com/addwithvalue-is-evil/
adapter.SelectCommand.Parameters.AddWithValue("@u", userID);
adapter.SelectCommand.Parameters.AddWithValue("@p", userPIN);
adapter.SelectCommand.Parameters.AddWithValue("@a", account_no);
var dt = new DataTable();
adapter.Fill(dt);
dataGridView1.DataSource = dt;
永远,永远不要像您在问题中那样写 SQL;充其量,如果有人键入会产生语法错误的内容(例如撇号),它就会失败。在最坏的情况下,它会导致类似 the vetch hack 的情况,其中超过 600 万儿童的数据被暴露,仅仅因为黑客可以将 sql 的片段输入网站并侵入数据库
这真的很重要;将 user-supplied 数据连接到您的 SQL 是当今让黑客轻松访问系统的首要方法之一。不要这样做;总是可以更安全地操作
使用数据适配器获取数据的最简单方法是使用采用命令字符串和连接字符串的构造函数,添加命令中包含的任何参数,然后调用 fill。 DataAdapter 将为您管理连接。有些人会丢弃适配器; MSDN官方的例子没有所以我省略了那个
Access OLE 理解@namedParameters,但它仍然按位置对待它们;您必须按照它们在语句中出现的相同顺序将参数添加到您的命令对象。您的另一个选择是使用 ?作为占位符。即使不使用这些名称,它也可以更轻松地调试问题。更复杂的数据库确实使用名称,这意味着参数可以按任何顺序提供,并且可以在 SQL 中重复,但在参数中提供一次。如果升级到 SQLServer,请停止使用 AddWithValue,因为它会导致性能问题,但其他数据库可能不会在意;具体情况具体分析
我正在尝试使用 adapter.fill()
方法从 Access 数据库中提取数据并将其显示在 DataViewGrid 中,但一直收到错误消息“没有为一个或多个参数指定值”。这仅在我尝试通过串联包含变量 userID、userPIN、accountNo 时发生。这三个变量取自先前表单的文本框数据。当我将查询字符串简化为 "SELECT * FROM STATEMENT"
时,我只收到一个空白的 dataViewGrid,这也很奇怪。我已经搜索了几天的解决方案,但无济于事。非常感谢任何帮助。
string query = "select * from statement where userID = '" + userID + "' and userPIN ='" + userPIN + "' and account_no = " + account_no; //cmd in string form for use with OleDbAdapter
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\ATM Project Folder\Bank1.accdb";
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(query, conn);
// dataset object
DataSet ds = new DataSet();
adapter.Fill(ds);
// Bind dataset
dataGridView1.DataSource = ds.DefaultViewManager;
让我们正确地做到这一点:
string query = "select * from statement where userID = @u and userPIN = @p and account_no = @a"
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\ATM Project Folder\Bank1.accdb";
var adapter = new OleDbDataAdapter(query, connString);
//call these in the same order that the placeholders appear in the sql. Ole does not use the names
//when you upgrade to sql server, cease using AddWithValue: https://www.dbdelta.com/addwithvalue-is-evil/
adapter.SelectCommand.Parameters.AddWithValue("@u", userID);
adapter.SelectCommand.Parameters.AddWithValue("@p", userPIN);
adapter.SelectCommand.Parameters.AddWithValue("@a", account_no);
var dt = new DataTable();
adapter.Fill(dt);
dataGridView1.DataSource = dt;
永远,永远不要像您在问题中那样写 SQL;充其量,如果有人键入会产生语法错误的内容(例如撇号),它就会失败。在最坏的情况下,它会导致类似 the vetch hack 的情况,其中超过 600 万儿童的数据被暴露,仅仅因为黑客可以将 sql 的片段输入网站并侵入数据库
这真的很重要;将 user-supplied 数据连接到您的 SQL 是当今让黑客轻松访问系统的首要方法之一。不要这样做;总是可以更安全地操作
使用数据适配器获取数据的最简单方法是使用采用命令字符串和连接字符串的构造函数,添加命令中包含的任何参数,然后调用 fill。 DataAdapter 将为您管理连接。有些人会丢弃适配器; MSDN官方的例子没有所以我省略了那个
Access OLE 理解@namedParameters,但它仍然按位置对待它们;您必须按照它们在语句中出现的相同顺序将参数添加到您的命令对象。您的另一个选择是使用 ?作为占位符。即使不使用这些名称,它也可以更轻松地调试问题。更复杂的数据库确实使用名称,这意味着参数可以按任何顺序提供,并且可以在 SQL 中重复,但在参数中提供一次。如果升级到 SQLServer,请停止使用 AddWithValue,因为它会导致性能问题,但其他数据库可能不会在意;具体情况具体分析