Я нахожусь в процессе перевода веб-сайта ASP.NET, который я сделал с использованием адаптеров таблиц и хранимых процедур, на использование Linq для SQL (.NET 4), потому что это делает все это намного более удобным в обслуживании.
Приложение представляет собой библиотечный каталог, и я использую полнотекстовый поиск в SQL Server 2008 R2 express, чтобы позволить пользователю выполнять поиск в различных полях, таких как заголовок, автор, издатель и т. Д. Существующий полнотекстовый поиск, который у меня есть, является хранимой процедурой, которая генерируетдинамический запрос в соответствии с параметрами поиска, указанными пользователем.В LinQ to SQL я планировал повторно использовать этот же запрос, поскольку прямой доступ к полнотекстовому поиску отсутствует.
Сам запрос всегда выполнялся нормально.Теперь я продолжаю получать «полнотекстовый предикат null или empty» от компилятора во время выполнения, в частности, в строке, выполняющей хранимую процедуру:
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), section_ID, division_ID, start_Catalogue_Number, end_Catalogue_Number, start_Revision_Date, end_Revision_Date, start_Added_Date, end_Added_Date, book_Type, searchTitle, searchAuthor, searchPublisher, searchDealer, searchPrinter, searchSummary, searchComments, searchString, searchStringsCombinator, searchConditionsCombinator, pageNumber, pageSize, resultCount);
Итак, я попытался перестроить запрос с нуля добавляя пункт за предложениемк хранимой процедуре, и полнотекстовый поиск работал нормально, пока снова не возникла ошибка «Полнотекстовый предикат пустой или пустой».
Я просто не вижу, что не так с тем, что я делаю, и этоударился головой о кирпичную стену несколько раз.Любая помощь будет принята с благодарностью.
Хранимая процедура, которая работала до недавнего времени:
ALTER PROCEDURE dbo.AAATest
(
/*Non-fulltext search parameters*/
@Section_ID int = null,
@Division_ID int = null,
@Start_Catalogue_Number int = null,
@End_Catalogue_Number int = null,
@Start_Revision_Date smalldatetime = null,
@End_Revision_Date smalldatetime = null,
@Start_Added_Date smalldatetime = null,
@End_Added_Date smalldatetime = null,
@Book_Type int = null,
/*Fulltext search parameters*/
@SearchTitle bit = 0,
@SearchAuthor bit = 0,
@SearchPublisher bit = 0,
@SearchDealer bit = 0,
@SearchPrinter bit = 0,
@SearchSummary bit = 0,
@SearchComments bit = 0,
@SearchString nvarchar(4000) = NULL,
@SearchStringsCombinator nvarchar(3) = 'OR',
@SearchConditionsCombinator nvarchar(3) = 'OR',
/*Paging variables*/
@PageNumber int = 0,
@PageSize int = 10,
/*Output parameters*/
@ResultCount int OUTPUT
)
AS
DECLARE @DynamicSearchQuery nvarchar(MAX),
@DynamicSearchClause nvarchar(MAX),
@DynamicSearchParameters nvarchar(MAX),
@FullTextClauseSubjects nvarchar(MAX),
@FullTextClauseKeywords nvarchar(MAX)
SELECT @DynamicSearchQuery = 'SELECT Teikoku_Lib_Current_Books.Book_ID, Teikoku_Lib_Current_Books.Book_Catalogue_Number, Teikoku_Lib_Current_Books.Book_ISBN_Number, Teikoku_Lib_Current_Books.Book_Title, Teikoku_Lib_Current_Books.Book_Author, Teikoku_Lib_Current_Books.Book_Publication_Date, Teikoku_Lib_Current_Books.Book_Revision_Date, Teikoku_Lib_Current_Books.Book_Publisher, Teikoku_Lib_Current_Books.Book_Edition_Date, Teikoku_Lib_Current_Books.Book_Edition_Number, Teikoku_Lib_Current_Books.Book_Printer, Teikoku_Lib_Current_Books.Book_Dealer, Teikoku_Lib_Current_Books.Book_Number_Of_Copies, Teikoku_Lib_Current_Books.Book_Part, Teikoku_Lib_Current_Books.Book_Summary, Teikoku_Lib_Current_Books.Book_Comments, Teikoku_Lib_Current_Books.Book_Section_ID, Teikoku_Lib_Current_Books.Book_Division_ID, Teikoku_Lib_Current_Books.Book_Added_Date, Teikoku_Lib_Current_Books.Book_Type';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' ' + 'FROM Teikoku_Lib_Current_Books';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' ' + 'WHERE ';
/*Add static search conditions*/
/*Section and division data*/
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Section_ID = @dynSection_ID OR @dynSection_ID IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Division_ID = @dynDivision_ID OR @dynDivision_ID IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
/*Book type*/
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Type = @dynBook_Type OR @dynBook_Type IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
/*Catalogue number*/
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Catalogue_Number >= @dynStart_Catalogue_Number OR @dynStart_Catalogue_Number IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Catalogue_Number <= @dynEnd_Catalogue_Number OR @dynEnd_Catalogue_Number IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
/*Revision date*/
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Revision_Date >= @dynStart_Revision_Date OR @dynStart_Revision_Date IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Revision_Date <= @dynEnd_Revision_Date OR @dynEnd_Revision_Date IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Added_Date >= @dynStart_Added_Date OR @dynStart_Added_Date IS NULL)';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + ' AND ';
SELECT @DynamicSearchQuery = @DynamicSearchQuery + '(Teikoku_Lib_Current_Books.Book_Added_Date <= @dynEnd_Added_Date OR @dynEnd_Added_Date IS NULL)';
/*Dynamic search conditions*/
IF @SearchString IS NOT NULL
BEGIN
/*Set combinator for the search strings*/
IF @SearchStringsCombinator <> 'OR' AND @SearchStringsCombinator <> 'AND'
SELECT @SearchStringsCombinator = 'OR'
/*Replace underscore separators used in the querystring with the search string combinator keyword*/
SELECT @SearchString = REPLACE(RTRIM(LTRIM(REPLACE(REPLACE(LTRIM(RTRIM(@SearchString)), '_', ' '), ' ', ' '))), ' ', ' ' + @SearchStringsCombinator + ' ');
/*Fulltext search on the title*/
IF @SearchTitle > 0
SELECT @DynamicSearchClause = 'CONTAINS(Teikoku_Lib_Current_Books.Book_Title, @dynSearchString)';
/*Fulltext search on the author*/
IF @SearchAuthor > 0
BEGIN
IF @DynamicSearchClause IS NULL
SELECT @DynamicSearchClause = 'CONTAINS(Teikoku_Lib_Current_Books.Book_Author, @dynSearchString)';
ELSE
SELECT @DynamicSearchClause = @DynamicSearchClause + ' ' + @SearchConditionsCombinator + ' ' + 'AND CONTAINS(Teikoku_Lib_Current_Books.Book_Author, @dynSearchString)';
END
/*Fulltext search on the publisher*/
IF @SearchPublisher > 0
BEGIN
IF @DynamicSearchClause IS NULL
SELECT @DynamicSearchClause = 'CONTAINS(Teikoku_Lib_Current_Books.Book_Publisher, @dynSearchString)';
ELSE
SELECT @DynamicSearchClause = @DynamicSearchClause + ' ' + @SearchConditionsCombinator + ' ' + 'AND CONTAINS(Teikoku_Lib_Current_Books.Book_Publisher, @dynSearchString)';
END
/*Fulltext search on the dealer*/
IF @SearchDealer > 0
BEGIN
IF @DynamicSearchClause IS NULL
SELECT @DynamicSearchClause = 'CONTAINS(Teikoku_Lib_Current_Books.Book_Dealer, @dynSearchString)';
ELSE
SELECT @DynamicSearchClause = @DynamicSearchClause + ' ' + @SearchConditionsCombinator + ' ' +'CONTAINS(Teikoku_Lib_Current_Books.Book_Dealer, @dynSearchString)';
END
/*Fulltext search on the printer*/
IF @SearchPrinter > 0
BEGIN
IF @DynamicSearchClause IS NULL
SELECT @DynamicSearchClause = 'CONTAINS(Teikoku_Lib_Current_Books.Book_Printer, @dynSearchString)';
ELSE
SELECT @DynamicSearchClause = @DynamicSearchClause + ' ' + @SearchConditionsCombinator + ' ' + 'CONTAINS(Teikoku_Lib_Current_Books.Book_Printer, @dynSearchString)';
END
/*Fulltext search on the summary*/
IF @SearchSummary > 0
BEGIN
IF @DynamicSearchClause IS NULL
SELECT @DynamicSearchClause = 'CONTAINS(Teikoku_Lib_Current_Books.Book_Summary, @dynSearchString)';
ELSE
SELECT @DynamicSearchClause = @DynamicSearchClause + ' ' + @SearchConditionsCombinator + ' ' + 'CONTAINS(Teikoku_Lib_Current_Books.Book_Summary, @dynSearchString)';
END
/*Fulltext search on the comments*/
IF @SearchComments > 0
BEGIN
IF @DynamicSearchClause IS NULL
SELECT @DynamicSearchClause = 'CONTAINS(Teikoku_Lib_Current_Books.Book_Comments, @dynSearchString)';
ELSE
SELECT @DynamicSearchClause = @DynamicSearchClause + ' ' + @SearchConditionsCombinator + ' ' + 'CONTAINS(Teikoku_Lib_Current_Books.Book_Comments, @dynSearchString)';
END
/*Add the dynamic conditions to the query*/
IF @DynamicSearchClause IS NOT NULL
SELECT @DynamicSearchQuery = @DynamicSearchQuery + 'AND (' + @DynamicSearchClause + ')';
END
/*Dynamic query variables declaration*/
SELECT @DynamicSearchParameters = '@dynSection_ID int = null, @dynDivision_ID int = null, @dynStart_Catalogue_Number int = null,
@dynEnd_Catalogue_Number int = null, @dynStart_Revision_Date smalldatetime = null, @dynEnd_Revision_Date smalldatetime = null,
@dynStart_Added_Date smalldatetime = null, @dynEnd_Added_Date smalldatetime = null, @dynBook_Type int = null, @dynSearchString nvarchar(4000)';
/*Create table to hold results temporarily*/
CREATE table #searchResults
(
temp_Book_ID int IDENTITY(1,1),
Book_ID int,
Book_Catalogue_Number int,
Book_ISBN_Number nvarchar(13),
Book_Title nvarchar(200),
Book_Author nvarchar(200),
Book_Publication_Date datetime,
Book_Revision_Date datetime,
Book_Publisher nvarchar(100),
Book_Edition_Date datetime,
Book_Edition_Number smallint,
Book_Printer nvarchar(100),
Book_Dealer nvarchar(100),
Book_Number_Of_Copies int,
Book_Part int,
Book_Summary nvarchar(MAX),
Book_Comments nvarchar(MAX),
Book_Section_ID int,
Book_Division_ID int,
Book_Added_Date datetime,
Book_Type int
)
INSERT INTO #searchResults EXEC sp_executesql @DynamicSearchQuery, @DynamicSearchParameters, @Section_ID, @Division_ID, @Start_Catalogue_Number,
@End_Catalogue_Number, @Start_Revision_Date, @End_Revision_Date, @Start_Added_Date, @End_Added_Date, @Book_Type, @SearchString;
SELECT #searchResults.Book_ID, #searchResults.Book_Catalogue_Number, #searchResults.Book_ISBN_Number,
#searchResults.Book_Title, #searchResults.Book_Author, #searchResults.Book_Publication_Date, #searchResults.Book_Revision_Date,
#searchResults.Book_Publisher, #searchResults.Book_Edition_Date, #searchResults.Book_Edition_Number, #searchResults.Book_Printer,
#searchResults.Book_Dealer, #searchResults.Book_Number_Of_Copies, #searchResults.Book_Part, #searchResults.Book_Summary,
#searchResults.Book_Comments, #searchResults.Book_Section_ID, #searchResults.Book_Division_ID, #searchResults.Book_Added_Date,
#searchResults.Book_Type
FROM #searchResults WHERE (#searchResults.temp_Book_ID >= (@PageNumber * @PageSize) AND #searchResults.temp_Book_ID <= ((@PageNumber + 1) * @PageSize));
SELECT @ResultCount = COUNT(*) FROM #searchResults;
DROP TABLE #searchResults;
RETURN
Я знаю, что это довольно долго, извиняюсь.Но, по сути, это один и тот же бит кода снова и снова.Последний бит в хранимой процедуре, который мне нужен, чтобы получить общее количество результатов, возвращаемых запросом, чтобы я мог правильно отобразить мой интерфейс подкачки.
Затем я вызываю его из моего BLL как
return db.AAATest(SectionID, DivisionID, StartCatalogueNumber, EndCatalogueNumber, StartRevisionDate, EndRevisionDate,
StartAddedDate, EndAddedDate, BookType, SearchTitle, SearchAuthor, SearchPublisher, SearchDealer, SearchPrinter,
SearchSummary, SearchComments, SearchStrings, SearchStringCombinator,
SearchConditionsCombinator, PageNumber, PageSize, ref TotalRecords);
И в качестве теста я передаю аргументы
lvCatalogueContent.DataSource = currentBook_Repository.GetCurrentBooksFiltered(null, null, null, null, null, null, null,
null, null, true, false, false, false, false, false, false, true, true, "橋", null, null, null, null, null, 0, 20,
ref totalRecords);
Эти параметры работают абсолютно нормально, когда я тестирую хранимую процедуру в SQL Server ... И они работали в ASP.NET до недавнего времени.
ОБНОВЛЕНИЕ:
Точная ошибка, которую я получаю в компиляторе:
SqlException: "Нулевой или пустой полнотекстовый предикат" Класс: 15 ErrorCode: -2146232060