ADO.NET来补充我点基础知识吧。
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))
{
}
[解决办法]
SqlDataAdapter 是不需要 open的
在不需要返回结果集或需要返回SqlDataReader
都可以用SqlCommand cmd = new SqlCommand(stringSql, conn)
cmd.ExecuteNonQuery();
cmd.ExecuteReader();
[解决办法]
任何一个 DbDataAdapter 都会自动执行 Dbconnection 的 Open 语句。
你只要写 using (SqlConnection .... 就行了,完全没有任何必要去写 using (SqlCommand .... 这里的using。写了除了让你的程序变慢一些,我没有发现有什么作用。这个 cmd 交给GC 去处理就行了,用不着画蛇添足地调用 Dispose()。
你无需写 try...catch。当出现异常,第一个 using 自然就做了这些事情,你写了catch部分反而是让第一个 using 白写了。