【问题标题】:query returns no record using CONTAINS() VSS asp.net使用 CONTAINS() VSS asp.net 查询不返回任何记录
【发布时间】:2018-02-09 06:25:58
【问题描述】:

我在使用 contains(transact-SQL) 返回记录时遇到问题。

此查询在使用静态值的 SQL 服务器查询窗口中具有结果

select * from archive_master where docgroupID=46 and( CONTAINS((docno,docname,accountno,accountName,tags,docyear,docmonth),'"1"')
   OR CONTAINS((docno,docname,accountno,accountName,tags,docyear,docmonth),'"*1"')
   OR CONTAINS((docno,docname,accountno,accountName,tags,docyear,docmonth),'"1*"')
   OR CONTAINS((docno,docname,accountno,accountName,tags,docyear,docmonth),'"*1*"')
   )

但是,如果我将查询放到 sqlcommand 并用参数替换静态值,它不会返回任何记录

这是我的代码:

string oconn = ConfigurationManager.ConnectionStrings["ARCHDB"].ConnectionString;
    using (SqlConnection empCon = new SqlConnection(oconn))
    {


        if (txtsearch.Text == "")
        {
            query = "select * from archive_master where docgroupID=@docgroupID";
         }
        else
        {
           query = @"select * from archive_master where docgroupID=@docgroupID and (CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '""@qry""') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), ""*@qry"")  OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), ""@qry*"")  OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), ""*@qry*""))";
        }


        using (SqlCommand emp_Cmd = new SqlCommand(query, empCon))
        {

            if (txtsearch.Text == "")
            {
                SqlParameter pdocgroupID = emp_Cmd.Parameters.Add("@docgroupID", SqlDbType.BigInt);
                pdocgroupID.Value = Request.QueryString["docgroupID"];
            }
            else
            {
                SqlParameter pdocgroupID = emp_Cmd.Parameters.Add("@docgroupID",SqlDbType.BigInt);
                SqlParameter pqry = emp_Cmd.Parameters.Add("@qry", SqlDbType.NVarChar);
                pdocgroupID.Value = Request.QueryString["docgroupID"];
                pqry.Value = txtsearch.Text;
            }



            emp_Cmd.CommandType = CommandType.Text;
            empCon.Open();

            SqlDataAdapter adpData = new SqlDataAdapter(emp_Cmd);
            DataTable dt = new DataTable();
            adpData.Fill(dt);


            GridDocgroup.DataSource = dt;
            GridDocgroup.DataBind();
            empCon.Close();




        }
    }

我对查询字符串的处理方法是否正确?其中@qry 和@docgroupID 是参数

  query = @"select * from archive_master where docgroupID=@docgroupID and (CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '""@qry""') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), ""*@qry"")  OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), ""@qry*"")  OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), ""*@qry*""))";

【问题讨论】:

  • 您能否尝试以下更改的查询并再次执行代码 "select * from archive_master where docgroupID=@docgroupID and (CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), ' "@qry"') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '"@qry"') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear , docmonth), '"@qry"') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '"@qry"'))"
  • 嗨,Kevin,如果这个词是准确的短语,这个查询将返回一个值,我正在尝试使用 * 通配符搜索部分短语(前缀和后缀)
  • 是的,我知道你已经在数据库上创建了全文索引
  • 在您的查询中,您需要将单引号 (') 放在 ""@qry"" 之前,就像您在同等服务器中执行的 sql 查询中看到的一样
  • query = @"select * from archive_master where docgroupID=@docgroupID and (CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '""@qry""') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '""@qry""') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '""@qry""') OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), '""@qry""'))" ;试过这个查询仍然没有记录。我认为星号没有在此处发表评论,因为它被视为文本格式。

标签: asp.net sqlcommand


【解决方案1】:

作为一种解决方法,我修改了查询并将通配符传递给参数值

  query = @"select * from archive_master where docgroupID=@docgroupID and (CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), @qry1) OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), @qry2)  OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), @qry3)  OR CONTAINS((docno, docname, accountno, accountName, tags, docyear, docmonth), @qry4))";

SqlParameter pdocgroupID = emp_Cmd.Parameters.Add("@docgroupID",SqlDbType.BigInt);
                    SqlParameter pqry1= emp_Cmd.Parameters.Add("@qry1", SqlDbType.NVarChar);
                    SqlParameter pqry2 = emp_Cmd.Parameters.Add("@qry2", SqlDbType.NVarChar);
                    SqlParameter pqry3 = emp_Cmd.Parameters.Add("@qry3", SqlDbType.NVarChar);
                    SqlParameter pqry4 = emp_Cmd.Parameters.Add("@qry4", SqlDbType.NVarChar);

                    pdocgroupID.Value = Request.QueryString["docgroupID"];
                    pqry1.Value =txtsearch.Text.Trim();
                    pqry2.Value = '"'+ txtsearch.Text.Trim()+"*"+'"';
                    pqry3.Value = '"'+"*" + txtsearch.Text.Trim() + "*"+'"';
                    pqry4.Value = '"'+"*" + txtsearch.Text.Trim()+'"';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多