2015-07-13 2 views
-1

Я пытаюсь создать функцию поиска, которая ищет GridView для определенного значения, а затем возвращает эту строку. Я проверил этот запрос в MySQL Workbench и он работает, но когда запрос выполняется в визуальной студии, я получаю эту ошибку:error in Search SQL-запрос

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?parameter0' at line 23

 StringBuilder SQL = new StringBuilder(SearchSQL); 
       if (SearchFieldKey != null && SearchFieldKey.Length > 0) 
       { 
        if (SearchTerms != null) 
        { 
         SQL.Append(" HAVING "); 
         for (int i = 0; i < SearchFieldKey.Length; i++) 
         { 
          if (SearchFields.ContainsKey(SearchFieldKey[i])) 
          { 

           SQL.Append(SearchFields[SearchFieldKey[i]] + " LIKE ?parameter" + i.ToString()); 
           param.Add(new MySqlParameter("parameter" + i.ToString(), "%" + SearchTerms[i] + "%")); 

           if (i != SearchFieldKey.Length - 1) 
            SQL.Append(" OR "); 
          } 
          else 
           throw new Exception("Error: Attempted to search on invalid field. Check SearchFields Argument."); 
         } 
        } 
       } 

SQL.Append(" '); "); 
SQL.Append ("prepare stmt from @sql; execute stmt; deallocate prepare stmt;"); 

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

Запрос получает бежать из этого кода:

DataTable dtJobs = Job.CustomFill(SQL.ToString(), param); 

А параметры, передаваемые в это "% ТЕСТИРОВАНИЕ%"

Запрос, который выводит строку из базы данных:

private static string SearchSQL 
    { 
     get 
     { 
      return @" 
                  SET group_concat_max_len=10000000; 
                  set @sql = null; 
                   select 
                    group_concat(distinct 
                    concat(
                     'MAX(CASE WHEN pt.Code = ''', 
                     pt.Code , 
                     ''' THEN jp.AdvisedQty ELSE 0 END) AS `', 
                     pt.Code, '`' 
                    ) 
                   ) into @sql 
                   FROM customer c 
                 LEFT JOIN job_address ja ON c.AccountCode = ja.Code AND c.Company_ID = ja.Company_ID 
                 JOIN AddressType jat ON ja.AddressType = jat.ID and jat.Description = 'Debtor' 
                 LEFT JOIN job_new jn ON ja.JobID = jn.ID 
                 LEFT JOIN job_pieces jp ON ja.JobID = jp.ID 
                 LEFT JOIN piecestype pt on jp.TypeID = pt.ID 
                WHERE c.Company_ID = ?compid; 

             set @sql = concat('select 
                  c.Name, 
                  COUNT(distinct jn.ID) as Jobs, 
                  (SELECT Name FROM job_address WHERE AddressType =3 AND JobID = jn.ID) as CollectName, 
                  (SELECT Name FROM job_address WHERE AddressType =2 AND JobID = jn.ID) as DeliverName, 
                  ', @sql, ' 
                 FROM customer c 
                 LEFT JOIN job_address ja ON c.AccountCode = ja.Code AND c.Company_ID = ja.Company_ID 
                 JOIN AddressType jat ON ja.AddressType = jat.ID and jat.Description = ''Debtor'' 
                 LEFT JOIN job_new jn ON ja.JobID = jn.ID 
                 LEFT JOIN job_pieces jp ON ja.JobID = jp.ID 
                 LEFT JOIN piecestype pt on jp.TypeID = pt.ID 
                WHERE c.Company_ID = ', ?compid, 
                ' GROUP BY c.ID 


                      "; 
     } 
    } 

Итак, мой поисковый запрос помещает HAVING c.Name LIKE "%PRL%" '); сразу после GROUP BY из запроса. Затем заявления Append помещают подготовленные stmts в конец запроса.

+1

Я думаю, вам нужно использовать '@' вместо '?' при связывании параметров. –

+0

Добавьте код, чтобы распечатать заполненный SQL, чтобы вы могли его увидеть. Из этого следует, что проблема. Если по какой-то причине вам это не очевидно, отредактируйте заполненный SQL в вопрос, и, вероятно, это будет очевидно где-то здесь. Однако на первый взгляд вам не хватает логических операторов «AND» или «OR» между параметрами. –

+0

@EvanMulawski MySql может использовать '?' –

ответ

0

На основе SQL вы публикуемая, проблема заключается в двойных кавычках:

HAVING c.Name LIKE "%PRL%" 

Стандарт SQL говорит двойные кавычки используются для имен идентификаторов, таких как псевдонимы, столбцы, таблицы, схемы, процедуры, представление , или баз данных. Если вы хотите строковые литералы, вам нужно использовать одиночные кавычки здесь:

HAVING c.Name LIKE '%PRL%' 

Это один из тех многих мест, MySql делает плохую работу после стандартной (зависит от того, как у вас есть ANSI_QUOTES набора), но если вы хотите быть уверенным, попробуйте одинарные кавычки.

+0

Отсутствие одинарных кавычек не решает его 'param.Add (новый MySqlParameter (« параметр »+ i.ToString(), '%' + SearchTerms [i] + '%')); ' – user123456789

+0

Здесь нет одиночных кавычек. Я подозреваю, что проблема в вашем методе CustomFill(). –

+0

, тогда где должны быть одинарные кавычки? – user123456789