C#中的动态数据库绑定
我这里有一个项目,该项目连接到生产数据库并获取表和视图。我继承的代码通过SqlConnection通过用户提供的凭据及其提供的数据库位置连接到SQL Server数据库。当需要数据时,它将使用连接和SQL字符串创建SqlDataAdapter,并填充全新的DataSet。然后,在处理完该数据后,将这些数据显示出来,用适当的显示名称替换表列名称之类的东西。
问题是,整个过程很慢,而且锦上添花的是,它在ListViews中显示了大量数据,这与获得一万行数据并不友好。出于设计原因,我们不会将页面分成几个页面,而是有一个搜索控件,并且我可以花大力气实现一个虚拟ListView,以简单地回到原来的位置。我只是认为这是我连接到数据库并显示记录的ListViews的错误应用程序。听起来像是DataGridView的工作。
可悲的是,它根本行不通。我试图将DataGridView绑定到通过DataBinder从连接代码中获得的数据集,但是当我启动它以查看数据位于DataSet中时,DataGridView完全为空。
但是,如果我在测试数据库上使用GUI绑定,则以当前数据库模式和我的凭据为准,请看一下它是否有效。但是我不能使用这些东西,因为它不够灵活,我不想在每次更新数据库时都必须更改的代码中定义架构,并且需要访问连接字符串,并且似乎没有从它创建的TableAdapter中获得该信息。
我是否在这里缺少一些简单的方法来使我的DataSet / BindingSource解决方案正常工作?我在吠错树吗?
还是值得摆弄绑定吗?我所看到的所有绑定内容似乎都可以让我达到90%的方式,但是后来我无法按照我想要的方式修改连接字符串或者对特定的列进行排序,而且似乎希望我给它提供一个已定义的模式一旦数据库更改,它就会中断,而手写代码至少是经过防御的设计并且相当灵活。我没有削减功能,并且如果我不得不放弃一些要求才能使它正常工作,那么慢速解决方案就已经可以了,我们将处理我们已有的工作。
解决方案
我不确定我们是不能完全更改查询还是仅在我们发布末尾提到的情况下不能更改查询。
但是我建议如果可能的话,实现某种分页,并且只检索数据用户所在的特定页面的行。这将在性能上产生巨大的差异,尤其是在结果集与我们说的一样大的情况下。我认为这可能是最大的性能提升更改。并且我们可以保留当前工作的listview实现。此外,即使我们有一个用自己的查询填充的网格,我们仍将需要某种分页策略,否则它也会很慢。
我只是随机获取了有关实施的文章,但我们可以找到许多其他文章。
编辑:关于我们更新的问题,我的回答的重点是,如果它还没有损坏,请不要修复它。如果列表视图现在可以正常工作,为什么要对其进行更改?
在设计器中打开数据集,单击适配器,并将连接更改为public(默认为内部),然后可以访问它
至于其余的问题,请向我们展示datagridview上的codez数据绑定可以正常工作AFAIK ...
只要我们指定了表名(否则将使用IIRC第一个表),它就可以正常工作。当然,可以通过将适当的DataTable(而不是DataSet)提供给DGV来简化事情。
我们可能还需要检查DGV上是否启用了自动列生成。但是绑定到临时的DataTable可以很好地工作;我一直在使用它作为示例等。