sqlcommand cmd=conn.createcommand()与SqlCommand cmd = new SqlCommand(sql,conn)到底有什么区别呢?大部分人都说只是写法不一样,真的是这样吗?
public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] pams)
{
using (SqlConnection conn = new SqlConnection(constr))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = type;
if (pams != null)
{
cmd.Parameters.AddRange(pams);
}
conn.Open();
return cmd.ExecuteNonQuery();
}
}
}
却出现错误:“System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理
public static int ExecuteNonQuery(string sql, CommandType type, params SqlParameter[] pams)
{
using (SqlConnection conn = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(sql,conn))
{
cmd.CommandType = type;
if (pams != null)
{
cmd.Parameters.AddRange(pams);
}
conn.Open();
return cmd.ExecuteNonQuery();
}
}
}
换成这种就完全解决了,这是为何?
上面两个人说的都对,一样的,之所以你用new SqlCommand()报错了,就是因为你没有对CommandText赋值,也就是你没有告诉SqlCommand需要去执行什么sql语句。
下图可以看到,conn.CreateCommand()内部就是调用了new SqlCommand(null,conn),而且CommandText穿了个null进去,你需要重新给CommandText赋值。
一楼的兄弟,using就是一个写法,用using就不用自己去dispose()了。
不是很懂那个using有什么用,不过你第一个没有sql语句啊,所以执行出错了,第二个有sql
给豆啊
首先,conn.CreateCommand和new SqlCommand(conn)是几乎完全等价的。
其次,第一段代码少了对CommandText赋值的过程。第二段代码通过new方法传递了sql,第一段可以在using里增加:cmd.CommandText = sql;
推荐一个工具叫Reflector,查看下这两个函数的实现方式就知道差别了。
基本上两种写法是等价的,那个报错是因为没有给CommandText赋值,using可以让系统在适当的时候,自动释放资源,也就是close或dispose关闭连接