Получение ошибки с набором данных

#c# #asp.net #sql

#c# #asp.net #sql

Вопрос:

Я получаю сообщение об ошибке или зависании при запуске приложения, поскольку оно выдает мне сообщение:

Must declare the scalar variable "@Category" " next to dashowadscat.Fill(dsadsshowcat); .

Также есть красная строка под QueryString[«cat»]

   using (SqlConnection shwadscat = new SqlConnection(cs))
          {                   
            shwadscat.Open();

            SqlDataAdapter dashowadscat = 
              new SqlDataAdapter("SELECT DISTINCT [AdsID],
                                         [Section], 
                                         [Category], 
                                         [Country], 
                                         [State], 
                                         [City], 
                                         [AdsTit], 
                                         SUBSTRING([AdsDesc],1,155) as AdsDesc,
                                         [AdsPrice], 
                                         [Img1] 
                                  FROM [ads] 
                                  WHERE (([Category] = @Category) 
                                  AND ([Country] = @Country))", cs);

            string location = Convert.ToString(Session["location"]);
            string cat = Convert.ToString(QueryString["cat"]);

            DataSet dsadsshowcat = new DataSet();

            dashowadscat.Fill(dsadsshowcat);

            cateshowlistview.DataSource = dsadsshowcat.Tables[0];
            cateshowlistview.DataBind();
          }
        }
        else
        {...}
  

Ответ №1:

Несколько проблем…

  • Вам необходимо указать значения для параметров в строке вашего запроса.

  • Я предполагаю, что вы хотите Request.QueryString , а не просто QueryString , что само по себе ничего не значит, поэтому вы получаете синтаксическую ошибку.

  • В настоящее время вы передаете свою SqlDataAdapter строку подключения вместо SqlConnection созданной вами. Если ваша строка подключения работает для SqlDataAdapter , то вы можете полностью удалить SqlConnection «shwadscat».

Попробуйте это:

 var location = Convert.ToString(Session["location"]);
var cat = Convert.ToString(Request.QueryString["cat"]);

var dsadsshowcat = new DataSet();

using (SqlConnection shwadscat = new SqlConnection(cs))
{
    shwadscat.Open();

    using (var dashowadscat = new SqlDataAdapter("SELECT DISTINCT AdsID, Section, Category, Country, State, City, AdsTit, SUBSTRING(AdsDesc,1,155) as AdsDesc, AdsPrice, Img1 FROM ads WHERE Category = @Category AND Country = @Country", shwadscat))
    {
        dashowadscat.SelectCommand.Parameters.AddWithValue("@Category", cat);
        dashowadscat.SelectCommand.Parameters.AddWithValue("@Country", location);

        dashowadscat.Fill(dsadsshowcat);

        cateshowlistview.DataSource = dsadsshowcat.Tables[0];
        cateshowlistview.DataBind();
    }
}
  

Кстати, спасибо за параметризацию вашего запроса. Это более безопасный и более обслуживаемый способ сделать это.

Комментарии:

1. действительно спасибо за ваш ответ, но я получаю красную строку под ‘parameters’ Ошибка 37 ‘System.Data.SqlClient.SqlDataAdapter’ не содержит определения для ‘Parameters’ и не удалось найти метод расширения ‘Parameters’, принимающий первый аргумент типа ‘System.Data.SqlClient.SqlDataAdapter’ (вам не хватает директивы using или ссылки на сборку?)

Ответ №2:

Оператор select требует 2 параметра в предложении where, и вы их не указали.

Ответ №3:

Пожалуйста, проверьте свой SQL SELECT DISTINCT [AdsID],[Section], [Category], [Country], [State], [City], [AdsTit], SUBSTRING([AdsDesc],1,155) as AdsDesc, [AdsPrice], [Img1] FROM [ads] WHERE (([Category] = @Category) AND ([Country] = @Country))

Я полагаю, что вы хотите передать @Category и @Country в качестве параметра, вы можете проверить SqlParameter , в противном случае вы можете объединить свой SQL в коде типа:

Редактировать (разверните код с использованием всего и измените cs на shwadscat :

 using (SqlConnection shwadscat = new SqlConnection(cs))
{
    shwadscat.Open();

    string location = Convert.ToString(Session["location"]);
    string cat = Convert.ToString(QueryString["cat"]);

    SqlDataAdapter dashowadscat = new SqlDataAdapter("SELECT DISTINCT [AdsID],[Section], [Category], [Country], [State], [City], [AdsTit], SUBSTRING([AdsDesc],1,155) as AdsDesc, [AdsPrice], [Img1] FROM [ads] WHERE (([Category] = '"   cat  "') AND ([Country] = '"   location   "'))", shwadscat);

    DataSet dsadsshowcat = new DataSet();

    dashowadscat.Fill(dsadsshowcat);

    cateshowlistview.DataSource = dsadsshowcat.Tables[0];
    cateshowlistview.DataBind();
}
  

Комментарии:

1. спасибо за ваш ответ да, я хочу использовать категорию и страну в качестве параметра для показа определенной рекламы в зависимости от них, я пробовал использовать SQL-инструкцию, но я все еще получаю ошибку, необходимо объявить скалярную переменную «@Category». я использовал sqldatasource, и он работает нормально, но я предпочитаю использовать серверный код, вот код sqldatasource, который работает нормально, который я добавил в свой пост

2. Можете ли вы выполнить поиск в своей процедуре @Category ? Я думаю, что после того, как вы изменили sql, в вашем коде не должно быть никаких @Category . Кроме того, я обнаружил, что вы можете использовать shwadscat в качестве второго параметра вместо cs в вашем new SqlDataAdapter

Ответ №4:

Вы не объявили скалярную переменную @Category , вот пример:

 SqlCommand cmd = new SqlCommand("SELECT DISTINCT [AdsID],[Section], [Category], [Country], [State], [City], [AdsTit], SUBSTRING([AdsDesc],1,155) as AdsDesc, [AdsPrice], [Img1] FROM [ads] WHERE (([Category] = @Category) AND ([Country] = @Country))", cs);
cmd.Parameters.Add("@Category", SqlDbType.Int);
cmd.Parameters["@ID"].Value = "";
cmd.Parameters.Add("@Country", SqlDbType.Int);
cmd.Parameters["@ID"].Value = "";
  

Комментарии:

1. Уважаемый @stackCheck спасибо за ваш ответ, но это не работает, я получаю красную строку под инструкцией SqlCommand