Почему мой параметризованный запрос не работает? - PullRequest
2 голосов
/ 28 июня 2010

У меня довольно сложный запрос, в основном я ищу строку или строки в базе данных в большинстве полей.Если это несколько строк, поле базы данных должно соответствовать всем частям строк.

Это базовый sql, на котором построен запрос:

SELECT wo.ID, {columns} FROM tblWorkOrder wo
    LEFT JOIN tblWorkOrderCategory wc
    ON wo.CategoryID = wo.ID
    LEFT JOIN tblTenant t
    ON wo.TenantID = t.ID
    LEFT JOIN tblProperty p
    ON wo.PropertyID = p.ID
    LEFT JOIN tblRentalUnit ru
    ON wo.UnitID = ru.ID 

Столбцы заменяются следующим списком:

            "wo.Date", "wo.WorkDesc", "wo.Priority", "wo.WorkDoneBy", "wo.EstimatedCost", "wo.DueDate", "wo.ActualCost", "wo.FinishedDate", "wo.workOrderNum",
            "wc.[Description]",
            "t.TenantName",
            "p.PropertyName",
            "ru.UnitNumber"

и вот как я строю запрос:

        String[] parts = txtSearch.Text.Split(' ');
        foreach (String column in columnsToSearch) {
            String clause = " (";
            for (int i = 0; i < parts.Length; i++) {
                clause += column + " LIKE '%@param" + i + "%' ";
                if (i + 1 != parts.Length) {
                    clause += "AND ";
                }
            }
            clause = clause.TrimEnd() + ") ";
            sql += clause + " OR ";
        }
        sql = sql.TrimEnd(new char[] { 'O', 'R', ' ' });

        using (SqlConnection conn = new SqlConnection(RentalEase.Properties.Settings.Default.RentalEaseConnectionString)) {
            SqlCommand command = new SqlCommand(sql, conn);

            for (int i = 0; i < parts.Length; i++) {
                command.Parameters.Add("@param" + i, SqlDbType.NVarChar).Value = parts[i];
                //command.CommandText = command.CommandText.Replace("@param" + i, parts[i]);
            }

Только это всегда не возвращает никаких строк.Однако в цикле for, который присваивает значения параметров, если я закомментирую строку Parameters.Add и раскомментирую нижеприведенную строку, я получу результаты, которые я должен видеть.Поскольку это небезопасный способ сделать это, я хотел бы знать, почему использование параметров не удается.

Ответы [ 2 ]

2 голосов
/ 28 июня 2010

Вы ищете литерал '@Param';Вы имеете в виду:

... LIKE '%' + @param" + i + " + '%' ...

, поэтому TSQL:

... LIKE '%' + @param2 + '%' ...

или проще;введите '%' в значение в коде вызова;тогда ваш код становится:

... LIKE @param" + i + " ...

, а TSQL становится:

... LIKE @param2 ...
1 голос
/ 28 июня 2010

Используйте SQL Profiler - вы точно увидите, что отправляется на SQL Server, включая все ваши параметры и их значения.

Скопируйте и вставьте это в SQL Server Mgmt Studio и запустите - я уверен, вы узнаете, что является причиной проблемы ... или, если нет, вы всегда можете опубликовать параметризованный запрос здесь, и мыПоможу еще раз: -)

...