0

私のクエリは完璧です (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();
    }
}
4

2 に答える 2

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";
于 2015-10-24T20:36:07.420 に答える
1

エラーが発生している行については言及していないため、100%確実であることが難しく、他の情報も欠落しています。ただし、最初の SQL テキストでは、最後に次のようになります。

s.prn_no=" + txtSearch.Text;

これはテキストなので、引用符で囲む必要があります ''

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

つまり、 SQL インジェクションが原因で、このような SQL クエリを作成してはいけません。代わりに、代わりにParameter オブジェクトを使用する必要があります。

于 2015-10-24T20:33:36.803 に答える