Command.ExecuteNonQuery();错误:' ='附近的语法不正确

时间:2015-10-24 20:25:08

标签: c# asp.net sql-server-2008 executereader

我的查询非常完美(我已在SQL Server Management Studio中验证过它)。我的代码很完美,但我仍然遇到这种语法错误:

  

' ='附近的语法不正确。描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.Data.SqlClient.SqlException:' ='附近的语法不正确。

public partial class Temporaryche : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ddlTDept.Items.Clear();
        ddlTBranch.Items.Clear();

        string connectionString = GlobalVariables.databasePath;
        SqlConnection sqlCon = new SqlConnection(connectionString);
        string query = "select fac.fac_name, dp.dp_name, br.br_name from STUDENT s, DIVISON dv, BRANCH br, DEPT dp, FACULTY fac, CLASS cls, DEGREE dg where dg.dg_id = cls.dg_id and cls.cls_id = s.cls_id and fac.fac_id = dp.fac_id and dp.dp_id = br.dp_id and br.br_id = dv.br_id and s.dv_id = dv.dv_id and s.prn_no = " + txtSearch.Text;

        sqlCon.Open();
        SqlCommand cmd = new SqlCommand(query, sqlCon);
        SqlDataReader reader = cmd.ExecuteReader();

        string facultyName = reader.GetValue(0).ToString();
        string deptName = reader.GetValue(1).ToString();
        string branchName = reader.GetValue(2).ToString();

        ddlTFaculty.SelectedValue = facultyName;

        query = "select dp_name from DEPT where fac_id=(select fac_id where fac_name='" + facultyName + "')";
        cmd = new SqlCommand(query, sqlCon);
        reader = cmd.ExecuteReader();
        ddlTDept.Items.Clear();

        while (reader.Read())
        {
            ddlTDept.Items.Add(reader.GetValue(0).ToString());
        }

        ddlTDept.SelectedValue = deptName;
        sqlCon.Close();
    }
}

2 个答案:

答案 0 :(得分:4)

您的代码中没有任何ExecuteNonQuery,因此可能出现语法错误的唯一一点是

query = @"select dp_name from DEPT 
         where fac_id=(select fac_id where fac_name='" + facultyName + "')";

在这一行中你错过了子查询中的FROM,所以你应该写为

query = @"select dp_name 
          from DEPT 
          where fac_id= (select fac_id 
                         FROM DEPT where fac_name= '" + facultyName + "')";

当然这只是解决您的问题,但正如其他人所说,您应该立即开始使用参数化查询。

例如

query = @"SELECT dp_name FROM DEPT 
          wHERE fac_id = (SELECT TOP 1 fac_id 
                          FROM DEPT 
                          WHERE fac_name=@faculty";
cmd = new SqlCommand(query, sqlCon);
cmd.Parameters.Add("@faculty", SqlDbType.NVarChar).Value = facultyName;
....

修改
我应该重写我的第一个陈述。还有另外一点可能发生语法错误。如果txtSearch.Text为空,则位于第一行 在这种情况下,查询仍然不完整并触发语法错误 这可能是因为当文本框中仍然没有任何内容时,在Page_Load事件中调用代码。因此,如果txtSearch为空

,我们可能应该添加一些内容以防止执行整个代码块
protected void Page_Load(object sender, EventArgs e)
{
    if(!string.IsNullOrWhiteSpace(txtSearch.Text))
    {
        .... code that executes the queries ...
    }
}

总而言之,这些代码并不适合Page_Load事件,当用户要求执行搜索时,可能会将此代码移动到按钮点击事件....

最后,如评论中所述,您应该使用JOIN语法来更好地将WHERE条件与表之间的关系区分开来。 查询可以写成

SELECT  fac.fac_name,
        dp.dp_name,
        br.br_name 
FROM    STUDENT s INNER JOIN DIVISION dv ON s.dv_id = dv.dv_id
        INNER JOIN BRANCH br ON dv.br_id = br.br_id
        INNER JOIN DEPT dp ON br.dp_id = dp.dp_id
        INNER JOIN FACULTY fac ON dp.fac_id = fac.fac_id
        INNER JOIN CLASS cls ON s.cls_id = cls.cls_id
        INNER JOIN DEGREE dg ON cls.dg_id = dg.dg_id
WHERE   s.prn_no=@search";

答案 1 :(得分:1)

你没有提到发生错误的行很难100%确定,还缺少其他一些信息。但是,在第一个SQL文本中,最后有以下内容:

s.prn_no=" + txtSearch.Text;

因为那是文本,所以它应该在引号''

s.prn_no='" + txtSearch.Text +"'"

那说你不应该因为SQL Injection而建立这样的SQl查询。相反,您应该使用Parameter objects代替。