2013-12-23 9 views
1

Программа останавливается на линии adapter.Fill(datatable), выдавая ошибку: oleDbException был необработанным: значение не задано для одного или нескольких требуемых параметров.Не задано значение для одного или нескольких требуемых параметров/SQL должно быть правильным

Когда я копирую 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); 
} 

ответ

4

У вас есть пара вопросов. Используйте:

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

В основном вы не хватало пространства между вашим FROM и последнего столбца. Вам также не хватало классификаторов строк вокруг вашего lastName.

Вы не должны этого делать, если вы делаете что-то для производства. Вы должны изучить использование параметризованных запросов.

How do parameterized queries help against SQL injection?

Как Брайан указал, имена столбцов также не соответствует тому, что вы пытаетесь извлечь из полей строк данных. Вы хотите исправить это с помощью правильных имен.

+0

+1 для указания параметризованных запросов. – Brian

+0

Добавление атрибутов строки вокруг lastName делало трюк. Это для школьного проекта для нашего первого семестрового класса программирования, профессор сказал, что это плохой метод, но нам нужно сначала изучить основы. – user3127227

+0

@ пользователь3127227 Отлично. Рад, что это сработало. – TyCobb

3

Изменение:

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

To:

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); 
+0

Хорошего улова на именах столбцов не соответствует случаю. – TyCobb

+0

@TyCobb - Спасибо, сэр. – Brian

7

Когда вы получите эту ошибку, это означает, что Access Engine не может правильно найти один или несколько из ваших имен столбцов или название всей таблицы.

Итак, на первом этапе нужно убедиться, что имена столбцов верны.
В частности, что 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); 
..... 
0

Если lastName переменные, написать:

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

Если вы получили такое же ошибку для «вставки» запрос вы можете использовать этот метод, избегайте исключений

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(); 
    } 
Смежные вопросы

 Смежные вопросы