C# 每一个操作数据库的方法都需要重新开启和关闭数据库连接吗?

桃花影落 2016-10-25 11:11:10
我是新手,C#刚接触1个多月...
现在是负责一个配置终端软件的数据库部分,就是给各个界面写数据库操作的方法;
现在的需求是数据库关闭或断开连接是要有提醒并且退出软件(因为这软件没有数据库什么都做不了),我之前的做法是:

public void DBTest1()//基本上所有的方法都是这样
{
using (SqlConnection connection = new SqlConnection(strConn))
{
connection.Open();
try
{
//增删改查的事务操作
}
catch (Exception)
{
//Message.Show(error);
}
}
}

先问一下这样写是否正确?有什么弊端?
还有这样写断开数据库服务时,程序会卡死,我现在也在想解决办法。
目前的想法是在程序登录账号前先连接数据库,一直连接,等到程序关闭时退出(这里这样做会不会有问题)
然后每个方法都判断连接状态,方法结束后释放资源。这样是否可行?
或有什么更好的方法?

晚辈才疏学浅,边工作边学C#一个月多,连prop都用不明白,目前只是用一点点C++和Java的思想在编C#。。。
还望各位前辈多多教诲!
如果可以的话,请多多指点!
...全文
2268 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
drifter2002 2016-10-26
  • 打赏
  • 举报
回复
长连接没有意义。因为访问组件会自动维护连接池。
白衣如花 2016-10-25
  • 打赏
  • 举报
回复
引用 6 楼 u011763975 的回复:
哦,我之前是短连接,我看他们用using的时候理解错了,using(){}连接池会自动释放资源(.Dispose()),我理解成了会close,然后就把原来写的connection.close()都删了…… 恩。。把connection做成全局,这个要怎样做呢? 每次进来判断是否处于连接状态再操作是不是将代码包含在 if (connection.State == ConnectionState.Connecting) { } 里
是的,包含在判断里面,如果非连接状态,再进行其他处理(重连接,报错等)
john_QQ:2335298917 2016-10-25
  • 打赏
  • 举报
回复
用一个全局连接就可以
桃花影落 2016-10-25
  • 打赏
  • 举报
回复
引用 5 楼 zhi_ai_yaya 的回复:
[quote=引用 3 楼 u011763975 的回复:] [quote=引用 2 楼 zhi_ai_yaya 的回复:] 你原来的代码是常用的写法,没有问题的。 只是你所谓的需求有点奇葩,数据库是需要的时候才尝试连接并打开的,既然是远程,那就存在偶尔连接不上的情况,所以改造一下原来的代码,在catch里面,提示连接数据库失败即可,软件不操作不就行了嘛。
我们的产品是硬件,这个软件的作用就是将很多硬件的资源信息存入数据库中,所以对数据库的操作频繁,而且必须在数据库连接状态下使用,所以。。额。 我原来的代码catch里是有弹窗错误信息和提示的。但是这样当数据库服务停止时软件会因为超时连接不上而卡死,现在主要是把这个问题解决了,怎么办呢? [/quote] 把数据库连接放在全局变量(可一直占用该连接,但是使用时必须先检查是否可用并open,即检查conn.state)。使用一个中间队列作为缓冲,弄成【硬件资源信息-缓冲队列-数据库】。硬件资源信息不断的写入缓冲队列,在另外一个线程,定时把队列数据存入数据库,这样在数据库服务繁忙时,也有一定的缓冲时间使得程序不至于立即崩溃。 存在的问题是,缓冲队列的数据结构设计,还有互斥入队、出队操作(直接使用线程安全的队列即可),以及队列容量爆炸问题,在数据库一直不可用的时候,就要停止程序了。[/quote] 我是用的事务(SqlTransaction sqlTran = connection.BeginTransaction()),我的理解是事务就像线程一样。应该会保证操作不冲突吧。而且我们一个数据库只有这一个软件操作(配置终端只有一个),不存在很多账号同时配置的情况
桃花影落 2016-10-25
  • 打赏
  • 举报
回复
引用 4 楼 u012948520 的回复:
我也一直用的短连接,但是你代码有点不明白 短连接的话,connection没有close 长连接的话,又是每次new一个connection 如果要做短连接,要在catch后面加一个finally,用于close 如果要做长连接,把connection做成全局,每次进来判断是否处于连接状态再操作
哦,我之前是短连接,我看他们用using的时候理解错了,using(){}连接池会自动释放资源(.Dispose()),我理解成了会close,然后就把原来写的connection.close()都删了…… 恩。。把connection做成全局,这个要怎样做呢? 每次进来判断是否处于连接状态再操作是不是将代码包含在 if (connection.State == ConnectionState.Connecting) { } 里
我叫小菜菜 2016-10-25
  • 打赏
  • 举报
