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' の構文エラー (演算子がありません)。

4

3 に答える 3

5

クエリの作成に文字列連結を使用しないでください。代わりにパラメーターを使用します。

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));

私もお勧めします:

  • 挿入ステートメントで列を明示的にリストします。
  • テキスト ボックスにはわかりやすい名前を使用してください。
于 2012-05-05T06:43:09.460 に答える
2

常にパラメーターを使用する必要があるという考えに同意します。それ以外の場合は、データベースを開いたままにします。例えば、

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

になることができる

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

パラメータはこれを防ぎます。

于 2012-05-05T07:06:36.800 に答える
0

これは、常に何をしているのかわからない、非常に基本的な標準エラーの人々の1人であるため、私はあなたに賛成しました。

あなたの問題は、テキストボックスの文字列を SQL 文字列に入れる方法です。

まず、エラーがあります。生成した SQL を見ると、それがわかります。

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

最初の " の前に ' がありません。申し訳ありません。テキストが BLABLA に変わると、

VALUES(BLABLA'

これは違法なSQLです。

ここに来る代わりに、割り当てた後にクエリ変数の値を確認するだけで済みます。デバッガーで簡単に実行でき、作成していると思われる SQL を作成していないことがわかります。

第二に、あなたのテキスト ボックスに ' が含まれている場合、あなたは文字通り運命にあると言えます。テキスト ボックスを操作することで任意の任意の SQL を挿入できます。これは SQL インジェクション攻撃と呼ばれます。それを読んで(Googleのキーワードとして「SQLインジェクション」)、修正してパラメーターを使用します。いつも。あなたのやり方は、安全な SQL コードを書く方法を知らないという理由で、いくつかのプロジェクト グループで解雇されます。

于 2012-05-05T06:42:14.560 に答える