簡體   English   中英

沒有為一個或多個必需參數給出值/ SQL應該正確

[英]no value given for one or more required parameters/ SQL should be correct

程序在adapter.Fill(datatable)行停止, adapter.Fill(datatable)錯誤:oleDbException未處理:未為一個或多個必需參數提供值。

當我將SQL復制到訪問時,沒有錯誤。

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

來自以下形式的代碼:

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";
}

Actor.Movies方法如下所述

public List<Movie> Movies
{
   get { return Movie.AllMoviesSameActor(this.lastName); 
}

當您收到此錯誤時,表示Access Engine無法正確找到一個或多個列名或整個表名。

因此,第一步是確保列名正確。
特別是minLenght似乎是錯誤的(minLength ???)

字符串連接也包含一個錯誤。 在FROM子句之前缺少空格,但這將引發語法錯誤,而不是缺少參數。

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin " +  // space added
          "FROM Movies WHERE headactor =  " + lastName ;

最后, headactor字段似乎是一個文本字段,如果為true,則需要在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周圍的字符串限定符。

如果您要進行生產,則不應執行此操作。 您應該研究使用參數化查詢。

參數化查詢如何幫助防止SQL注入?

正如Brian指出的,您的列名也與您嘗試從“數據行字段”中檢索的內容不匹配。 您將需要使用正確的名稱進行更正。

更改:

command = "SELECT movieId, name, headActor, Director, ReleaseDate, lenghtMin"
          + "FROM Movies" + " WHERE headactor =  " + 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);

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM