我的查询非常完美(我已在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();
}
}
答案 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代替。