0

MS Access データベースにデータ行を挿入しようとしています。これを VS でデバッグすると、問題は発生しませんが、行は挿入されません。このクエリは、行を挿入していないことが判明しています。私の日付は文字列で、正しくフォーマットされています。パラメータ リストで 18 個の値を渡していますが、これを行うにはもっと簡単な方法が必要です。OleDb のパラメーターを使用する別の方法はありますか? 私は私の方法の下に投稿しました。私の構文が正しいかどうかを確認できますか? それでもうまくいきません。

情報を渡す場所は次のとおりです。

rowsAdded = ((DataAccessLayer)Application["dbAccess"]).insert("Employees", txtLname.Text, txtFname.Text, txtTitle.Text, txtCourt.Text,
        txtAddress.Text, txtCity.Text, txtCountry.Text, txtHomePhone.Text, txtExtension.Text, int.Parse(txtReports.Text), txtPassword.Text,
        txtPostalCode.Text, txtNotes.Text, txtRegion.Text, txtHireDate.Text, txtBday.Text, upPhoto.FileName.ToString());

ここで、このメソッドを使用してデータベースにクエリを実行します

public int insert(string tablename, string lname, string fname, string title, string toc, string address, string city,
    string country, string phone, string ext, int report, string pass, string postal, string notes, string region, 
    string hire, string birth, string photo)
{
    string tblName = tablename;
    string last = lname;
    string first = fname;
    string tlt = title;
    string tOfc = toc;
    string addy = address;
    string town = city;
    string reg = country;
    string phum = phone;
    string exten = ext;
    int rep = report;
    string pas = pass;
    string pc = postal;
    string note = notes;
    string regions = region;
    string hD = hire;
    string bD = birth;
    string pho = photo; 
    int rows = 0;
    int ID = 0;
    string insertString = "INSERT INTO @tablename ([EmployeeID],[LastName],[FirstName],[Title],[TitleOfCourtesy],[Address],[City]," +
    "[Country],[HomePhone],[Extension],[ReportsTo],[Password],[PostalCode],[Notes],[Region], [HireDate],[BirthDate],[Photo]) VALUES (" + 
    ID + ", @lname, @fname, @title, @toc, @addy, @city, @country," +
    "@phone, @ext, @report, @pass,  @postal, @notes,@region, @hire, @birth, @photo)";
    string queryLast = "Select @@Identity";      
    try
    {
        conn.Open();
        oleCommand = new OleDbCommand(insertString, conn);
        oleCommand.CommandText = queryLast;
        ID = (int)oleCommand.ExecuteScalar();

        oleCommand.Parameters.AddWithValue("@tablename", tblName);
        oleCommand.Parameters.AddWithValue("@lname", last);
        oleCommand.Parameters.AddWithValue("@fname", first);
        oleCommand.Parameters.AddWithValue("@title", tlt);
        oleCommand.Parameters.AddWithValue("@toc", tOfc);
        oleCommand.Parameters.AddWithValue("@addy", addy);
        oleCommand.Parameters.AddWithValue("@city", town);
        oleCommand.Parameters.AddWithValue("@country", reg);
        oleCommand.Parameters.AddWithValue("@phone", phum);
        oleCommand.Parameters.AddWithValue("@ext", exten);
        oleCommand.Parameters.AddWithValue("@report", rep);
        oleCommand.Parameters.AddWithValue("@pass", pas);
        oleCommand.Parameters.AddWithValue("@region", regions);
        oleCommand.Parameters.AddWithValue("@postal", pc);
        oleCommand.Parameters.AddWithValue("@notes", note);
        oleCommand.Parameters.AddWithValue("@hire", hD);
        oleCommand.Parameters.AddWithValue("@birth", bD);
        oleCommand.Parameters.AddWithValue("@photo", pho);
        oleCommand.ExecuteNonQuery();

        rows = (int)oleCommand.ExecuteNonQuery();

    }
    catch (Exception ex)
    {
        dbError = "Add Employee command Error: " + ex.Message;
    }
    finally
    {
        conn.Close();
    }
    return rows;
}
4

1 に答える 1

0

あなたのコードでは、 being で実行oleCommandしません。3 つの実行はすべて、 に等しいコマンド テキストで行われます。CommandTextinsertStringqueryLast

insertStringコンストラクターに渡したという事実は、OleDbCommand割り当てた後に何らかの形で記憶されるという意味ではありません

oleCommand.CommandText = queryLast;

この割り当てでは、何か他のものを割り当てるまでoleCommand忘れてinsertString、その中にあるものだけを実行します。CommandText

もう1つのこと:insertString間違っていなければ、SQLのパラメーター化はパラメーターとして指定されたテーブル名をサポートしていないため、実行すると例外がスローされる可能性があります。

EmployeeID 列が自動インクリメントされている場合は、挿入に含めないでください。繰り返しますが、手順をまっすぐにする必要があります。

  1. insertString を使用してコマンドを作成し、

  2. パラメータを指定し、

  3. 挿入を実行し、

  4. queryLast を CommandText に割り当て、

  5. を実行して最後の ID を取得します。

于 2012-11-22T20:41:09.743 に答える