Необходимо объявить скалярную переменную @param problem - PullRequest
3 голосов
/ 29 апреля 2011

Предупреждение новичка!

Ошибка:

Must declare the scalar variable "@param2".</p> <p>Must declare the scalar variable "@param2" (дважды для двух param2) protected void Button1_Click(object sender, EventArgs e) { SqlDataSource ds1 = new SqlDataSource(GetConnectionString(), GetSelectionString()); GridView1.DataSource = ds1; GridView1.DataBind(); }

и

</p> <pre> protected string GetSelectionString() { string SearchString = TextBox1.Text.ToString(); if (RadioButtonList1.SelectedValue == "ALL") { SqlParameter @param2 = new SqlParameter(); SqlCommand SearchAll = new SqlCommand("SELECT Document_Name, Document_Summary FROM Document_Details WHERE (Document_Id IN (SELECT Document_Id FROM Search_Index WHERE (Tag_Id IN (SELECT DISTINCT Tag_Id FROM Tags WHERE (Tag_Name LIKE '%'+@param2+'%'))))) UNION SELECT Document_Name, Document_Summary FROM Document_Details AS Document_Details_1 WHERE (Document_Name LIKE '%'+@param2+'%')"); SearchAll.Parameters.AddWithValue("@param2", SearchString.ToString()); return (string)SearchAll.CommandText.ToString(); } </pre> <p>

Значение TextBox1 будет передано пользователем.Я искал решения около 6 часов ... и все еще сталкивался с этой проблемой.Любые решения, пожалуйста?

Использование VS2008 с подключением MS SQL Server 2008 R2.

РЕДАКТИРОВАТЬ1: ДАЙТЕ ПОЛНЫЙ КОД.(отправитель объекта, EventArgs e) {SqlDataSource ds1 = new SqlDataSource (GetConnectionString (), GetSelectionString ());GridView1.DataSource = ds1;GridView1.DataBind ();}

обратите внимание: я связываю его с элементом управления GridView.Это работает, если я жестко закодировал значение @ param2 в запросе.

EDIT2: РАЗЛИЧНЫЙ ПОДХОД С РАЗЛИЧНОЙ ОШИБКОЙ: tried it this way, SqlCommand temp1 = GetSelectionString(); string temp2 = temp1.CommandText.ToString(); SqlDataSource ds1 = new SqlDataSource(GetConnectionString(), temp1.ToString()); GridView1.DataSource = ds1; GridView1.DataBind(); .... Получение новой ошибки

Не удалось найти сервер 'System' в sys.servers.Убедитесь, что указано правильное имя сервера.При необходимости выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в sys.servers

System.Data.SqlClient.SqlException: Не удалось найти сервер 'System' в sys.servers.Убедитесь, что указано правильное имя сервера.При необходимости выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в sys.servers.

Ответы [ 5 ]

4 голосов
/ 29 апреля 2011

Вам нужно использовать @param2 в качестве «автономного» параметра - не делайте , а не , упакуйте его в строку!

SqlCommand SearchAll = new SqlCommand(
   "SELECT Document_Name, Document_Summary FROM Document_Details 
    WHERE (Document_Id IN 
       (SELECT Document_Id FROM Search_Index 
        WHERE (Tag_Id IN (SELECT DISTINCT Tag_Id 
                          FROM Tags 
                          WHERE Tag_Name LIKE @param2)))) 
    UNION 
    SELECT Document_Name, Document_Summary FROM Document_Details AS Document_Details_1 
    WHERE Document_Name LIKE @param2");

Если вы хотите найти строку с % в начале и в конце, вам нужно указать это значение @param2

Кроме того: ваш запрос может работать намного лучше, если вы разбьете эти подвыборы и будете использовать одну инструкцию SQL, используя JOIN для объединения таблиц ...

Обновление: ваш подход имеет очень простой недостаток: вы, вероятно, ожидаете, что если вы используете параметризованный запрос в SqlCommand, вы получите полный SQL-оператор с заполненным значением параметра при обращении к SearchAll.CommandText - это просто не тот случай - параметр @param2 будет не заменен его значением!

Так что, по сути, вы не можете сделать это так, как вы делаете это прямо сейчас - вам нужно передать SqlCommand экземпляр - , а не просто строку! Это будет никогда работать

Обновление № 2: вам нужно сделать что-то вроде этого:

protected void Button1_Click(object sender, EventArgs e)
{
   // grab search string from web UI
   string searchString = "%" + TextBox1.Text.Trim() + "%";

   // get connection string
   string connectionString = GetConnectionString();

   SqlDataSource ds1 = new SqlDataSource(connectionString);

   // get the SqlCommand to do your SELECT
   ds1.SelectCommand = GetSelectCommand(connectionString, searchString);

   GridView1.DataSource = ds1;
   GridView1.DataBind();
}

и

protected SqlCommand GetSelectCommand(string connectionString, string searchValue)
{
   // define query string - could be simplified!
   string queryStmt = "SELECT Document_Name, Document_Summary FROM Document_Details WHERE (Document_Id IN (SELECT Document_Id FROM Search_Index WHERE (Tag_Id IN (SELECT DISTINCT Tag_Id FROM Tags WHERE Tag_Name LIKE @param2)))) UNION SELECT Document_Name, Document_Summary FROM Document_Details AS Document_Details_1 WHERE Document_Name LIKE @param2";

   // set up a SqlCommand based on the query string and the connection string passed in       
   SqlCommand cmd = new SqlCommand(queryStmt, connectionString);

   // define parameter
   cmd.Parameters.Add("@param2", SqlDbType.VarChar, 100);

   // set value for parameter
   cmd.Parameters["@param2"].Value = searchValue;

   // pass back SqlCommand to fill the data source
   return cmd;
}
3 голосов
/ 18 июня 2012

Я знаю, что это старый вопрос, но я столкнулся с ним, пытаясь вспомнить, как выполнить то же самое, и у меня есть решение. Теперь, когда я прочитал самый последний ответ Саи Калян Акшинтхала, я думаю, что он, возможно, намекал на то же самое.

Ключ заключается в том, что когда вы добавляете параметр в коллекцию параметров SQLDataSource, вам необходимо оставить «@» в имени. Ошибка утверждает, что он не видит параметр с правильным именем, совпадающим с параметром, переданным в параметризованной строке SQL. Хотя параметр SQL в строке должен иметь имя «@», соответствующие параметры SQLDataSource не должны его использовать.

Вот мой код на C #. Это метод, используемый в веб-форме, который обеспечивает гибкий поиск в базе данных статей.

protected void CreateArticleSearch()
{
    // Declare the base query and start the WHERE clause.
    string articleQuery = "SELECT DisplayTitle, Summary, CreateDate, ArticleID FROM Articles ";
    string whereClause = "WHERE ";

    try
    {
        // Important, clear the parameters first.
        Articles.SelectParameters.Clear();

        // Test the field to see if there's anything there.
        if (textTitle.Text.Length > 0)
        {
            // If there is a value, add to the WHERE clause and add a parameter.
            whereClause += "DisplayTitle LIKE @ArticleTitle ";
            Articles.SelectParameters.Add("ArticleTitle", "%" + textTitle.Text + "%");
        }

        // Do the same for each subsequent field except test to see if the
        // WHERE clause already holds something and add AND as necessary.
        if (textSummary.Text.Length > 0)
        {
            if (whereClause == "WHERE ")
                whereClause += "Summary LIKE @ArticleSummary ";
            else
                whereClause += "AND Summary LIKE @ArticleSummary ";

            Articles.SelectParameters.Add("ArticleSummary", "%" + textSummary.Text + "%");
        }

        // Test WHERE clause to see if it contains anything.
        // Add it to the base query if it does.
        if (whereClause.Length > 6)
            articleQuery += whereClause;

        // Specify the command type for the SQLDataSource and attach the query.
        Articles.SelectCommandType = SqlDataSourceCommandType.Text;
        Articles.SelectCommand = articleQuery;

    }
    catch
    {
        throw;
    }
}

Затем все, что остается, - это привязка данных к GridView, предоставляемая источником SQLDataSource. Я использовал это в нескольких приложениях, и это прекрасно работает.

Эндрю Комо

2 голосов
/ 29 апреля 2011

you concatenating parameter to your query это неправильно в вашем запросе

SqlCommand("SELECT Document_Name, Document_Summary FROM Document_Details WHERE (Document_Id IN (SELECT Document_Id FROM Search_Index WHERE (Tag_Id IN (SELECT DISTINCT Tag_Id FROM Tags WHERE (Tag_Name LIKE %@param2%))))) UNION SELECT Document_Name, Document_Summary FROM Document_Details AS Document_Details_1 WHERE (Document_Name LIKE %@param2%)");
1 голос
/ 29 апреля 2011

Во-первых, ваше объявление о param2 бесполезно: SqlParameter @ param2 = new SqlParameter () Если вы хотите его использовать, попробуйте сделать его более значимым, например documentName. Второе. Попробуйте удалить один из параметров?это работает?если вы добавите это во второй раз, это потерпит неудачу?в таком случае измените имя второго и добавьте его в качестве отдельного параметра.

0 голосов
/ 29 апреля 2011

Вы объявляете параметр с именем param2 и используете @param2, поэтому он застревает.Исправьте и попробуйте.

...