C#编程,频繁的访问数据库,对吗?

蜗牛学编程 2020-06-23 11:18:29
各位老师好,小弟目前正在自学C#,有些疑惑,想请问一下:
我在用datagridview作为数据库窗口,每次修改时,先把数据录入数据库,然后再次连接数据库对datagridview进行刷新,获取最新的data。
目前没有问题。但总感觉好像不对劲,这样是不是对数据库访问太频繁了?
基本上每次筛选、增删查该时和增删查改后都要访问,一个操作访问两次。
我这样的逻辑会有问题吗?
...全文
2349 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wilson1966 2020-06-29
  • 打赏
  • 举报
回复
哈,你跟我当年学程序时的心情好像。 当年很菜,程序一天有上百次连SERVER,那时心里想,这样SERVER 会受的了吗? 其实SERVER 的设计目的就是每秒可承受上百次的联机,所以,你不用怕
jhonsonzhang 2020-06-29
  • 打赏
  • 举报
回复
引用 24 楼 hanxing1983 的回复:
[quote=引用 22 楼 jhonsonzhang 的回复:] 当然不对,刷新就是错的。入门的基本数据操作勉强会了以后,您得开始有绑定的概念,数据绑定以后就不存在这种困惑了。绑定的方法和类型很多,您多看看微软文档,多实践,慢慢就能理解了。
您好。请问一下,我在datagridview界面修改完数据库,不刷新,如何能让dgv的数据也能实时显示最新数据?[/quote] 我就明白初学者就是在这里卡住了,都是这样过来的,切实解决您的困惑。您开始看看数据绑定的微软文档,我不给您代码,您自己根据文档去写。应该很快掌握。不光是数据显示控件(datagridview等),数据绑定和绑定是无处不在的,现在的移动端和APP以及wvc等开发都是应用很多的。
蜗牛学编程 2020-06-28
  • 打赏
  • 举报
回复
引用 22 楼 jhonsonzhang 的回复:
当然不对,刷新就是错的。入门的基本数据操作勉强会了以后,您得开始有绑定的概念,数据绑定以后就不存在这种困惑了。绑定的方法和类型很多,您多看看微软文档,多实践,慢慢就能理解了。
您好。请问一下,我在datagridview界面修改完数据库,不刷新,如何能让dgv的数据也能实时显示最新数据?
  • 打赏
  • 举报
回复
我想要强调的一点工程理念是,实际上我们要承认按层次来封装架构的逻辑上的合理性。我们固然可以总是推倒重来,但是什么时候是个头呢?真正好的系统在设计上是“自然而然地”扩展的,而不是结构化地动不动就推倒重来的。在我们访问数据时可以频繁地调用 api 去访问数据,不用担心底下的优化问题,这就是架构的力量。而不是推倒 api 设计理念、否定原来的查询 api 的实用性。
jhonsonzhang 2020-06-28
  • 打赏
  • 举报
回复
当然不对,刷新就是错的。入门的基本数据操作勉强会了以后,您得开始有绑定的概念,数据绑定以后就不存在这种困惑了。绑定的方法和类型很多,您多看看微软文档,多实践,慢慢就能理解了。
全栈极简 2020-06-27
  • 打赏
  • 举报
回复
对,访问数据库操作是及其耗费资源的,而且比较慢。有一个原则,就是尽可能少的访问数据库。
华芸智森 2020-06-27
  • 打赏
  • 举报
回复
以前,我是用SQLITE内存数据库做中介。前台的表单读出时,同时写一份到SQLITE。以后所有的操作都是针对SQLITE内存库。提交时,就将这个内存库读出回写到SQLSERVER数据库。
SoulRed 2020-06-26
  • 打赏
  • 举报
回复
没问题的,你要是不想这么频繁,就全部缓存到内存,在内存里操作数据,但是万一断电,数据就可能损坏
蜗牛学编程 2020-06-25
  • 打赏
  • 举报
回复
学习了,谢谢大神们的指点,收益良多。有些受限于本人目前能力,尚不能深切理解,一定努力学习。 因为公司电脑原因,目前我的数据库只能用access来作,之前是担心每次增删查改都要访问数据库,修改时再访问一次,最后刷新显示又访问一次,相当于double。之前以为是本人的逻辑有问题,目前来看是没什么大问题的,那我就放心了,哈哈。继续按这思路去编程。 再次感谢各位大神们的指点。
  • 打赏
  • 举报
回复
甚至可能有的地方在1分钟内就要重复使用10次 --> 甚至可能有的地方在1秒钟内就要重复使用10次
  • 打赏
  • 举报
回复
你可以看到,不仅仅是“读取x系统的敏感词库”这类需求,就是“读取y这个员工的个人信息”,“读取z这个地图的某个图片”等等,任何你认为可能需要高性能、重复访问的信息,都有一个“Model 层”和“API”的设计问题,都不是满脑子“只有增删改查”能解释的。
  • 打赏
  • 举报
