注意 ExecuteNonQuery() 返回值 问题

 

ADO.NET 数据命令使您能够直接对数据库或其他数据源执行命令,而不需要数据集或数据适配器。有关更多信息,请参见 Visual Studio 中的 DataCommand 对象介绍

1.
可针对数据库执行的某些类型的数据命令除了返回一个指出命令成功的值以外不返回任何值。这些命令类型包括:

  • 数据库定义 (DDL) 命令,用于创建和管理数据库结构(如表和存储过程)。
  • 更新命令(“更新”(Update)、“插入”(Insert) 和“删除”(Delete) 语句)。

必须使用数据库命令执行 DDL 操作;没有其他方法可以在 ADO.NET 中执行这些任务。

如果正在使用数据集,则不需要使用单独的数据命令执行数据库更新。而是使用数据适配器更新数据库。有关更多信息,请参见 Visual Studio .NET 中的数据集更新。但是,如果使用的不是数据集,则可以直接向数据库发送更新命令。有关数据集相对于数据命令的优点的更多信息,请参见数据访问策略建议

对于这两种类型的命令,命令都返回一个整数指示操作的成功与否。返回值因是要更新记录还是发出 DDL 命令而异:

  • 如果要创建或修改数据库结构,当操作成功时返回值为 -1。
  • 如果要更新记录,则返回值指示受到该操作影响的记录数。

在两种情况下,如果操作失败,命令都返回零。

                                                   注意 ExecuteNonQuery() 返回值 问题

前些日子作一些数据项目的时候 在ADO.NET 中处理 ExecuteNonQuery()方法时,总是通过判断其返回值是否大于0来判断操作时候成功 。但是实际上并不是这样的,好在处理的数据操作多时 修改, 插入, 删除,否则的话问题就有点打了,都是些基础的知识,但是很重要个人觉得有必要记下来。
    ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1,对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们平时的思维方式有点差距所以应该好好的注意了,例如对数据库共添加一个数据表的Create操作,当创建数据表成功时返回-1,如果操作失败的话(如数据表已经存在)往往会发生异常,所以执行这种操作时最好用try--catch--语句来容错。
例如用ExecuteNonQuery()方法执行create和alter操作
    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' 的对象。

From:MSDN

备注

您可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句,在不使用 DataSet 的情况下更改数据库中的数据。

虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。

对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。

http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand.executenonquery(VS.80).aspx

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executenonquery.aspx

Me:经实验鉴定SqlCommand.ExecuteNonQuery()执行Create,Drop时成功则返回-1,失败则发生异常.OleDbCommand.ExecuteNonQuery()执行Create,Drop时成功则返回0,失败也发生异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值