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

时间:2018-11-22 14:36:12

标签: c# ms-access

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

OleDbDataReader reader = 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);
        }
    }

任何提供的帮助将不胜感激。预先感谢。

1 个答案:

答案 0 :(得分:0)

我发现了问题。显然,我的SELECT语句语法不正确。当我用以下内容替换SELECT(如我发布的第一个代码示例所示)时,它运行良好:

string inputString = "SELECT Contacts.[Account_Number], " +
            "Contacts.[Full_Name], Contacts.[ID], Contacts.[Street], " +
            "Contacts.[City], Contacts.[State], Contacts.[Zip] FROM Contacts";