如何使用Windows窗体在数据库上执行基本CRUD?

时间:2011-08-30 17:49:05

标签: c# .net winforms data-access-layer

我已广泛使用.Net框架用于后端进程和网页,但我从未需要使用Windows窗体。我使用Windows表单类型技术的唯一经验是Delphi 6& 7。

我搜索了教程,因为它们似乎对我要找的东西来说太基础了。或者它似乎不适合我想要做的事情。

我想在表单(我已经设法做)上有一个网格显示(为此我一直在使用DataGridView),以便用户可以查看,过滤和搜索数据。其他的事情,如分页也会涉及但我认为我可以找出如何为自己做这件事。

我遇到的所有示例都使用DataGridView进行编辑,添加和删除。我对用户使用网格的想法感到不舒服。这似乎令人困惑,而且可能非常容易出错。

我想有按钮来添加,编辑和删除各种类型的数据。因此,例如,如果我有一个表单来管理客户,我希望能够选择要编辑的行并单击按钮。这应该打开一个新的窗体表格,其中所有数据都预装在文本框,单选按钮,复选框和下拉列表等中。

如果他们点击添加,他们将转到与编辑相同的屏幕,除了所有信息都是空白。如果他们选择一行并单击删除,则会删除该客户并将其从DataGridView中删除。

我尝试了一些控件和数据绑定选项似乎从表中获取所有行。我怎样才能从数据库中获取我感兴趣的行。我不确定这里有什么最佳实践。

我现在正遭受信息过载的困扰,并且会感谢有人指出我正确的方向。

编辑:

我应该提一下,从我的Delphi时代起,我希望能够设置类似查询或SqlCommand(拖放gui)并设置其SQL属性,或者稍微参数化SQL。在表单上拖放数据源。将数据源指向SqlQuery / SqlCommand,然后单击命令上的activate。现在,我可以将组件拖放到表单上,并将其数据源属性设置为它们引用的字段。

2 个答案:

答案 0 :(得分:2)

看看this sample。它显示了与WinForm控件(不仅仅是DataGridView)的基本ADO.NET绑定。

答案 1 :(得分:1)

你可以通过多种方式实现这一目标。并且有许多框架可以提供帮助。实体框架,NHiberbnate。

但是在较低级别,您可以使用与数据库相关的对象。 SqlConnection,SqlCommand,DataReader。下面是加载行的SQL-Server相关示例。

private IList<IPosition> PositionsLoad(SqlConnection connection, PositionsRequest request)
{

    SqlCommand cmd = new SqlCommand();
    cmd.Connection = connection;
    cmd.CommandText = "select * from mytable WHERE x ";
    cmd.CommandType = CommandType.Text;

    //Get the reader
    SqlDataReader reader = cmd.ExecuteReader;
    IList<IPosition> ret = new List<IPosition>();

    if (reader.HasRows()) {
        //Create our converter to convert DataReader into a business object/s
        DataReaderToPosition readerConvert = new DataReaderToPosition();
        //loop rows
        while (reader.Read) {
            IPosition pos = readerConvert.DataReaderToBusinessObject(reader);
            ret.Add(pos);
        }
    }

    reader.Close();
    return ret;

}

使用datareader:

Public Overrides Function DataReaderToBusinessObject(ByVal reader As System.Data.IDataReader) As IPosition

    Dim res As IPosition = New Position

    res.ItemDate = reader.GetDateTime(reader.GetOrdinal("Date"))
    res.Strategy = reader.GetString(reader.GetOrdinal("Strategy"))
    res.SubStrategy = reader.GetString(reader.GetOrdinal("SubStrategy"))
    res.BrokerPrime = reader.GetString(reader.GetOrdinal("BrokerPrime"))
    res.BrokerExecuting = reader.GetString(reader.GetOrdinal("BrokerExecuting"))
    res.AccountName = reader.GetString(reader.GetOrdinal("AccountName"))
    res.ExpectedLoss = reader.GetDouble(reader.GetOrdinal("Expected_Loss"))
    res.RiskNotional = reader.GetDouble(reader.GetOrdinal("Risk_Notional"))
    res.ModelDelta = reader.GetDouble(reader.GetOrdinal("Model_Delta"))
    res.ExpectedTrancheLoss = reader.GetDouble(reader.GetOrdinal("Expected_Tranche_Loss"))
    res.BaseCorrelation = reader.GetDouble(reader.GetOrdinal("Base_Correlation"))
    res.LossOnSingleNameDefault = reader.GetDouble(reader.GetOrdinal("Loss_on_Single_Name_Default"))
    res.RiskCapitalAllocation = reader.GetDouble(reader.GetOrdinal("Risk_Capital_Allocation"))
    res.MarginFundingAllocation = reader.GetDouble(reader.GetOrdinal("Margin_Funding_Allocation"))
    res.DataSource = reader.GetString(reader.GetOrdinal("DataSource"))

    Return res
End Function