0

基本的に、いくつかの値をデータベースに保存したいと考えています。 誰か が私を助けてくれますか?
というエラーが表示され続けます。:) 私は全体にちょっと慣れていないので、何が起こっているのか本当にわかりません。 以下は使用しているコードです。"Number of query values and destination fields are not the same."dr = cmd.ExecuteReader();



public partial class Registeration_experiment : System.Web.UI.Page
{
    static OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\New folder\Project 1.0\WebSite1\New Microsoft Office Access 2007 Database.accdb");
    OleDbDataAdapter ada = new OleDbDataAdapter();
    OleDbCommand cmd = new OleDbCommand();
    OleDbDataReader dr;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        string str = "insert into Registeration_Test (Name1, address, emailaddress)" +
          "values (?, ?, ?)";
        con.Open();
        cmd = new OleDbCommand(str, con);
        cmd.Parameters.AddWithValue("@p1", TextBox1.Text);
        cmd.Parameters.AddWithValue("@p2", TextBox2.Text);
        cmd.Parameters.AddWithValue("@p4", TextBox4.Text);
        cmd.ExecuteNonQuery(); 
    }
}

ありがとうございました :)

4

1 に答える 1

3

データベースから読み取るのではなく、データベースに書き込みます。
ExecuteReader を使用する意味はありません。そのためには ExecuteNonQuery が必要です

EDIT テーブルの構造を見てみましょう。5つのフィールドで構成されています。
この場合、2 つの選択肢があります。挿入ステートメントで更新するフィールドの名前を指定するか、すべてのフィールドにパラメーターを追加します

最初の選択肢は、フィールドの名前を付けないことです (ID を除くすべてのフィールドにパラメーターを渡します。これは、データベースがそのフィールドの値を自分自身で管理することを意味する AutoIncrement フィールドであると思われるためです)。

// No name provided for fields, need to pass a parameter for each field
string str = "insert into Registeration_Test values (?, ?, ?, ?)";
con.Open();
cmd = new OleDbCommand(str, con);
cmd.Parameters.AddWithValue("@p1", Textbox1.Text);
cmd.Parameters.AddWithValue("@p2", Textbox2.Text);
cmd.Parameters.AddWithValue("@p3", Textbox3.Text);
cmd.Parameters.AddWithValue("@p4", Textbox4.Text);
cmd.ExecuteNonQuery();

(注、TextBox1 ...などは、上記の例で提供した名前です。ユーザーがデータベースに挿入するデータを入力するこれらのテキストボックスの正確な内容はわかりません。それらは実際にページ/フォームに存在します)

2 番目の選択肢は、データベースで更新する必要があるフィールドを宣言することです

// Just three named fields updated
string str = "insert into Registeration_Test (Name1, address, emailaddress)" + 
             "values (?, ?, ?)";
con.Open();
cmd = new OleDbCommand(str, con);
cmd.Parameters.AddWithValue("@p1", Textbox1.Text);
cmd.Parameters.AddWithValue("@p2", Textbox2.Text);
cmd.Parameters.AddWithValue("@p4", Textbox4.Text);
cmd.ExecuteNonQuery();

また、文字列連結を使用しないように SQL コマンドを変更したことにも注意してください。
これは、多くの問題につながる非常に悪い習慣です。最悪の 1 つは SQL インジェクションです。テキストに一重引用符やその他の問題のある文字が含まれている場合の文字列解析の問題は言うまでもありません。

?パラメーター プレースホルダーは、コマンド テキスト内で(OleDb では) によって表されます。このプレースホルダーは、OleDbCommand のパラメーター コレクションに追加された実際の値に置き換えられます (プレースホルダーが表示される正確な順序で)。パラメーター (パラメーター化されたクエリ) を使用すると、フレームワークは渡された値を調べて、これらの値が無効な場合に適切なアクションを実行できます。

EDIT 接続に関する問題は、接続を開いたままにしていた前のコマンドから発生します。これは別の悪い習慣です。すべての接続は、作成、オープン、使用、クローズする必要があります。従うべき擬似コードはこれです

// Create the connection
using(OleDbConnection con = GetOleDbConnection())
{
    con.Open();

    ... // use the connection with insert/delete/update/select commands

}
// Exiting from the using block close and destroy (dispose) the connection
于 2013-03-29T11:55:22.877 に答える