【问题标题】:Using wildcards with Parameters in vb.net ADO在 vb.net ADO 中使用带参数的通配符
【发布时间】:2016-02-08 14:03:11
【问题描述】:

我有以下代码,作为我的程序的一部分可以正常工作:

.CommandText = .CommandText & " and [Name] = ?"

然后我使用以下方法添加参数:

.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, Name.Text))

这很好用,但我真的想搜索包含 Name.Text 中的值的所有内容。我搜索了几十篇说可以执行以下操作的文章,但即使有明确的数据匹配,它也总是返回 0 个结果:

.CommandText = .CommandText & " and [Name] like '%' + ? + '%'"
.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, Name.Text))

我现在尝试了下面的建议,但记录集仍然返回 0 个结果:

.CommandText = .CommandText & " and [Name] like ?"
.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, "%" + Name.Text + "%"))

我正在使用 Microsoft Visual Studio 2015,使用 ADODB 在 vb.net 中编写以连接到 SQL Server 2014 实例。

CodingGorilla 建议的 SQL 跟踪揭示了以下 SQL 在运行时运行。我不知道为什么它不起作用!

exec sp_executesql N'SELECT * FROM qFormsAndName Where [FormType] Like ''R1%'' and [Name] like @P1 ORDER BY [CurrentStatus], [DateReceived];',N'@P1 char(100)','%JONES%

有人可以帮忙吗?

【问题讨论】:

  • 好的,我已经为任何偶然发现这个问题的人解决了这个问题。您会看到,在我的 .parameters.append 中,我将“默认”文本长度设置为 100。这适用于“= Param”查询(出于某种原因),但不适用于 Like 查询,因为该参数在文本。 Like % P1 % 其中 P1 是一个参数,它跟踪为 Like "%JONES %"

标签: sql vb.net parameters ado


【解决方案1】:

我会尝试稍微改变一下:

.CommandText = .CommandText & " and [Name] like ?"
.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, "%" + Name.Text + "%"))

这应该可以工作,尽管它不能直接回答为什么您的代码版本不起作用。

【讨论】:

  • 这也不起作用。我在文本框中输入了名称“JONES”,我的数据库中有“EWAN JONES”和“CHARLOTTE JONES”等记录,但记录集仍然显示 0 个结果。如果我更改为 = 并删除 %'s,我必须在文本框中输入“EWAN JONES”,但它确实返回了正确的记录。
  • CodingGorilla,我的选择查询是从视图中选择,而不是从表中选择,这有关系吗?它只是一个用于预定义连接的视图。完整的 SQL 内容如下:“SELECT * FROM qFormsAndName Where [FormType] Like 'R1%' and [Name] like ? ORDER BY [CurrentStatus], [DateReceived];”
  • 它应该适用于视图表。你能看到它通过 SQL Profiler 运行的最终查询吗?
  • CodingGorilla,对不起,伙计,我该怎么做?它是 Visual Studio 工具还是 MSSQL 工具?
  • 我想我已经解决了。开始跟踪,现在我要运行所有三个品种的代码。
【解决方案2】:

作为对原始问题的评论回答,但对于任何看到这个的人来说,文本长度应该是参数文本的长度,所以: .Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, 100, tbName.Text))

到: .Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, tbName.TextLength, tbName.Text))

或:

.Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adChar, ADODB.ParameterDirectionEnum.adParamInput, len(tbName.Text), tbName.Text))

【讨论】:

    【解决方案3】:

    与其根据输入自定义参数定义,不如只切换到更合适的varchar数据类型,它指定一个可变长度的字符串,而不是char,它指定一个固定长度的字符串:

    .CommandText = .CommandText & " and [Name] like ?"
    .Parameters.Append(SearchCom.CreateParameter("@Name", ADODB.DataTypeEnum.adVarChar, _
        ADODB.ParameterDirectionEnum.adParamInput, 100, "%" + Name.Text + "%"))
    

    (另外,如果您真的如您在问题中所述,使用 VB.Net、VS 2015 和 SQL Server 2014,我强烈建议您切换到使用 ADO.Net 而不是旧 ADO,它可以追溯到到 2000 年左右)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 2014-12-03
      相关资源
      最近更新 更多