![](/img/trans.png)
[英]OleDb Exception in c# “No value given for one or more required parameters.” while trying to Select Data from Access database
[英]C# OleDb Exception "No value given for one or more required parameters" while trying to delete from Access database
我有一张带有“SEMESTER、SUBJECT、OFFER、RESULT”的表格,其中“SEMESTER”和“SUBJECT”是主键。 当我使用查询时
它在访问数据库中完美运行,但是当我尝试在我的 C# 代码中使用它时,我总是遇到异常。
此外,如果我使用“DELETE FROM Course_Information WHERE Semester = 1 ;
我想在 WHERE 条件下同时使用“SUBJECT”和“SEMESTER”(因为同一学期可能有不同的主题)
看我的代码,
connection_string = aConnection.return_connectionString(connection_string);
string sql_query = "DELETE FROM Course_Information WHERE Semester = " + this.textBox1.Text + " AND Subject = " + this.textBox2.Text + " ;";
OleDbConnection connect = new OleDbConnection(connection_string);
OleDbCommand command = new OleDbCommand(sql_query, connect);
try
{
connect.Open();
OleDbDataReader reader = command.ExecuteReader();
MessageBox.Show("Delete Successful!");
connect.Close();
UpdateDatabase();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
在工作示例查询中包含从this.textBox2.Text
获取的值周围的引号。
" AND Subject = '" + this.textBox2.Text + "';";
想象一下this.textBox2.Text
包含文本foo 。 如果不在WHERE
子句中添加引号,db引擎会看到... WHERE Semester = 1 AND Subject = foo
但它在名为foo
的数据源中找不到任何内容,因此假设它必须是参数。 您需要引号来表示数据库引擎它是一个字符串文字值'foo' 。
实际上,如果切换到参数查询,则可以避免此类问题,因为您不需要在DELETE
语句中使用这些引号。 参数查询还可以保护您免受SQL注入。 如果恶意用户可以在this.textBox2.Text
输入'OR'和'='a a ,则表中的所有行都将被删除。
如果“插入”查询出现相同的错误,则可以使用此方法来避免异常
string sqlQuery = "INSERT into EndResultOfTestCases(IDsOfCases,TestCaseName,ResultCase,ResultLog) VALUES(@ids, @casename, @results, @logs)";
connection = new OleDbConnection(connectionStringToDB);
command = new OleDbCommand(sqlQuery, connection);
command.Parameters.AddWithValue("@ids",IDs);
command.Parameters.AddWithValue("@casename", CaseName);
command.Parameters.AddWithValue("@results", resultOfCase);
command.Parameters.AddWithValue("@logs", logs);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
您是否更改了任何字段名称? 当我使用 Access 更改数据库中的字段名称时出现此错误。 旧名称是“DisbursementType”。 新名称是“ExpenseType”。 我使用带有新字段名称的查询来填充工作正常的数据集。
string sqlQuery = "select * from Finance WHERE ExpenseType = 'MISC'";
System.Data.OleDb.OleDbCommand obiwan = new System.Data.OleDb.OleDbCommand();
obiwan.CommandText = sqlQuery;
this.financeTableAdapter.Adapter.SelectCommand.CommandText = sqlQuery;
this.financeTableAdapter.Fill(homeFinanceDataSet.Finance);
使用相同的查询字符串打开记录集失败。
string sqlQuery = "select * from Finance WHERE ExpenseType = 'MISC'";
string dbaseaddress = "";
ADODB.Recordset RS = new ADODB.Recordset();
if (openFileDialog1.ShowDialog()== DialogResult.OK)
{
dbaseaddress = openFileDialog1.FileName;
ADODB.Connection fc = new ADODB.Connection();
string str = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + dbaseaddress + ";" +
"Jet OLEDB:Database Password=" + "password" + ";";
fc.Open(str);
RS.Open(sqlQuery, fc, ADODB.CursorTypeEnum.adOpenStatic, &_
ADODB.LockTypeEnum.adLockOptimistic,0);
最后一行抛出异常:“System.Runtime.InteropServices.COMException:'没有为一个或多个必需参数提供值。'”
当使用该字段的原始名称时,不会引发异常。
string sqlQuery = "select * from Finance WHERE DisbursementType = 'MISC'";
string dbaseaddress = "";
ADODB.Recordset RS = new ADODB.Recordset();
if (openFileDialog1.ShowDialog()== DialogResult.OK)
{
dbaseaddress = openFileDialog1.FileName;
ADODB.Connection fc = new ADODB.Connection();
string str = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + dbaseaddress + ";" +
"Jet OLEDB:Database Password=" + "password" + ";";
fc.Open(str);
RS.Open(sqlQuery, fc, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic,0);
MessageBox.Show(string.Format("{0}",RS.RecordCount));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.