为什么SQL查询仅在从VS运行但不在外部运行时有效

时间:2014-06-24 14:00:00

标签: c# asp.net sql visual-studio-2012

我有一个搜索文本框和一个提交按钮,用户可以在其中输入名称并点击按钮以获得结果。我遇到的唯一问题是当我从VS运行网站时,查询会返回结果,但是当我将网站设置为Web服务时 并使用localhost链接外部的链接访问它,它不起作用(显示Failed: Not not found in Database)。

我的localhost链接适用于搜索查询:http://localhost:53647/PDFFormsNew/searchcreate.aspx(通过VS运行)

我在VS以外访问的IIS链接不适用于搜索查询:http://devserver-svr-dev:85/searchcreate.aspx

知道它为什么会导致它以及如何解决它?

我包含了正在执行查询的代码片段:

string cString = "Data Source=svr-db;Initial Catalog=test-db;User Id=myusr;Password=p@$$w0rd;";
protected void btnValidateName_Click(object sender, EventArgs e)
{
    this.sqlQuery();
}
public void sqlQuery()
{
    tc.Text = "HERE";
    Conn = new SqlConnection(cString);
    Conn.Open();

    //nameE = '%'+txtName.Text+'%';
    nameE = '%' + RemoveSpecialCharacters(txtName.Text) + '%';
    sqlCode = "SELECT * FROM [test-db].[dbo].[TablePDFTest] WHERE [name] LIKE @name"; //allow user to enter partial

    using (SqlCommand command = new SqlCommand(sqlCode, Conn))
    {
        //command.CommandType = CommandType.Text;
        command.Parameters.AddWithValue("name", nameE);

        using (reader = command.ExecuteReader())
        {

            if (reader.HasRows)
            {
                rptContent.DataSource = reader;
                rptContent.DataBind();
                lblIsValid.Text = "Success: Name found in Database";
                lblIsValid.ForeColor = System.Drawing.ColorTranslator.FromHtml("#009900");
                //btnGeneratePDF.Visible = true;
            }
            if (!reader.HasRows)
            {
                rptContent.DataSource = null;
                rptContent.DataSourceID = null;
                rptContent.DataBind();
                lblIsValid.Text = "Failed: Name not found in Database";
                lblIsValid.ForeColor = System.Drawing.ColorTranslator.FromHtml("#990000");
                //btnGeneratePDF.Visible = false;
            }
        }
    }

    Conn.Close();
}

public static string RemoveSpecialCharacters(string str)
{
    StringBuilder sb = new StringBuilder();
    foreach (char c in str)
    {
        if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '.')
        {
            sb.Append(c);
        }
    }
    return sb.ToString();
}

1 个答案:

答案 0 :(得分:1)

问题是您为参数传递了无效字符串。

声明为"SELECT * FROM [test-db].[dbo].[TablePDFTest] WHERE [name] LIKE @name",您传递

command.Parameters.AddWithValue("name", nameE);

但应该

command.Parameters.AddWithValue("@name", nameE);

PS。

您不应该在SQL查询中使用*,您应该只询问您真正要消耗的字段。同样,您也不会使用任何您应该使用count(*)的数据。使用count你应该能够获得一些性能。