ADO.NET来补充我点基础知识吧。

心悠茶亦香 2013-08-01 04:43:12
        public static DataSet GetDataSet(string stringSql)
{
DataSet ds = new DataSet();
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(stringSql, conn);
adapter.Fill(ds);
}
return ds;
}
public static int ExecuteScalar(string stringSql)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(stringSql, conn))
{
try
{
conn.Open();
object obj = cmd.ExecuteScalar();
int i = Convert.ToInt32(obj);
return i;
}
catch (System.Data.SqlClient.SqlException ex)
{
conn.Close();
throw ex;
}
}
}
}



好吧执行查询的时候没有Open怎么也可以查询?
还有什么时候用 using (SqlCommand cmd = new SqlCommand(stringSql, conn))
{

}
...全文
232 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
金色海洋 2013-08-06
  • 打赏
  • 举报
回复
引用 11 楼 davidgyh392 的回复:
写了一段简单的代码,来看看 SqlDataAdapter 有没有自动 close C# code ? 1 2 3 4 5 6 7 8 9 10 11 string connString = @"Data Source=. 省略若干字符;"; string sql = "select * from Manage_Table"; SqlConnection cn = new SqlConnection(connString); SqlCommand cm = new SqlCommand(sql,cn); SqlDataAdapter da = new SqlDataAdapter(cm); DataTable dt = new DataTable(); da.Fill(dt); Response.Write(dt.Rows.Count); Response.Write("<br>"); Response.Write(cn.State ); 运行结果是 44 Closed 到数据库里取了数据,一共有44条,然后状态是 close。 请问我的这段代码有啥问题没?(不考虑资源有没有及时释放) 如果没啥问题的话,那么请问,是啥时候close的呢? SqlDataAdapter对象会根据需要打开连接,但是不会更改连接的状态, 所以如果连接之前是关闭的,在SqlDataAdapter对象Fill完后还是关闭的, 如果是打开的,Fill完还是打开的
“如果连接之前是关闭的,在SqlDataAdapter对象Fill完后还是关闭的,” fill前是关闭的,fill中一定是打开了对吧,否则无法填充数据。然后fill之后呢?你说了,是关闭的,那么是谁关闭的呢? 不是 SqlDataAdapter吗? 所以我说 SqlDataAdapter 可以自动close,这个并没有错。 我举的例子并没有事先手动open。
心悠茶亦香 2013-08-02
  • 打赏
  • 举报
回复
引用 9 楼 God_Girl 的回复:
如果你写了 SqlCommand 用来重写方法 比如 ExcuteReader 方法带参和不带参 就需要 open close。 你在用 SqlCommand 不就是已经打开了么
using 里面会不会自动close?
  • 打赏
  • 举报
回复
如果你写了 SqlCommand 用来重写方法 比如 ExcuteReader 方法带参和不带参 就需要 open close。 你在用 SqlCommand 不就是已经打开了么
金色海洋 2013-08-02
  • 打赏
  • 举报
回复
写了一段简单的代码,来看看 SqlDataAdapter 有没有自动 close

 string connString = @"Data Source=. 省略若干字符;";
            string sql = "select * from Manage_Table";
            SqlConnection cn = new SqlConnection(connString);
            SqlCommand cm = new SqlCommand(sql,cn);
            SqlDataAdapter da = new SqlDataAdapter(cm);
            DataTable dt = new DataTable();
            da.Fill(dt);

            Response.Write(dt.Rows.Count);
            Response.Write("<br>");
            Response.Write(cn.State );
运行结果是 44 Closed 到数据库里取了数据,一共有44条,然后状态是 close。 请问我的这段代码有啥问题没?(不考虑资源有没有及时释放) 如果没啥问题的话,那么请问,是啥时候close的呢?
  • 打赏
  • 举报
回复
DbDataAdapter (它是 SqlDataAdapter 的父类)对象会自动判断是否需要执行 Open,但是它不会去执行什么 Close。 在你使用 using 来确保“优美的”调用 Dispose()的时候,要注意理解为什么要调用 Dispose() 方法。如果你不知道为什么要调用 Dispose() 方法,见到什么对象实例化都去写 using,那岂不是画蛇添足?
  • 打赏
  • 举报
回复
任何一个 DbDataAdapter 都会自动执行 Dbconnection 的 Open 语句。 你只要写 using (SqlConnection .... 就行了,完全没有任何必要去写 using (SqlCommand .... 这里的using。写了除了让你的程序变慢一些,我没有发现有什么作用。这个 cmd 交给GC 去处理就行了,用不着画蛇添足地调用 Dispose()。 你无需写 try...catch。当出现异常,第一个 using 自然就做了这些事情,你写了catch部分反而是让第一个 using 白写了。
davidgyh392 2013-08-02
  • 打赏
  • 举报
回复
写了一段简单的代码,来看看 SqlDataAdapter 有没有自动 close C# code ? 1 2 3 4 5 6 7 8 9 10 11 string connString = @"Data Source=. 省略若干字符;"; string sql = "select * from Manage_Table"; SqlConnection cn = new SqlConnection(connString); SqlCommand cm = new SqlCommand(sql,cn); SqlDataAdapter da = new SqlDataAdapter(cm); DataTable dt = new DataTable(); da.Fill(dt); Response.Write(dt.Rows.Count); Response.Write("<br>"); Response.Write(cn.State ); 运行结果是 44 Closed 到数据库里取了数据,一共有44条,然后状态是 close。 请问我的这段代码有啥问题没?(不考虑资源有没有及时释放) 如果没啥问题的话,那么请问,是啥时候close的呢? SqlDataAdapter对象会根据需要打开连接,但是不会更改连接的状态, 所以如果连接之前是关闭的,在SqlDataAdapter对象Fill完后还是关闭的, 如果是打开的,Fill完还是打开的
金色海洋 2013-08-01
  • 打赏
  • 举报
回复
1、SqlDataAdapter 内部会自动open和close 2、using (SqlCommand cmd = new SqlCommand(stringSql, conn)) 这个就好像你在家吃饭,吃饭前要把饭桌拿出来摆好,吃晚饭立刻把饭桌收拾起来。 如果不使用using呢,就好比你去饭店吃饭,吃晚饭了,饭桌也不会立即收拾起来,因为还会有下一波客人。
threenewbee 2013-08-01
  • 打赏
  • 举报
回复
引用 2 楼 guwei4037 的回复:
1、没有Open就能查询,这个是不会的,连接没有打开是不行的。 2、using的写法是很优美的写法,用于自动释放对象。即出了{}大括号,cmd自动销毁,无需手动释放。
严谨点说,是cmd的非托管资源被回收,因为using会自动转换成对Dispose()的调用。
天殇月痕 2013-08-01
  • 打赏
  • 举报
回复
open打开连接才能和数据库链接 using关键字是用来自动释放非托管资源的
全栈极简 2013-08-01
  • 打赏
  • 举报
回复
1、没有Open就能查询,这个是不会的,连接没有打开是不行的。 2、using的写法是很优美的写法,用于自动释放对象。即出了{}大括号,cmd自动销毁,无需手动释放。
ztszhq 2013-08-01
  • 打赏
  • 举报
回复
SqlDataAdapter 是不需要 open的 在不需要返回结果集或需要返回SqlDataReader 都可以用SqlCommand cmd = new SqlCommand(stringSql, conn) cmd.ExecuteNonQuery(); cmd.ExecuteReader();

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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