Freigeben über


"No value given for one or more required parameters." / "Incorrect syntax near the keyword 'DEFAULT'."

A follow up on the post from yesterday.

If you forget to add a parameter to a parameterized query, you will end up with the

System.Data.OleDb.OleDbException: No value given for one or more required parameters.

   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)

   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForMultpleResults(tagDBPARAMS dbParams, Object& executeResult)

   ...

Example:

            using (OleDbConnection con = new OleDbConnection(cs))

            {

                con.Open();

                OleDbCommand cmd = con.CreateCommand();

                // "No value given for one or more required parameters"

                cmd.CommandText = "SELECT * FROM Categories WHERE CategoryID = ?;";

                OleDbDataReader rdr = cmd.ExecuteReader();

                while (rdr.Read())

                {

                    Console.WriteLine("{0} {1}", rdr[0].ToString(), rdr[1].ToString());

                }

                con.Close();

         }

And if you add a parameter to the parameterized query, but forget to assign it a value, it will use the DEFAULT and you will end up with:

System.Data.OleDb.OleDbException: Incorrect syntax near the keyword 'DEFAULT'.

   at System.Data.OleDb.OleDbDataReader.ProcessResults(OleDbHResult hr)

   at System.Data.OleDb.OleDbDataReader.NextResult()

   ...

Example:

            using (OleDbConnection con = new OleDbConnection(cs))

            {

                con.Open();

                OleDbCommand cmd = con.CreateCommand();

                // 'DEFAULT' is used

                cmd.CommandText = "SELECT * FROM Categories WHERE CategoryID = ?;";

                cmd.Parameters.Add("@id", OleDbType.Integer);

                OleDbDataReader rdr = cmd.ExecuteReader();

                while (rdr.Read())

                {

                    Console.WriteLine("{0} {1}", rdr[0].ToString(), rdr[1].ToString());

                }

                con.Close();

            }

This is usually very easy to spot. But if you have many parameters in your query, it may be easy to miss that you have forgot to set a value for

one of the parameters or that it is simply not added to the command.

Comments

  • Anonymous
    May 14, 2012
    what about an update statement that allows my end user to update everything in my access database? What's wrong with this update statement? UPDATE [QMTrainingRecords6] SET [EmailAddress] = ?, [LastName] = ?, [FirstName] = ?, [PeerReviewer] = ?, [MasterReviewer] = ?, [Trainer] = ?, [InstructorCoursesReviewed] = ?, [CourseReviewerHistory] = ?, [QualityMattersTrainingActivity] = ?, [Division] = ? WHERE [Faculty Id] = ? AND (([EmailAddress] = ?) OR ([EmailAddress] IS NULL AND ? IS NULL)) AND (([LastName] = ?) OR ([LastName] IS NULL AND ? IS NULL)) AND (([FirstName] = ?) OR ([FirstName] IS NULL AND ? IS NULL)) AND (([PeerReviewer] = ?) OR ([PeerReviewer] IS NULL AND ? IS NULL)) AND (([MasterReviewer] = ?) OR ([MasterReviewer] IS NULL AND ? IS NULL)) AND (([Trainer] = ?) OR ([Trainer] IS NULL AND ? IS NULL)) AND (([InstructorCoursesReviewed] = ?) OR ([InstructorCoursesReviewed] IS NULL AND ? IS NULL)) AND (([CourseReviewerHistory] = ?) OR ([CourseReviewerHistory] IS NULL AND ? IS NULL)) AND (([QualityMattersTrainingActivity] = ?) OR ([QualityMattersTrainingActivity] IS NULL AND ? IS NULL)) AND (([Division] = ?) OR ([Division] IS NULL AND ? IS NULL))