2

Accessデータベースを使用するプロジェクトに取り組んでいます。まず、必要な情報をdbからコピーして、DataTableに配置します(2つのテーブルを組み合わせて)。このデータテーブルでアイテムを検索します。GridViewを使用して行を更新、削除、追加すると、これらすべてがajax更新パネルで行われます。変更をデータベースに適用しようとすると問題が発生します。私がやりたいのは、DataTableの特定の行を取得し、それらを特定のテーブルの特定の行に更新/挿入/削除することです。重要なことは、データベーステーブルにはDataTableと同じ情報が含まれている必要があるということです。私がOledbDataAdapter.Updateをこのように使用できるかどうかは実際にはわかりません。

これが私が得る例外です:同時実行違反:UpdateCommandは予想される1レコードのうちの0に影響を与えました。

私のコード:

void load_dtTable()
{
    OleDbConnection bag = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\\Profiles\\StjBugraO\\Desktop\\data.accdb");

    DataTable dtResult = new DataTable();
    if (Session["dtResult"] != null)
    {
        dtResult = (DataTable)Session["dtResult"];
    }
    else
    {
        bag.Open();
        try
        {
            OleDbDataAdapter adtr = new OleDbDataAdapter("select gt.NodeID, gt.unit_num,gt.unit_name_text,gt2.ip_id ,gt2.server_name_text ,gt.call_flow_type  From gt inner join gt2 on gt.cm_id=gt2.cm_id", bag);
            dtResult.Clear();
            adtr.Fill(dtResult);
            adtr.Dispose();
            dtResult.Columns[0].ColumnName = "NodeID";
            dtResult.Columns[1].ColumnName = "Şube Kodu";
            dtResult.Columns[2].ColumnName = "Şube ADI";
            dtResult.Columns[3].ColumnName = "IP Adresi";
            dtResult.Columns[4].ColumnName = "Call Manager";
            dtResult.Columns[5].ColumnName = "Santral Tipi";
            foreach (DataRow dr in dtResult.Rows)
            {
                if ((string)dr[5] == "P")
                {
                    dr[5] = "PRI";
                }
                else if ((string)dr[5] == "A") dr[5] = "ANALOG";


            }

        }
        catch (Exception e)
        {




        }
        Session["dtResult"] = dtResult as DataTable;


            bag.Close();
    }



protected void Button3_Click(object sender, EventArgs e)
{
    DataTable dtResult = Session["dtResult"] as DataTable;
    //changing the names of the columns (that i need) to be the same with the db
    dtResult.Columns[0].ColumnName = "NodeID";
    dtResult.Columns[1].ColumnName = "unit_num";
    dtResult.Columns[2].ColumnName = "unit_name_text";
    dtResult.Columns[3].ColumnName = "ip_id";    
    dtResult.Columns[5].ColumnName = "call_flow_type";


    OleDbConnection bag = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\\Profiles\\StjBugraO\\Desktop\\data.accdb");
    OleDbDataAdapter adtr2 = new OleDbDataAdapter("select NodeID ,unit_num ,unit_name_text , ip_id , call_flow_type from gt", bag);
    OleDbCommandBuilder Ocmd = new OleDbCommandBuilder(adtr2);
    adtr2.DeleteCommand=Ocmd.GetDeleteCommand();
    adtr2.InsertCommand=Ocmd.GetInsertCommand();
    adtr2.UpdateCommand=Ocmd.GetUpdateCommand();
    DataTable dt = dtResult.GetChanges();
    int updates = 0;
    try
    {
        if(dt != null)
      updates=adtr2.Update(dtResult);
    }

    catch (Exception ex)
    {
        Label1.Text = ex.Message.ToString();
    }
    //changing them back

    dtResult.Columns[0].ColumnName = "NodeID";
    dtResult.Columns[1].ColumnName = "Şube Kodu";
    dtResult.Columns[2].ColumnName = "Şube ADI";
    dtResult.Columns[3].ColumnName = "IP Adresi";
    dtResult.Columns[4].ColumnName = "Call Manager";
    dtResult.Columns[5].ColumnName = "Santral Tipi";
    Label2.Text = updates + "changes applied.";
    adtr2.Dispose();
    bag.Close();





}
4

0 に答える 0