请教c#中using的正确使用方法操作数据库

xiehuangda 2020-06-25 04:49:43
请教c#中using的正确使用方法操作数据库
c#中创建一个类Conn 设置cn为private 这是规定好的,cn不能改为public

class Conn
{
private static string cn = "Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=abc123";
public static SqlConnection rs = new SqlConnection(cn);
}


创建一个窗体Form1 在Form1_Load中写入3个例子的代码。使用using(..){..} 来操作数据库。

//例子1
try
{
string sql = "Select * From tTable Where tID='1'";
SqlCommand cmd = new SqlCommand(sql, Conn.rs);
Conn.rs.Open();
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
this.Text = dr["LoginTitle"].ToString();
dr.Close();
cmd.Clone();
}
catch (Exception er)
{
MessageBox.Show(er.Message);
}
finally
{
Conn.rs.Close();
}


//例子2
try
{
string sql = "Select * From tTable Where tID='1'";
using (SqlCommand cmd = new SqlCommand(sql, Conn.rs))
{
Conn.rs.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
dr.Read();
this.Text = dr["LoginTitle"].ToString();
dr.Close();
}
cmd.Clone();
}
}
catch (Exception er)
{
MessageBox.Show(er.Message);
}
finally
{
Conn.rs.Close();
}


//例子3
try
{
string sql = "Select * From tTable Where tID='1'";
using (SqlCommand cmd = new SqlCommand(sql, Conn.rs))
{
Conn.rs.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
dr.Read();
this.Text = dr["LoginTitle"].ToString();
dr.Close();
}
cmd.Clone();
Conn.rs.Close();
}
}
catch (Exception er)
{
MessageBox.Show(er.Message);
}


请教using的正确使用方法是哪个例子?才算正确操作数据库。
或者,大家有更好的方法正确写using吗?帮忙写出来指正一下。
谢谢大家!
...全文
8119 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧歌ing 2020-06-28
  • 打赏
  • 举报
回复
using就是对一个对象进行生命周期的管理,一个对象从开始到结束都在using中完成,不需要手动去关闭而已,GC会自动回收using完的对象
全栈极简 2020-06-27
  • 打赏
  • 举报
回复
使用using(...)里面的对象就不需要显式的调用Close或者Dispose方法了(using会自动调用)。
exception92 2020-06-27
  • 打赏
  • 举报
回复
using不是用来操作数据库的,是用来管理数据库对象的生命周期。参见:
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/using-statement
八爻老骥 2020-06-25
  • 打赏
  • 举报
回复
using就是一个语法糖,让你少写两行代码。using里的实例会在花括号结束的地方自动调用close而已。
  • 打赏
  • 举报
回复
你写的任何一个代码都是非常繁琐,也都不合逻辑,看起来未经过一定的实际商业化开发经验的考验。一个基本的逻辑是,如果是定义一个 static 的连接对象,但是在某个分裂开的过程中去 Conn.rs.Close() 这种动作,这让人感觉是无厘头的,不知道说什么更好,就好像是没有逻辑的人无法研究流程一样。
  • 打赏
  • 举报
回复
public static SqlConnection rs ..................
这种代码就是错误的模式。

SqlConnection 本身是基于缓存机制的,它根据连接串而自动对底层“物理连接”进行高速缓存,当你 new 多个高层次的“逻辑连接”的时候,系统会根据实际情况来重复使用底层物理连接。例如你的程序快速地创建过1000个 SqlConnecttion 对象,但是运行时实际使用6个底层物理连接就够了,而且不会因为“并发、嵌套”等等结构中访问数据库连接而出现“数据库连接被占用”这类系统崩溃异常。只有每一次都 new 一个 SqlConnection 才是真正懂得真正去复用数据库连接,能够真正用得上系统的机制。而声明一个 static 的数据库连接对象,反而是画蛇添足,带来异常崩溃,也没有能重复使用数据库物理连接。
snlixing 2020-06-25
  • 打赏
  • 举报
回复
使用using在范围内结束后自动释放对象,不用再写close了吧

110,534

社区成员

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

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

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