Запустите SQL-запрос с функцией в VB.NET - PullRequest
1 голос
/ 11 декабря 2019

Я создаю веб-сайт с использованием vb.net и пытаюсь заполнить CheckBoxList названиями фильмов. Пользователь будет вводить заголовок фильма, а я буду использовать функцию для поиска 10 самых близких названий фильмов. Функция использует алгоритм расстояния Лененштейна, который сравнивает две строки и возвращает, сколько разных символов нужно поменять местами, чтобы сделать их одной строкой. Пример: searchValue = "Interstellar" по сравнению с результатом "Золушка" 5 изменений символа, чтобы они соответствовали.

Я хочу вернуть результирующий набор и вставить movie_title в текст списка флажков и movieID в значении.

Мой код vb.net, который я использую для выполнения этого запроса:

    Dim con As New SqlConnection("MyConnectionString")
    Dim dtMovieSearchResults As New DataTable


    Dim daSearchDiff As New SqlDataAdapter("SELECT TOP 10 *, [dbo].[FN_Levenshtein_Distance](movie_title, @searchValue) diff FROM ML_Movie ORDER BY diff", con)

    With daSearchDiff.SelectCommand.Parameters
        .Clear()
        .AddWithValue("@searchValue", Convert.ToString(txtSearchMovie.Text))
    End With
    Try
        If ConnectionState.Closed Then con.Open()
        daSearchDiff.Fill(dtMovieSearchResults)

        With cblFoundMovies
            .DataSource = dtMovieSearchResults
            .DataTextField = "movie_title"
            .DataValueField = "movie_id"
            .DataBind()
        End With
    Catch ex As Exception
        Response.Write(ex.Message)
    Finally
        con.Close()
    End Try

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

Я не нашел конкретного решения для этого онлайн, и я надеюсь, что кто-то здесь может помочь

1 Ответ

0 голосов
/ 11 декабря 2019

Я немного прибавил, добавив Using ... End Используя блоки для закрытия и удаления соединений и команд. Мне пришлось угадать тип данных и размер поля, поэтому проверьте базу данных и добавьте фактический тип и размер.

Я действительно не вижу проблем с вашим кодом, так как запрос выполняется в SSMS. Я удалил «Попробовать ... Конец». Попробуйте временно, чтобы вы могли точно видеть, где разрывы.

Private Sub OpCode()
    Dim dtMovieSearchResults As New DataTable
    Using con As New SqlConnection("MyConnectionString"),
            cmd As New SqlCommand("SELECT TOP 10 *, [dbo].[FN_Levenshtein_Distance](movie_title, @searchValue) diff FROM ML_Movie ORDER BY diff", con)
        cmd.Parameters.Add("@searchValue", SqlDbType.VarChar, 200).Value = txtSearchMovie.Text
        con.Open()
        dtMovieSearchResults.Load(cmd.ExecuteReader)
    End Using
    With cblFoundMovies
        .DataSource = dtMovieSearchResults
        .DataTextField = "movie_title"
        .DataValueField = "movie_id"
        .DataBind()
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...