没有为一个或多个必需参数-C#/Access提供值
这是我第一次尝试读取Access数据库并将每一行写入控制台。当我执行应用程序时,会在下面的语句中抛出一个异常,该异常表示“没有为一个或多个必需参数提供值”: OleDbDataReader=cmd.ExecuteReader() 我对c#编程还比较陌生,经过几个小时的研究,我不知道自己做错了什么。这是我的密码:没有为一个或多个必需参数-C#/Access提供值,c#,ms-access,C#,Ms Access,这是我第一次尝试读取Access数据库并将每一行写入控制台。当我执行应用程序时,会在下面的语句中抛出一个异常,该异常表示“没有为一个或多个必需参数提供值”: OleDbDataReader=cmd.ExecuteReader() 我对c#编程还比较陌生,经过几个小时的研究,我不知道自己做错了什么。这是我的密码: private void maintenanceToolStripMenuItem_Click(object sender, EventArgs e) { //U
private void maintenanceToolStripMenuItem_Click(object sender, EventArgs e)
{
//Use a variable to hold the SQL statement.
string inputString = "SELECT Full_Name, First_Name, Last_Name, Company FROM CONTACTS";
try
{
//Create an OleDbCommand object and pass in the SQL statement and OleDbConnection object
OleDbCommand cmd = new OleDbCommand(inputString, conn);
//Send the CommandText to the connection, and then build an OleDbDataReader.
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("\t{0}\t{1}", reader.GetString(1));
reader.NextResult();
}
}
reader.Close();
}
catch (Exception ex)
{
error_message = ex.Message;
MessageBox.Show(error_message);
}
作为对评论的回应,我发布了一段更大的代码,以消除任何假设,更好地全面了解我正在尝试做的事情:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
namespace AzFloodSquad
{
public partial class frm1DefaultScreen : Form
{
//Initialize the application
String conn_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\\Databases\\AzFloodSquad\\AzFloodSquad.accdb;Persist Security Info=False;";
OleDbConnection conn = null;
String error_message = "";
String q = "";
string varReportId = "";
public frm1DefaultScreen()
{
InitializeComponent();
}
//Load the default form
private void frm1DefaultScreen_Load(object sender, EventArgs e)
{
connectToolStripMenuItem.PerformClick();
contactsToolStripMenuItem.PerformClick();
}
//Exit the application
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
//Start the database
private void connectToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
conn = new OleDbConnection(conn_string);
conn.Open();
disconnectToolStripMenuItem.Enabled = true;
connectToolStripMenuItem.Enabled = false;
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
//Stop the database
private void disconnectToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
conn.Close();
disconnectToolStripMenuItem.Enabled = false;
connectToolStripMenuItem.Enabled = true;
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
}
//Clean up database whem form close button clicked
private void frm1DefaultScreen_FormClosing(object sender, FormClosingEventArgs e)
{
disconnectToolStripMenuItem.PerformClick();
}
private void contactsToolStripMenuItem_Click(object sender, EventArgs e)
{
varReportId = "Contacts";
q = "SELECT * " +
"FROM CONTACTS WHERE CONTACTS.CONTACT_TYPE = 'CUSTOMER' " +
"OR CONTACTS.CONTACT_TYPE = 'HOMEOWNER' OR CONTACTS.CONTACT_TYPE = 'HOME OWNER' " +
"OR CONTACTS.CONTACT_TYPE = 'TENANT'" +
"ORDER BY FULL_NAME";
this.Cursor = Cursors.WaitCursor;
run_Query_Parm(q);
this.Cursor = Cursors.Default;
}
//Pull data from the database using the parameter field
private void run_Query_Parm(String q)
{
error_message = "";
try
{
OleDbCommand cmd = new OleDbCommand(q, conn);
OleDbDataAdapter a = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
a.SelectCommand = cmd;
a.Fill(dt);
results.DataSource = dt;
results.AutoResizeColumns();
}
catch (Exception ex)
{
error_message = ex.Message;
MessageBox.Show(error_message);
}
}
//Clear all data from the screen
private void clearFormToolStripMenuItem_Click(object sender, EventArgs e)
{
varReportId = "";
if (this.results.DataSource != null)
{
this.results.DataSource = null;
}
else
{
this.results.Rows.Clear();
}
}
private void maintenanceToolStripMenuItem_Click(object sender, EventArgs e)
{
//Use a variable to hold the SQL statement.
string inputString = "SELECT Full_Name, First_Name, Last_Name, Company FROM CONTACTS";
try
{
//Create an OleDbCommand object and pass in the SQL statement and OleDbConnection object
OleDbCommand cmd = new OleDbCommand(inputString, conn);
//Send the CommandText to the connection, and then build an OleDbDataReader.
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("\t{0}\t{1}", reader.GetString(1));
reader.NextResult();
}
}
reader.Close();
}
catch (Exception ex)
{
error_message = ex.Message;
MessageBox.Show(error_message);
}
}
如能提供任何帮助,我们将不胜感激。提前谢谢。我发现了问题。显然,我的SELECT语句的语法不正确。当我用以下代码替换我的SELECT(如我发布的第一个代码示例所示)时,它工作得很好:
string inputString = "SELECT Contacts.[Account_Number], " +
"Contacts.[Full_Name], Contacts.[ID], Contacts.[Street], " +
"Contacts.[City], Contacts.[State], Contacts.[Zip] FROM Contacts";
不,这不可能是因为上面发布的代码。错误可能在你的代码中的其他地方我不知道如何。try/catch正在抛出异常。我为上面提到的语句设置了一个断点,然后使用调试器对代码进行单步调试,每次都会在该行抛出异常。可能只是字段或表名中的键入错误,这通常会导致此特定错误。如果没有您的表定义,我们无法判断。有太多可能(也将)出错,还有太多假设。请发一封邮件。我已经更新了密码。我已经运行了几个测试,错误仍在发生。有人能提供一个如何解决这个问题的建议吗?如果可行,那就太好了!然而,总是有更多的东西需要学习,严格地说,原始语句的语法没有问题。这不是不恰当的语法。也许它有拼写错误,或者它包含了实际上不在表中的列名。更具体地说,有时可能需要使用表名限定列,例如
Contacts.[Full_name]
,但如果列的源中没有矛盾,则不一定需要。同样地,用[]
分隔姓名总是有效的,但并非绝对必要。我想真正的问题是名字、姓氏、公司
中的一个实际上不是联系人表中的一列。这就是Access将其中一个视为参数的原因。。。需要值的未知引用。