为什么此SQL搜索会出现此不兼容错误?

时间:2020-03-22 00:35:16

标签: sql-server vb.net sqlexception

当尝试使用SQL搜索特定名称时,我的项目中出现此错误。当我在文本框中输入名称并搜索时。

这是使用的代码:

    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 :(得分:0)

该消息非常明显。它必须具有表结构。列NameOfMov似乎是ntext(Unicode文本)。

电影的名称应该放在varcharnvarchar列中,所以我怀疑ntext在这里是不错的选择。

此处介绍了一些策略: SQL SERVER – Fix: Error : 402 The data types ntext and varchar are incompatible in the equal to operator

请注意,文本/ ntext已被弃用

重要!在将来的SQL Server版本中,将删除ntext,text和image数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max),varchar(max)和varbinary(max)。

来源:ntext, text, and image (Transact-SQL)

另一点无休止地重复:始终使用参数化查询。该代码不安全(SQL注入),并且会阻塞单引号等字符。这不是在2020年做到的方式。

答案 1 :(得分:0)

如果您无法按照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并不关心数据的使用方式或位置。