首页 新闻 赞助 找找看

sqlcommand问题?

0
悬赏园豆:5 [已解决问题] 解决于 2017-04-12 16:11

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();
}
}
}

换成这种就完全解决了,这是为何?

先修客的主页 先修客 | 初学一级 | 园豆:150
提问于:2015-04-21 22:54
< >
分享
最佳答案
0

上面两个人说的都对,一样的,之所以你用new SqlCommand()报错了,就是因为你没有对CommandText赋值,也就是你没有告诉SqlCommand需要去执行什么sql语句。

下图可以看到,conn.CreateCommand()内部就是调用了new SqlCommand(null,conn),而且CommandText穿了个null进去,你需要重新给CommandText赋值。

一楼的兄弟,using就是一个写法,用using就不用自己去dispose()了。

收获园豆:3
林尹石 | 菜鸟二级 |园豆:211 | 2015-04-22 09:28
其他回答(4)
0

不是很懂那个using有什么用,不过你第一个没有sql语句啊,所以执行出错了,第二个有sql

李云兴 | 园豆:204 (菜鸟二级) | 2015-04-21 23:10

给豆啊

支持(0) 反对(0) 李云兴 | 园豆:204 (菜鸟二级) | 2015-04-21 23:12
1

首先,conn.CreateCommand和new SqlCommand(conn)是几乎完全等价的。

其次,第一段代码少了对CommandText赋值的过程。第二段代码通过new方法传递了sql,第一段可以在using里增加:cmd.CommandText = sql;

收获园豆:1
519740105 | 园豆:5810 (大侠五级) | 2015-04-22 09:06
0

推荐一个工具叫Reflector,查看下这两个函数的实现方式就知道差别了。

Firen | 园豆:5385 (大侠五级) | 2015-04-22 10:00
0

基本上两种写法是等价的,那个报错是因为没有给CommandText赋值,using可以让系统在适当的时候,自动释放资源,也就是close或dispose关闭连接

收获园豆:1
繁复 | 园豆:207 (菜鸟二级) | 2015-04-27 12:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册