2017-03-10 1 views
0

マイコード:構文エラーは、ユーザーコードによってunhandeledた

string MySQL = "INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, e-mail) "; 
MySQL += "VALUES ('" + Request.Form["username"] + "', '" + Request.Form["fname"] + "', '" + Request.Form["id"] + "', '" + Request.Form["age"] + "', '" + Request.Form["pass"] + "', '" + Request.Form["email"] + "');"; 
string strConnection = "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" + System.Web.HttpContext.Current.Server.MapPath(@"App_Data/RegisterDatabase.accdb"); 
System.Data.OleDb.OleDbConnection o_con = new System.Data.OleDb.OleDbConnection(strConnection); 
System.Data.OleDb.OleDbCommand o_command = new System.Data.OleDb.OleDbCommand(MySQL, o_con); 
o_con.Open(); 
o_command.ExecuteNonQuery(); 
o_con.Close(); 

私は取得しています

o_command.ExecuteNonQueryでINSERT INTOステートメント」で

構文エラー(); 、OleDbExceptionがユーザーコードで処理されていないことを確認してください。

ほとんどすべての画像があります: https://i.gyazo.com/d6c30ee3f9988d5d22793540aea98a6c.png

+0

IDが数字の場合は、アポストロフィを使用しないでください。 – Cristian

+1

パラメータ化されたクエリを使用してください。あなたのコードは[SQLインジェクション攻撃](https://www.owasp.org/index.php/SQL_Injection)に対して深刻な脆弱性を持っています。また、アポストロフィは必要ないので、バグを修復する可能性が最も高いです。 – Esko

+0

また、クエリでアクセスできますか? – Cristian

答えて

0

は、問題を発見:Accessでクエリを実行すると

それは私に同じエラーを与えたので、私は削除 - 電子メールで、それが働いていた「」を。

アクセスで作業するときは、フィールド名に特殊文字を使用しないでください。

+0

それは動作します!本当にありがとう。 – Taabkl

0
  1. パラメータ化されたSQLを使用します。値の文字列連結を使用して、値を持つSQL文を作成しないでください。なぜ誰かがアポストロフィーを自分の名前に含めるとすぐに、あなたのコードが失敗する(難しい)理由の1つです。また、Sql Serverのようなデータベースをターゲットにする必要がある場合は、SQLインジェクション攻撃に対して脆弱です。
  2. usingブロックに分割可能なタイプをラップして、例外の場合でもリソース(db接続の場合は)を確実に閉じます。
  3. 接続文字列をweb.configに格納し、名前で参照してください。正当な理由がない限り、コードでコードを構築しないでください。
  4. スコープAdo.Netインスタンスを必要とする場所に置いて、それらを破棄する(ブロックを使用して、ブロック)、後で共有接続を介して競合することや、 。
  5. パスワードに関するサイドノート:決してプレーンテキストとして保存しないでください。今まで! pbkdf2)のような安全なハッシングアルゴリズムを使用し、後で比較するハッシュを比較してください。

ここで主な問題は"INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, e-mail)、具体的にはe-mailです。 -文字が構文上の問題を引き起こさないようにするには、[]を使用して名前をエスケープして囲む必要があります。修正された文字列は次のようになります。ここでは

INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, [e-mail]) 

は、それらの変更内容とあなたのコードです。私はidとageの型を推測し、それらの型として渡しました。あなたが合うようにこれをさらに細かく調整してください。

string strConnection = System.Configuration.ConfigurationManager.ConnectionStrings["yourConnectionName"].ConnectionString; 
using (OleDbConnection con = new OleDbConnection(strConnection)) 
using (OleDbCommand cmd = new OleDbCommand()) 
{ 
    cmd.Connection = con; 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "INSERT INTO RegisterDatabase (uName, pName, idNumber, age, pass, [e-mail]) VALUES(?,?,?,?,?,?)"; 

    cmd.Parameters.Add(new OleDbParameter("@uName", OleDbType.VarChar)).Value = Request.Form["username"]; 
    cmd.Parameters.Add(new OleDbParameter("@pName", OleDbType.VarChar)).Value = Request.Form["fname"]; 
    cmd.Parameters.Add(new OleDbParameter("@idNumber", OleDbType.Int)).Value = int.Parse(Request.Form["id"]); 
    cmd.Parameters.Add(new OleDbParameter("@age", OleDbType.Int)).Value = int.Parse(Request.Form["age"]); 
    cmd.Parameters.Add(new OleDbParameter("@pass", OleDbType.VarChar)).Value = Request.Form["pass"]; 
    cmd.Parameters.Add(new OleDbParameter("@email", OleDbType.VarChar)).Value = Request.Form["email"]; 

    con.Open(); 
    cmd.ExecuteNonQuery(); 
} 
関連する問題