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

Sql server 为什么此SQL搜索会出现此不兼容错误?,sql-server,vb.net,sqlexception,Sql Server,Vb.net,Sqlexception,尝试使用SQL搜索特定名称时,我的项目中出现此错误。当我在文本框中键入名称并搜索时 这是使用的代码: da = New SqlDataAdapter("select * From MovTable where NameOfMov = '" & NameSearchTB.Text & "'", sqlcon) da.Fill(MovieSearchdt) MovTable是SQLDataTable NameOfMov是我正在搜索的专栏 这是尝试搜索后出现的错误:

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

这是使用的代码:

    da = New SqlDataAdapter("select * From MovTable where NameOfMov = '" & NameSearchTB.Text & "'", sqlcon)
    da.Fill(MovieSearchdt)
MovTable是SQLDataTable NameOfMov是我正在搜索的专栏

这是尝试搜索后出现的错误:


System.Data.SqlClient.SqlException:“数据类型ntext和varchar在等于运算符中不兼容。”

消息相当明显。它必须与表结构相匹配。列
NameOfMov
似乎是
ntext
(Unicode文本)

电影的名称应该放在
varchar
nvarchar
列中,因此我怀疑
ntext
是否是一个好的选择

以下介绍了一些策略:

请注意,text/ntext已被弃用:

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

资料来源:


另一点不断重复:始终使用参数化查询。这段代码是不安全的(SQL注入),会被单引号之类的字符阻塞。这不是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也不关心数据的使用方式和位置。

我建议您找到一个设计良好的数据库,用于您的实践,直到您有足够的经验来设计自己的数据库。尝试MS示例数据库