回复
引用 3 楼 u011763975 的回复:
[quote=引用 2 楼 zhi_ai_yaya 的回复:] 你原来的代码是常用的写法,没有问题的。 只是你所谓的需求有点奇葩,数据库是需要的时候才尝试连接并打开的,既然是远程,那就存在偶尔连接不上的情况,所以改造一下原来的代码,在catch里面,提示连接数据库失败即可,软件不操作不就行了嘛。
我们的产品是硬件,这个软件的作用就是将很多硬件的资源信息存入数据库中,所以对数据库的操作频繁,而且必须在数据库连接状态下使用,所以。。额。 我原来的代码catch里是有弹窗错误信息和提示的。但是这样当数据库服务停止时软件会因为超时连接不上而卡死,现在主要是把这个问题解决了,怎么办呢? [/quote] 把数据库连接放在全局变量(可一直占用该连接,但是使用时必须先检查是否可用并open,即检查conn.state)。使用一个中间队列作为缓冲,弄成【硬件资源信息-缓冲队列-数据库】。硬件资源信息不断的写入缓冲队列,在另外一个线程,定时把队列数据存入数据库,这样在数据库服务繁忙时,也有一定的缓冲时间使得程序不至于立即崩溃。 存在的问题是,缓冲队列的数据结构设计,还有互斥入队、出队操作(直接使用线程安全的队列即可),以及队列容量爆炸问题,在数据库一直不可用的时候,就要停止程序了。
白衣如花 2016-10-25
  • 打赏
  • 举报
回复
我也一直用的短连接,但是你代码有点不明白 短连接的话,connection没有close 长连接的话,又是每次new一个connection 如果要做短连接,要在catch后面加一个finally,用于close 如果要做长连接,把connection做成全局,每次进来判断是否处于连接状态再操作
桃花影落 2016-10-25
  • 打赏
  • 举报
回复
引用 2 楼 zhi_ai_yaya 的回复:
你原来的代码是常用的写法,没有问题的。 只是你所谓的需求有点奇葩,数据库是需要的时候才尝试连接并打开的,既然是远程,那就存在偶尔连接不上的情况,所以改造一下原来的代码,在catch里面,提示连接数据库失败即可,软件不操作不就行了嘛。
我们的产品是硬件,这个软件的作用就是将很多硬件的资源信息存入数据库中,所以对数据库的操作频繁,而且必须在数据库连接状态下使用,所以。。额。 我原来的代码catch里是有弹窗错误信息和提示的。但是这样当数据库服务停止时软件会因为超时连接不上而卡死,现在主要是把这个问题解决了,怎么办呢?
我叫小菜菜 2016-10-25
  • 打赏
  • 举报
回复
你原来的代码是常用的写法,没有问题的。 只是你所谓的需求有点奇葩,数据库是需要的时候才尝试连接并打开的,既然是远程,那就存在偶尔连接不上的情况,所以改造一下原来的代码,在catch里面,提示连接数据库失败即可,软件不操作不就行了嘛。
桃花影落 2016-10-25
  • 打赏
  • 举报
回复
第一次发帖,有不规范的地方,多多谅解
mjp1234airen4385 2016-10-25
  • 打赏
  • 举报
回复
如果在整过程序里只有这一个写库的操作,而且所有的写库操作都是由这个模块完成的(不存在多用户情况)。 你可以使用要给长连接,一直连着数据库,有数据就写入。
我叫小菜菜 2016-10-25
  • 打赏
  • 举报
回复
引用 7 楼 u011763975 的回复:
我是用的事务(SqlTransaction sqlTran = connection.BeginTransaction()),我的理解是事务就像线程一样。应该会保证操作不冲突吧。而且我们一个数据库只有这一个软件操作(配置终端只有一个),不存在很多账号同时配置的情况
事务只是保证互斥,即数据一致性。比如转账,A转账1000块给B,则【1.A账号要减少1000块,2.B账户要增加1000块】这里1和2是同时成功或者同时失败的,是一个事务,保证不会A账号减少1000了,但是B没有入账,OK? 事务,与是否同时运行多个终端程序没有关系。
qq_31070989 2016-10-25
  • 打赏
  • 举报
回复
做个类文件 使用数据库的时候就调用 类文件里写打开关闭 我就是这样做
桃花影落 2016-10-25
  • 打赏
  • 举报
回复
引用 8 楼 johnliuyuan 的回复:
用一个全局连接就可以
请问如何将连接作为全局连接呢 就是把SqlConnection connection = new SqlConnection(strConn)写在class里就可以了?
正怒月神 2016-10-25
  • 打赏
  • 举报
回复
finally中判断数据库链接状态,并弹框提醒
闭包客 2016-10-25
  • 打赏
  • 举报
回复
SqlConnection 是默认使用连接池的。 也就是在你 using 语句的结束时,连接不会关闭,只是把状态标记为空闲,等待其他操作使用。 如果你的程序有大量并发,你还可以设置连接池的最小值。 比如你设置了连接池最小值是100,这样在你第一次使用连接的时候,程序就会为你打开 100 个连接,放在连接池里供你挥霍。

110,552

社区成员

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

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

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