SqlCommand.ExecuteNonQuery()方法的使用注意

SqlCommand.ExecuteNonQuery 方法对数据库连接执行 Transact-SQL 语句并返回受影响的行数。但是有个前提:必须是UPDATE、INSERT 和 DELETE 语句。而对于所有其他类型的语句,返回值则为 -1或0。如果发生回滚,返回值为 -1

对于增删改数据操作,根据ExecuteNonQuery()方法执行结果是否大于0(mark= Comm.ExecuteNonQuery()>0?true:false; )来判断数据库操作是否成功是可以的。对于Update,Insert,Delete语句执行成功时返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚的话返回值为-1。所以利用ExecuteNonQuery()返回值是否大于0来判断操作是否成功是可以的。但是还有一些情况不是这样:

1,使用ExecuteNonQuery()执行Select查询操作,不管是否成功,结果总是会返回-1. 通常我们是建议用该方法执行Select的,可以使用ExecuteScalar(),ExecuteReader(),SqlDataAdapter执行。
2,使用ExecuteNonQuery() 执行存储过程。这分两种情况:
1)存储过程带有返回值(传出参数)时,
把数据库中受影响的行数赋给返回值,这时得到的返回值是受影响的函数(大于或等于0的整数).
把某个值赋给返回值.这时得到的返回值就是这个值。
2)存储过程没有返回值
执行成功后总是返回-1。
(我们可能会想,当执行增删改操作的存储过程即使没有返回值也应该得到受影响的行数 , 但是.我们在ado.net中执行存储过程的时候,dotnet 自动为给了存储过程一个默认值:set nocount on;
所以给我们的感觉是执行存储过程默认返回 -1 )
3,对数据结构的操作将会返回-1,例如执行Create操作,当创建数据表成功时返回-1,如果操作失败的话(数据表已经存在)往往会发生异常,所以执行这种操作时最好用try–catch–语句来容错。

用ExecuteNonQuery()方法執行create操作

SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=PSDB;Integrated Security=SSPI");

string str = "CREATE TABLE aaa ( " +
"[ID] [int] IDENTITY (1, 1) NOT NULL , " +
"[BasicID] [int] NULL ," +
"[AdoptedName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
"[AdoptedSex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ," +
"[AdoptBirthday] [smalldatetime] NULL ," +
"[AdoptedType] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ," +
"[ApprTime] [smalldatetime] NULL ," +
"[Remark] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL " +
") ON [PRIMARY] ";

SqlCommand comm = new SqlCommand(str, conn);
int i = 10;
try
{
conn.Open();
i = comm.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}

Response.Write(i.ToString());

如果执行成功的话,返回值为-1,如果数据表存在返回异常:数据库中已存在名为‘aaa’的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值