2

3 層アーキテクチャを使用してデータベースを更新する c# で datagridview を編集する方法。私はこの 3 層の概念に慣れていないので、誰かがコード サンプルを共有できますか。

4

1 に答える 1

0

少し長いですが、試してみます=)

データを DataGridView に取り込む以外に追加のロジックがない場合、ロジック レイヤー関数は単にデータ レイヤー関数を呼び出します。
このサンプルでは、​​2 つの dgv を持つフォームがあり、1 つは注文の詳細 (読み取り専用) 用で、2 つ目は特定の注文の明細用です。この dgv では、製品用の ComboBox と、保存用の 1 つのボタンを追加します。

フォームの読み込み時に、この単純な関数を呼び出します。

    private void setOrderGridView()
    {
        BindingSource orderSrc = new BindingSource(logic.GetOrderDetailsDS(FrmOrder.currentOrderID), "tblOrders");
        dgvOrdrdtls.DataSource = orderSrc;

        var src = logic.GetProductTable();
        BindingSource detailSrc = new BindingSource(orderSrc, "orderdetails");
        dgvLines.DataSource = detailSrc;

        DataGridViewComboBoxColumn pr = new DataGridViewComboBoxColumn();
        pr.HeaderText = "Product";
        pr.Name = "product";
        pr.DataSource = src;
        pr.ValueMember = "pdctId";
        pr.DisplayMember = "prdctDsc";
        pr.DataPropertyName = "ordrPrdctid";

        dgvLines.Columns.Add(pr);

    }

以下に関数が表示されます.これはすべてGetOrderDetailsDS(..)dgvGetProductTable()
をロードするためのものです. DGV の入力または編集が終了したら, funcをbtnSave_Click(..)呼び出します.SaveChanges()

DALコードをハレ。

public class DALimp : iDAL
{
    string connStr;
    SqlConnection conn;
    SqlCommand cmd;        
    DataSet ds;
    SqlDataAdapter da;

    public DALimp()
    {
        connStr = ConfigurationManager.ConnectionStrings["StoreDBConnectionString"].ConnectionString;
        conn = new SqlConnection(connStr);

    }

    public DataSet GetOrderDetailsDS(int oId)
    {
        var select = "SELECT * FROM tblOrders WHERE orderId='"+oId+"'";
        ds = new DataSet();
        cmd = new SqlCommand(select, conn);

        try
        {
            conn.Open();
            ds.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges, "tblOrders");
        }
        catch (Exception ex)
        { throw ex;  }
        finally
        { conn.Close();  }

        return ds;
    }
    public DataTable GetProductTable()
    {
        cmd = new SqlCommand("SELECT * FROM tblProducts", conn);
        da = new SqlDataAdapter("SELECT * FROM tblorderLines", conn);
        da.InsertCommand = new SqlCommand("INSERT INTO tblorderLines (ordrNumid,ordrPrdctid,ordrQuantity) Values(@oid,@pid,@qnt)", conn);
        da.InsertCommand.Parameters.Add("@oid", SqlDbType.Int, 0, "ordrNumid");
        da.InsertCommand.Parameters.Add("@pid", SqlDbType.Int, 0, "ordrPrdctid");
        da.InsertCommand.Parameters.Add("@qnt", SqlDbType.SmallInt, 0, "ordrQuantity");

        try
        {
            conn.Open();
            ds.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges, "tblProducts");
            da.Fill(ds, "tblorderLines");
            ds.Relations.Add("orderdetails", ds.Tables["tblOrders"].Columns["orderId"], ds.Tables["tblorderLines"].Columns["ordrNumid"], false);
        }
        catch (Exception ex)
        { throw ex;   }
        finally
        { conn.Close();  }

        return ds.Tables["tblProducts"];
    }

    public bool SaveChanges()
    {
        try
        {
            if (ds.Tables["tblorderLines"].GetChanges() == null)
                return false;

             var update = "UPDATE tblorderLines SET ordrNumid= @oni, ordrPrdctid= @opi, ordrQuantity= @oq WHERE ordritmId= @oii";
            var cmd = new SqlCommand(update, conn);

            cmd.Parameters.Add("@oni", SqlDbType.Int, 4, "ordrNumid");
            cmd.Parameters.Add("@opi", SqlDbType.Int, 4, "ordrPrdctid");
            cmd.Parameters.Add("@oq", SqlDbType.SmallInt, 2, "ordrQuantity");
            cmd.Parameters.Add("@oii", SqlDbType.BigInt, 8, "ordritmId").SourceVersion = DataRowVersion.Original;

            da.UpdateCommand = cmd;

            da.Update(ds, "tblorderLines");
            return true;
        }
        catch (Exception ex)
        { throw ex; }
    }
}

私が助けて、私の英語でごめんなさい=)

注: PresentationLayer 内のテーブル、セル、またはリレーションの名前を表示したくない場合は、必要に応じて関数を追加します。

于 2013-05-07T19:36:25.273 に答える