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

C# Command.ExecuteNonQuery();错误:靠近'的语法不正确=';,c#,asp.net,sql-server-2008,executereader,C#,Asp.net,Sql Server 2008,Executereader,我的查询是完美的(我已经在SQLServerManagementStudio中进行了验证)。我的代码是完美的,但我仍然遇到以下语法错误: “=”附近的语法不正确。描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。异常详细信息:System.Data.SqlClient.SqlException:靠近“=”的语法不正确 你没有提到发生错误的那一行,所以很难100%确定,还有一些其他信息丢失了。但是,在第一个SQL文本中,结尾有以下内容: s

我的查询是完美的(我已经在SQLServerManagementStudio中进行了验证)。我的代码是完美的,但我仍然遇到以下语法错误:

“=”附近的语法不正确。描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。异常详细信息:System.Data.SqlClient.SqlException:靠近“=”的语法不正确


你没有提到发生错误的那一行,所以很难100%确定,还有一些其他信息丢失了。但是,在第一个SQL文本中,结尾有以下内容:

s.prn_no=" + txtSearch.Text;
因为这是文本,所以应该在引号中“


这意味着您永远不应该像这样构建SQl查询,因为。您应该改为使用。

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

s.prn_no=" + txtSearch.Text;
因为这是文本,所以应该在引号中“


这意味着您永远不应该像这样构建SQl查询,因为。相反,您应该改为使用。

您的代码中没有任何ExecuteOnQuery,因此唯一可能出现语法错误的地方就是这一行

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\u Load
事件中调用代码。因此,如果
txtSearch
为空,我们可能应该添加一些内容来阻止整个代码块的执行

protected void Page_Load(object sender, EventArgs e)
{
    if(!string.IsNullOrWhiteSpace(txtSearch.Text))
    {
        .... code that executes the queries ...
    }
}
总而言之,这段代码不适合
页面加载
事件,当用户要求执行搜索时,可能应该将这段代码移到按钮单击事件中

最后,如注释中所述,您应该使用连接语法更好地从表之间的关系中划分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";

您的代码中没有任何ExecuteOnQuery,因此可能发生语法错误的唯一点是这一行

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\u Load
事件中调用代码。因此,如果
txtSearch
为空,我们可能应该添加一些内容来阻止整个代码块的执行

protected void Page_Load(object sender, EventArgs e)
{
    if(!string.IsNullOrWhiteSpace(txtSearch.Text))
    {
        .... code that executes the queries ...
    }
}
总而言之,这段代码不适合
页面加载
事件,当用户要求执行搜索时,可能应该将这段代码移到按钮单击事件中

最后,如注释中所述,您应该使用连接语法更好地从表之间的关系中划分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";

我的错误如下:“=”附近的语法不正确。描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。异常详细信息:System.Data.SqlClient.SqlException:靠近“=”的语法不正确。您应该使用SQL参数,而不是将facultyName内联到SQL查询中。否则,您很容易受到SQL注入攻击。-在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用是不鼓励的。DHMM,对不起@marc_s,但是您能告诉我您如何为这个查询连接syntex=“从学生s、分区dv、分支br、系dp、教员fac、班级cls、学位dg中选择fac.fac_名称、dp.dp_名称、br.br_名称,其中dg.dg_id=cls.dg_id和cls.cls_id=s.cls_id和fac.fac_id=dp.fac_id和dp.dp_id=br.dp_id和br.br_id=dv.br_id和s.dv_id=dv.dv_id和s.prn_编号=“+txtSearch.Text;它将类似于
SELECT。。。。。从s.cld_id=cls.cls_id上的学生内部联接类cls…
等等-使用
内部联接
左侧外部联接
和ANSI SQL标准中定义的其他联接类型,并在联接行的右侧定义联接条件。我的错误如下:“=”附近的语法不正确。描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。异常详细信息:System.Data.SqlClient.SqlException:靠近“=”的语法不正确。您应该使用SQL参数,而不是将facultyName内联到SQL查询中。否则,您很容易受到SQL注入攻击。-在ANSI-92 SQL标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,它的使用是不鼓励的。DHMM,对不起@marc_s,但是您能告诉我您如何为这个查询连接syntex=“从学生s、部门dv、分支br、部门dp、教员fac、班级cls、学位dg whe中选择fac.fac_名称、dp.dp_名称、br.br_名称。”