Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Не получается передать переменную в sql-запрос

Михаил Валеев Знаток (474), закрыт 4 месяца назад
Пишу проект на C# с подключенной базой данных и использованием windows form. Дана задача: Для заданного жанра определить фильмы, чья стоимость меньше, чем заданный фильм из заданной страны. Но сколько бы я ни старался у меня никак не получается передать переменную в sql-запрос, постоянно выдаёт Must declare the scalar variable.
Как оно должно работать: я в 3 combobox'ах выбираю данные, которые вводятся туда из БД и по нажатию кнопки делается сам запрос с выводом в datagridview.
Сверху можно увидеть закомментированные sql-запрос и прошлую попытку это сделать, а также скрин таблицы, к которой идёт обращение.
Лучший ответ
Юлия Скрипниченко Мастер (1994) 4 месяца назад
### Пример кода

1. **Создание SQL-запроса с параметрами**

Предположим, у вас есть три переменные, которые вы хотите передать в запрос: `genre`, `country`, и `movieName`. Вам нужно создать запрос, который сравнит стоимость фильмов по выбранным критериям.

```csharp
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows .Forms;

namespace YourNamespace
{
public partial class YourForm : Form
{
private string connectionString = "your_connection_string_here";

public YourForm()
{
InitializeComponent();
}

private void btnFetchData_Click(object sender, EventArgs e)
{
string selectedGenre = cmbGenre.SelectedItem.ToString();
string selectedCountry = cmbCountry.SelectedItem.ToString();
string selectedMovieName = cmbMovie.SelectedItem.ToString();

string query = @"
SELECT MovieName, Price
FROM Movies
WHERE Genre = @Genre
AND Price < (
SELECT Price
FROM Movies
WHERE MovieName = @MovieName
AND Country = @Country
)";

using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
// Добавляем параметры в запрос
command.Parameters.AddWithValue("@Genre", selectedGenre);
command.Parameters.AddWithValue("@Country", selectedCountry);
command.Parameters.AddWithValue("@MovieName", selectedMovieName);

SqlDataAdapter adapter = new SqlDataAdapter(command);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);

// Привязываем результат к DataGridView
dataGridView1.DataSource = dataTable;
}
` ### Пояснение

1. **Параметризованный запрос**:
```sql
SELECT MovieName, Price
FROM Movies
WHERE Genre = @Genre
AND Price < (
SELECT Price
FROM Movies
WHERE MovieName = @MovieName
AND Country = @Country
)
```
Здесь `@Genre`, `@MovieName`, и `@Country` — параметры, которые будут заменены значениями из ваших ComboBox.

2. **Добавление параметров**:
```csharp
command.Parameters.AddWithValue("@Genre", selectedGenre);
command.Parameters.AddWithValue("@Country", selectedCountry);
command.Parameters.AddWithValue("@MovieName", selectedMovieName);
```
Метод `AddWithValue` добавляет параметры в запрос, заменяя их значениями, которые вы выбрали в ComboBox.

3. **Использование `SqlDataAdapter`**:
```csharp
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
dataGridView1.DataSource = dataTable;
```
`SqlDataAdapter` выполняет запрос и заполняет `DataTable`, который затем связывается с `DataGridView`.
- **Проверка данных**: Убедитесь, что ComboBox не пуст и что в нем действительно есть выбранные значения.
- **Обработка ошибок**: Не забудьте добавить обработку ошибок для улучшения надежности кода, например, использование `try-catch` для перехвата исключений.
Михаил ВалеевЗнаток (474) 4 месяца назад
Отличный ответ, спасибо
Остальные ответы
Jurijus Zaksas Искусственный Интеллект (453892) 4 месяца назад
Почитай, какой там синтаксис параметров конкретно в C# и в том наборе компонентов, который ты используешь для доступа к БД. Это каждый лепит по-своему, более того - часто документация гонит туфту по этому поводу. Возможно, параметр надо задавать без @, или еще что-то в этом духе. Ищи примеры, собирай статистику, пробуй, делай выводы.
Михаил ВалеевЗнаток (474) 4 месяца назад
Я уже столько всего перепробовал что и решил написать сюда, а вдруг
Максим Искусственный Интеллект (216022) 4 месяца назад
Скорее всего, имя параметра в Add должно быть без @. Также не рекомендуется применять AddWithValue, так как они очень плохо дружат с индексами. Лучше использовать Add и прописать тип ручками.
Аглая Шниц Искусственный Интеллект (146287) 4 месяца назад
помнится, кое-где в качестве плейсхолдера для параметра проканывал вообще знак вопроса. типа, так:
 string query = "SELECT * FROM Files WHERE Genre = ?"; 
но вообще да, с синтаксисом параметров там всё нетривиально.
Похожие вопросы