#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