没有为一个或多个必需参数-C#/Access提供值

没有为一个或多个必需参数-C#/Access提供值,c#,ms-access,C#,Ms Access,这是我第一次尝试读取Access数据库并将每一行写入控制台。当我执行应用程序时,会在下面的语句中抛出一个异常,该异常表示“没有为一个或多个必需参数提供值”: OleDbDataReader=cmd.ExecuteReader() 我对c#编程还比较陌生,经过几个小时的研究,我不知道自己做错了什么。这是我的密码: private void maintenanceToolStripMenuItem_Click(object sender, EventArgs e) { //U

这是我第一次尝试读取Access数据库并将每一行写入控制台。当我执行应用程序时,会在下面的语句中抛出一个异常,该异常表示“没有为一个或多个必需参数提供值”:

OleDbDataReader=cmd.ExecuteReader()

我对c#编程还比较陌生,经过几个小时的研究,我不知道自己做错了什么。这是我的密码:

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将其中一个视为参数的原因。。。需要值的未知引用。