2012-05-05 5 views
2
namespace DB1 
{ 
    public partial class Form1 : Form 
    { 
     private void button1_Click(object sender, EventArgs e) 
     { 
      String query="INSERT INTO Student 
      VALUES("+textBox1.Text+"','"+textBox2.Text+"','"+textBox3.Text+"', 
      '"+textBox4.Text+")"; 

      OleDbConnection conn = new 
      OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; 
      Data Source=C:\\Database11.accdb"); 
      OleDbCommand cmd = new OleDbCommand(query,conn); 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      MessageBox.Show("data stored succesfully"); 
      conn.Close(); 
      textBox1.Text = (Convert.ToInt32(textBox1.Text) + 1).ToString(); 
      textBox2.Text = (Convert.ToInt32(textBox2.Text) + 1).ToString(); 
      textBox3.Text = (Convert.ToInt32(textBox3.Text) + 1).ToString(); 
      textBox4.Text = (Convert.ToInt32(textBox4.Text) + 1).ToString(); 
      textBox1.Focus(); 

     } 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      autonum(); 
     } 

     private void autonum() 
     { 
      string query; 

      query = "Select max(Stdno) from student"; 
      OleDbConnection conn = new  
      OleDbConnection("Provider=Micrsoft.ACE.OLEDB.12.0; 
      Data Source=datasource"); 
      OleDbCommand cmd = new OleDbCommand(query,conn); 
      conn.Open(); 
      try 
      { 
      OleDbDataReader dr =cmd.ExecuteReader(); 
       if(dr.Read()) 
       { 
        textBox1.Text = (Convert.ToInt32(dr[0])+1).ToString(); 
       } 
       else 
       { 
        textBox1.Text="1001"; 
       } 

       dr.Close(); 
      } 
     catch(Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
       textBox1.Text = "1001"; 
      } 
      conn.Close(); 
     } 
    } 
} 

エラーがある:エラーデータベースにコピーしながら

OLEDB例外は、クエリ 式で未処理の構文エラー(欠落演算子)であった '2'、 'WSE'、 '22'、 'assd'。

+0

ここでは* 2件のクエリを指定しました。なぜですか?たぶん彼らのうちの1人だけが失敗しているでしょう。 *どこに*失敗しているかを示してください。さらに、あなたのコードは現在SQLインジェクション攻撃に対して脆弱です。パラメータ化されたSQLを使用してください。 –

+0

フォーマットが面倒なコードで、少なくともエラーについてのすべてを書いておきます。質問を書いてください。多分誰でもあなたを助けようとします。 – Reniuz

+0

質問は、C#を使用してms acessデータベースに学生の情報を格納することです、エラーはcmdです。ExceuteNonQuery – user1376361

答えて

0

これは非常に基本的な標準エラーの1つで、これは常に彼らが何をしているのか分からない人のためです。

問題は、テキスト文字列の文字列をSQL文字列に置き換える方法です。

最初にエラーがあります。生成するSQLを調べると、そのことを知る必要があります。

...Student VALUES("+textBox1.Text+"'... 

これは "「最初の前に欠けている、申し訳ありませんテキストとして。BLABLAは

違法sqlです
VALUES(BLABLA' 

になります。代わりにここに来るの

あなたがちょうど持っていたはずですデバッガで簡単に実行できるクエリー変数の値を見てください。あなたが作成していると思うSQLを形成していないことがわかります。

テキストボックスには「あなたは文字通り運命にある」という文字が含まれています。これはそれを表現する良い方法です(これを感じるモデレーターは不適切です)。テキストボックスを操作して任意のSQLを挿入することができます。これはSQLインジェクション攻撃と呼ばれます。それを読んで(Googleのキーワードとして「SQL Injection」)、それを修正してパラメータを使用してください。常に。あなたがそれをすると、安全なSQLコードを書く方法がわからないため、いくつかのプロジェクトグループで解雇されます。

5

文字列concetanationを使用してクエリを作成しないでください。代わりに使うパラメータ:

string query = "INSERT INTO Student VALUES (@P1, @P2, @P3, @P4)"; 
// ... 
cmd.Parameters.Add(new OleDbParameter("@P1", textBox1.Text)); 
cmd.Parameters.Add(new OleDbParameter("@P2", textBox2.Text)); 
cmd.Parameters.Add(new OleDbParameter("@P3", textBox3.Text)); 
cmd.Parameters.Add(new OleDbParameter("@P4", textBox4.Text)); 

私もお勧め:

  • は、明示的にあなたのINSERT文で列をリストします。
  • テキストボックスにわかりやすい名前を使用します。
+0

新しいクエリの外観を表示するように編集していますか? –

+0

@Jon Skeet:そうです。 –

+0

クラッキング:私はそう思っています:) –

2

私は、常にパラメータを使用しなければならないという考え方から、データベースを開いたままにしています。 例えば、

sql = "SELECT * FROM tablename WHERE column='" + var _+"'"; 

になることができ

SELECT * FROM tablename WHERE column='';SELECT 'i can hack you if you do this' 

パラメータが起きてからこれを防ぎます。

+0

+1は、SQLインジェクションの様子を示す例です。 – Dabblernl

関連する問題