SQL Server содержит предикат, не работающий с несколькими условиями поиска - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть программа ac #, которая ищет таблицу по вводу пользователя.

Ключевые слова разделяются пробелом и сохраняются в массив.

Тогда оператор switch выберет правильный регистр на основе ввода только одного слова или двух слов.

Мой оператор switch заполняет мою таблицу данных только для первого случая, но при попытке использовать второй случай моя программа переходит к исключению catch.

Я пытался отладить, но вижу только то, что при вводеслучай 2, он не выходит за пределы sda1.Fill(dt1);

Обновленный код:

static string myconnstr = ConfigurationManager.ConnectionStrings["connstrng"].ConnectionString;       

private void btnSearch_Click(object sender, EventArgs e)
{
    //Get the value from textbox
    string keyword = txtboxKeyword.Text;
    string[] words = keyword.Split(' ');

    //SQL Connection
    var conn = new SqlConnection(myconnstr);

    try
    {
        switch (words.Length)
        {
            case 1:
                    //Declare Command object with parameter
                    SqlCommand cmd = new SqlCommand("SELECT Site, StreetAddress, City, State, Zip, PharmacyPhone, MDVersion, InstallDate, SiteCodes, SiteNotActive, CloseDate, SiteNotes " +
                                    "FROM Sites WHERE contains(site, @words0) OR contains (StreetAddress, @words0) OR contains(city, @words0)", conn);

                    cmd.Parameters.AddWithValue("@words0", words[0]);

                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    dataGridSites.ReadOnly = true;
                    dataGridSites.DataSource = dt;
                    dataGridSites.CurrentCell = null;
                    break;
                case 2:
                    //Declare Command object with parameter
                    SqlCommand cmd1 = new SqlCommand("SELECT Site, StreetAddress, City, State, Zip, PharmacyPhone, MDVersion, InstallDate, SiteCodes, SiteNotActive, CloseDate, SiteNotes " +
                                    "FROM Sites WHERE contains(site, @words0, @words1) OR contains (StreetAddress, @words0, @words1) OR contains(city, @words0, @words1)", conn);

                    cmd1.Parameters.AddWithValue("@words0", words[0]);
                    cmd1.Parameters.AddWithValue("@words1", words[1]);

                    SqlDataAdapter sda1 = new SqlDataAdapter(cmd1);
                    DataTable dt1 = new DataTable();
                    sda1.Fill(dt1);
                    dataGridSites.ReadOnly = true;
                    dataGridSites.DataSource = dt1;
                    dataGridSites.CurrentCell = null;
                    break;                   
        }
    }
    catch (Exception)
    {
        MessageBox.Show("Search cannot be blank.");
    }            
}

Вот обновленная ошибка исключения, которую я получаю:

System.Data.SqlClient.SqlException (0x80131904): неправильный синтаксис рядом с '@ words1'.Номер ошибки: 102, состояние: 1, класс: 15

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Причина, по которой ваш существующий код не работает, заключается в том, что contains не поддерживает три параметра в том виде, в котором вы в настоящее время пытаетесь его вызвать.

Согласно документации Я бы предложил изменить:

FROM Sites WHERE contains(site, @words0) OR contains (StreetAddress, @words0) OR contains(city, @words0)

на:

FROM Sites WHERE contains((site, StreetAddress, city), @words0)

И:

FROM Sites WHERE contains(site, @words0, @words1) OR contains (StreetAddress, @words0, @words1) OR contains(city, @words0, @words1)

на:

FROM Sites WHERE contains((site, StreetAddress, city), @words0) OR contains((site, StreetAddress, city), @words1)

Если выЕсли вы действительно хотите использовать ваш текущий более многословный стиль, то Пример I предполагает, что:

FROM Sites WHERE contains(site, @wordsConcat) OR contains (StreetAddress, @wordsConcat) OR contains(city, @wordsConcat)

может работать, где @wordsConcat установлено (C #) до:

words[0] + " OR " + words[1]
0 голосов
/ 28 ноября 2018

Я думаю, что это проблема объема, известная в случае переключения, по историческим причинам. Вот почему мы должны ставить перерыв после каждой оценки.Попробуйте посмотреть здесь. Объявление переменной в операторе переключения C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...