回复
举个例子,假设我们要为网络应用 x 保存其“敏感词库”内容,这可能是几万个甚至十几万个敏感词的一个数组,而且读取下来时还得进行“倒排索引”操作产生来花一定时间特殊索引。我们发现一旦读取到程序中,可能一小时内要重复使用上万次,甚至可能有的地方在1分钟内就要重复使用10次,使用频率和间隔时间是不定的,但是肯定比较频繁。而远程服务器上保存了各个应用的自己的“敏感词库”,并不是经常更新的。每一个词库的内容可能都比较巨大。那么我们就可以把读取敏感词库的任务封装为一个方法,例如
public 敏感词库 GetDic(string appName)
{
var cache = HttpRuntime.Cache;
var key = $"敏感词文件_应用_{appName}";
Chars = (敏感词库)cache[key];
if (Chars == null)
{
string datas = 从后台下载敏感词库定义文本(appName);
var words = datas.Split('|');
Chars = 敏感词库.生成倒排索引字典(words);
cache.Insert(key, Chars, new CacheDependency(fileName),Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5));
}
return Chars;
}


这里,首先检查本地缓存,如果已经有了数据就直接返回缓存结果。如果没有,则从远程服务器读取文本,在本地产生词库数据结构,放入缓存,并且设置缓存参数,当 fileName 这个文件修改时会自动删除缓存,或者是最后一次访问本地缓存之后5分钟后自动过期(删除缓存)。

缓存是设计任何高效、高性能程序的基础概念,是高级api设计的一层。“增上改查”是初级的一层。
八爻老骥 2020-06-25
  • 打赏
  • 举报
回复
频繁访问数据库也没什么不可以,当然前提是确保你的数据库在复杂度和数量增长不大以及响应要求不是很高的情况,简单的数据结构,少量的数据,数据库一般都能毫秒级的响应,所以此时大量的访问数据库操作在程序界面上也不会有太多的感觉。不过,这不是个好习惯,如果查询返回的数据较多,查询语句也比较复杂,这对应用程序来说将是个灾难,基本上是鼠标一点就卡半天。
wanghui0380 2020-06-24
  • 打赏
  • 举报
回复
如楼上所说,单机系统,一个人用。 正常是 公用数据源,修改,提交,成功不管。失败回退到原始 多机系统,多人并发。需要刷新,因为你还要展示别人的
嗦粉爱放醋 2020-06-24
  • 打赏
  • 举报
回复
我觉得你可以在数据库中多建立几个触发器,这样你只需要关注某几张表的信息变动,相关表的更新会由数据库自动更新
闭包客 2020-06-24
  • 打赏
  • 举报
回复
“感觉不对劲”是一种直觉,它是没有什么标准的,虽然有的时候直觉也很准,但是直觉是不可靠的,你应该去验证它。 你应该思考一下,对数据库的访问频率是多少才算频繁呢?如果对数据库的访问太频繁,会造成什么后果呢? 你也可以模拟一下高并发的场景,看一下这种你感觉频繁的数据库操作,会不会造成不良的影响。
  • 打赏
  • 举报
回复
比如说你的程序稍微复杂一点,进行信息系统采集、运算、多个工作流处理等等步骤。可能对于某些稍微复杂一点的处理,你发现前边20秒钟已经处理过,后边又被处理一遍。假设不同人写的组件集成到这个处理流程中,同样的重复处理过程还会重复,严重影响了系统效率。那么许多人的做法就是把程序推倒重来,重新写程序。真的很有闲功夫。

但是更好的做法是将数据原地放入自动缓存(同时它也就会自动在合适的时机去自动销毁缓存),分配一个 key 来取用缓存结果,这样对原来系统的代码改动就只有千分之一,运行效率提高几十几百倍。

这就依赖于一个软件工程知识就能真正解决问题。
  • 打赏
  • 举报
回复
“频繁访问数据库”从技术上说没有问题,从设计上说这只是因为没有提高设计封装水准造成的困扰,也不是关系数据库访问技术上存在什么“问题”。

从设计上说,设计一套 api 给其它人使用,应该脱离开“增删改查”而要写一套规范的“业务api”接口。这个接口的实现中由你来封装高速缓存机制,调用者是不关心有没有缓存、用没用数据库、用了什么数据库、用多少数据库系统,还有没有其它各种类型服务需要依赖的问题。也就是说,那是一个“很自然的提高框架封装”的问题,就好像一个人上完小学要上初中,不能懒得上学。
冰思雨 2020-06-24
  • 打赏
  • 举报
回复
没有问题。小项目,用户少,这么做就足够了,目前这种开发模式,没啥毛病,最多就是数据库要采用连接池,避免每次操作都要新建连接。
正怒月神 2020-06-24
  • 打赏
  • 举报
回复
如果你非常不喜欢这种“一次操作”访问两次数据库的方式。 那么你试试看SqlDataAdapter的Update方法。
加载更多回复(6)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