Почему при поиске SQL возникает ошибка несовместимости? - PullRequest
0 голосов
/ 22 марта 2020

У меня возникла ошибка в моем проекте при попытке поиска с использованием SQL для указанного c имени. Когда я набираю имя в текстовом поле и выполняю поиск.

Используемый код:

    da = New SqlDataAdapter("select * From MovTable where NameOfMov = '" & NameSearchTB.Text & "'", sqlcon)
    da.Fill(MovieSearchdt)

MovTable - это SQLDataTable NameOfMov - это столбец, в котором я ищу.

Это ошибка, которая появляется после попытки поиска:

System.Data.SqlClient.SqlException: 'Типы данных ntext и varchar несовместимы в операторе равных оператору.'

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

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

Вы всегда должны использовать параметры , чтобы избежать внедрения Sql .

Private Function GetMovieData(NameToSearch As String) As DataTable
    Dim dt As New DataTable
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand("select * From MovTable where NameOfMov = @Name;", cn)
        cmd.Parameters.Add("@Name", SqlDbType.NText).Value = NameToSearch
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    Return dt
End Function

Использование:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt = GetMovieData(NameSearchTB.Text)
    DataGridView1.DataSource = dt
End Sub

Это отделяет код интерфейса пользователя от кода доступа к данным. Кнопка ничего не знает о том, откуда поступают данные, а GetMovieDate не имеет отношения к тому, как и где используются данные.

0 голосов
/ 22 марта 2020

Сообщение довольно очевидно. Это связано со структурой таблицы. Столбец NameOfMov выглядит как ntext (текст Unicode).

Имя mov ie должно помещаться в столбец varchar или nvarchar, поэтому я сомневаюсь, что ntext хороший выбор здесь.

Некоторые стратегии описаны здесь: SQL SERVER - Исправлено: Ошибка: 402 Типы данных ntext и varchar несовместимы в операторе равенства

Обратите внимание, что текст / ntext устарел :

ВАЖНО! Типы данных ntext, text и image будут удалены в следующей версии SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте модифицировать приложения, которые их используют в настоящее время. Вместо этого используйте nvarchar (max), varchar (max) и varbinary (max).

Источник: ntext, текст и изображение (Transact- SQL)

Другой пункт повторяется бесконечно: всегда используйте параметризованные запросы . Этот код небезопасен (SQL инъекции) и будет подавлять символы, такие как одинарные кавычки. Это не способ сделать это в 2020 году.

...