【问题标题】:Why does this SQL search give this incompatibility error?为什么这个 SQL 搜索会给出这个不兼容错误?
【发布时间】:2020-03-22 00:35:16
【问题描述】:

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

这是使用的代码:

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

MovTable 是 SQLDataTable NameOfMov 是我正在搜索的列。

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

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

【问题讨论】:

  • 我建议您找到一个设计良好的数据库来进行练习,直到您有足够的经验来设计自己的数据库。试用 MS 示例数据库World Wide Importers

标签: sql-server vb.net sqlexception


【解决方案1】:

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

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

这里描述了一些策略: SQL SERVER – Fix: Error : 402 The data types ntext and varchar are incompatible in the equal to operator

请注意,text/ntext 已被弃用

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多