C# 为一个或多个必需参数/SQL指定的值不应正确

C# 为一个或多个必需参数/SQL指定的值不应正确,c#,sql,ms-access,C#,Sql,Ms Access,程序在给出错误的adapter.Fill(datatable)行停止:OLEDBEException未处理:一个或多个必需参数未给出值 command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin " + // space added "FROM Movies WHERE headactor = " + lastName ; 当我将SQL复制到access中时,不会给出任何错误

程序在给出错误的
adapter.Fill(datatable)
行停止:OLEDBEException未处理:一个或多个必需参数未给出值

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin " +  // space added
          "FROM Movies WHERE headactor =  " + lastName ;
当我将SQL复制到access中时,不会给出任何错误

SQL:

public static List<Movie> AllMoviesSameActor(string lastName)
{
   string command;
   command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin"
           + "FROM Movies" +
            " WHERE headactor =  " + lastName ;
   OleDbDataAdapter adapter = new OleDbDataAdapter(command, connectionString);
   DataTable datatable = new DataTable();
   adapter.Fill(datatable);

   List<Movie> list= new List<Movie>();
   for (int i = 0; i < datatable.Rows.Count; i++)
   {
      Movie movie = new Movie();
      movie.movieId = datatable.Rows[i].Field<int>("movieId");
      movie.name = datatable.Rows[i].Field<string>("name");
      movie.headActor = datatable.Rows[i].Field<string>("headActor");
      movie.director = datatable.Rows[i].Field<string>("director");
      movie.releaseDate = datatable.Rows[i].Field<DateTime>("releaseDate");
      movie.lenghtMin = datatable.Rows[i].Field<int>("lenghtMin");
      list.Add(movie);
   }   
   return list;
}
公共静态列表AllMoviesSameActor(字符串lastName)
{
字符串命令;
command=“选择电影ID、名称、主角、导演、发行日期、长度”
+“来自电影”+
“WHERE headactor=“+lastName;
OleDbDataAdapter=新的OleDbDataAdapter(命令、连接字符串);
DataTable=新的DataTable();
adapter.Fill(数据表);
列表=新列表();
for(int i=0;i
表格中的代码:

public FormMoviesSameActor()
{
   InitializeComponent();
   List<Actor> actors = Actor.AllActors();
   comboBoxActeur.DataSource = actors;
   comboBoxActeur.DisplayMember = "LastName";
   comboBoxActeur.ValueMember = "LastName";
}

private void buttonSearchMovies_Click(object sender, EventArgs e)
{
   Actor dedicatedActor = new Actor();
   dedicatedActor.LastName = Convert.ToString(comboBoxActeur.SelectedValue);
   listBox1.DataSource = dedicatedActor.Movies;
   listBox1.DisplayMember = "AllData";
}
public FormMoviesSameActor()
{
初始化组件();
List actors=Actor.AllActors();
comboBoxActeur.DataSource=参与者;
comboBoxActeur.DisplayMember=“LastName”;
comboBoxActeur.ValueMember=“LastName”;
}
私有无效按钮搜索电影\u单击(对象发送者,事件参数e)
{
参与者专用参与者=新参与者();
dedicatedActor.LastName=Convert.ToString(comboBoxActeur.SelectedValue);
listBox1.DataSource=dedicatedActor.Movies;
listBox1.DisplayMember=“AllData”;
}
下面介绍Actor.Movies方法

public List<Movie> Movies
{
   get { return Movie.AllMoviesSameActor(this.lastName); 
}
公开电影列表
{
获取{return Movie.AllMoviesSameActor(this.lastName);
}
更改:

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin"
          + "FROM Movies" + " WHERE headactor =  " + lastName ;
致:

列名与原始查询不匹配

Movie movie = new Movie();
movie.movieId = datatable.Rows[i].Field<int>("movieId");
movie.name = datatable.Rows[i].Field<string>("name");
movie.headActor = datatable.Rows[i].Field<string>("headActor");
movie.director = datatable.Rows[i].Field<string>("director");  // Doesn't match the query
movie.releaseDate = datatable.Rows[i].Field<DateTime>("releaseDate");  // Doesn't match the query
movie.lenghtMin = datatable.Rows[i].Field<int>("lenghtMin");
list.Add(movie);
Movie电影=新电影();
movie.movieId=datatable.Rows[i]。字段(“movieId”);
movie.name=datatable.Rows[i]。字段(“名称”);
movie.headActor=datatable.Rows[i]。字段(“headActor”);
movie.director=datatable.Rows[i]。字段(“director”);//与查询不匹配
movie.releaseDate=datatable.Rows[i]。字段(“releaseDate”);//与查询不匹配
movie.lenghtMin=datatable.Rows[i]。字段(“lenghtMin”);
列表。添加(电影);
更改:

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin"
          + "FROM Movies" + " WHERE headactor =  " + lastName ;
致:

列名与原始查询不匹配

Movie movie = new Movie();
movie.movieId = datatable.Rows[i].Field<int>("movieId");
movie.name = datatable.Rows[i].Field<string>("name");
movie.headActor = datatable.Rows[i].Field<string>("headActor");
movie.director = datatable.Rows[i].Field<string>("director");  // Doesn't match the query
movie.releaseDate = datatable.Rows[i].Field<DateTime>("releaseDate");  // Doesn't match the query
movie.lenghtMin = datatable.Rows[i].Field<int>("lenghtMin");
list.Add(movie);
Movie电影=新电影();
movie.movieId=datatable.Rows[i]。字段(“movieId”);
movie.name=datatable.Rows[i]。字段(“名称”);
movie.headActor=datatable.Rows[i]。字段(“headActor”);
movie.director=datatable.Rows[i]。字段(“director”);//与查询不匹配
movie.releaseDate=datatable.Rows[i]。字段(“releaseDate”);//与查询不匹配
movie.lenghtMin=datatable.Rows[i]。字段(“lenghtMin”);
列表。添加(电影);

当您收到此错误时,表示访问引擎无法正确找到一个或多个列名或整个表名

因此,第一步是确保列的名称是正确的。
尤其是
minLenght
似乎是错误的(minLength??)

字符串连接也包含错误。FROM子句前缺少空格,但这应该引发语法错误,而不是缺少参数

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin " +  // space added
          "FROM Movies WHERE headactor =  " + lastName ;
最后,
headactor
字段似乎是一个文本字段,如果这是真的,您需要在
lastName
变量周围使用单引号。但我建议改用参数化查询

 command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin " +
          "FROM Movies WHERE headactor =  ?";

 OleDbDataAdapter adapter = new OleDbDataAdapter(command, connectionString);
 adapter.SelectCommand.Parameters.AddWithValue("@p1", lastName);
 .....

收到此错误时,表示访问引擎无法正确找到一个或多个列名或整个表名

因此,第一步是确保列的名称是正确的。
尤其是
minLenght
似乎是错误的(minLength??)

字符串连接也包含错误。FROM子句前缺少空格,但这应该引发语法错误,而不是缺少参数

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin " +  // space added
          "FROM Movies WHERE headactor =  " + lastName ;
最后,
headactor
字段似乎是一个文本字段,如果这是真的,您需要在
lastName
变量周围使用单引号。但我建议改用参数化查询

 command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin " +
          "FROM Movies WHERE headactor =  ?";

 OleDbDataAdapter adapter = new OleDbDataAdapter(command, connectionString);
 adapter.SelectCommand.Parameters.AddWithValue("@p1", lastName);
 .....

您有几个问题。请使用以下方法:

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin"
        + " FROM Movies" +
        " WHERE headActor =  '" + lastName + "'";
基本上,您的
FROM
和最后一列之间缺少一个空格。您还缺少
lastName
周围的字符串限定符

但是,如果您正在为生产做一些事情,就不应该这样做。您应该研究使用参数化查询


正如Brian指出的,您的列名也与您试图从数据行字段中检索的列名不匹配。您需要使用正确的名称来更正此问题。

您遇到了一些问题。请使用以下方法:

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin"
        + " FROM Movies" +
        " WHERE headActor =  '" + lastName + "'";
基本上,您的
FROM
和最后一列之间缺少一个空格。您还缺少
lastName
周围的字符串限定符

但是,如果您正在为生产做一些事情,就不应该这样做。您应该研究使用参数化查询


正如Brian指出的,您的列名也与您试图从数据行字段中检索的列名不匹配。您需要使用正确的名称来更正此问题。

如果
lastName
是一个变量,请编写:

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin FROM Movies WHERE headactor = '" + LastName + '";

如果
lastName
是一个变量,请写入:

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin FROM Movies WHERE headactor = '" + LastName + '";

若您在“插入”查询中遇到相同的错误,您可以使用此方法来避免异常

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();
    }

若您在“插入”查询中遇到相同的错误,您可以使用此方法来避免异常

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();
    }

很好地理解了列名与大小写不匹配的情况。@TyCobb-谢谢您,先生。很好地理解了列名与大小写不匹配的情况。@TyCobb-谢谢您,先生。在lastName周围添加字符串限定符成功了。这是我们第一学期的一个学校项目