Apex - 数据库方法

数据库类方法是使用 DML 语句的另一种方式,它比插入、更新等 DML 语句更灵活。

数据库方法和DML语句的区别

DML 语句 数据库方法
不允许部分更新。 例如,如果列表中有 20 条记录,则要么所有记录都将被更新,要么不更新。 允许部分更新。 您可以将 Database 方法中的参数指定为 true 或 false,true 允许部分更新,false 不允许相同。
无法获取成功和失败记录列表。 您可以获得成功和失败记录的列表,如我们在示例中看到的那样。
示例 − insert listName 示例 − Database.insert(listName, False), 其中 false 表示不允许部分更新。

插入操作

通过数据库方法插入新记录也非常简单和灵活。 让我们考虑前面的场景,其中我们使用 DML 语句插入了新记录。 我们将使用数据库方法插入相同的内容。

示例

// 使用数据库方法进行插入操作
// 使用简单的 DML 语句首先插入客户记录。 该客户记录将是
// 当我们创建账单记录时使用
APEX_Customer__c objCust = new APEX_Customer__C();
objCust.Name = 'Test';
insert objCust; // Inserting the Customer Records

// 使用数据库方法进行插入操作
APEX_Invoice__c objNewInvoice = new APEX_Invoice__c();
List<apex_invoice__c> InvoiceListToInsert = new List<apex_invoice__c>();
objNewInvoice.APEX_Status__c = 'Pending';
objNewInvoice.APEX_Customer__c = objCust.id;
objNewInvoice.APEX_Amount_Paid__c = 1000;
InvoiceListToInsert.add(objNewInvoice);
Database.SaveResult[] srList = Database.insert(InvoiceListToInsert, false);

// 向List中插入记录的数据库方法
// 迭代该方法的每个返回结果

for (Database.SaveResult sr : srList) {
   if (sr.isSuccess()) {
      // 如果记录成功,则执行此条件并获取 ids
      // 成功记录数
      System.debug('Successfully inserted Invoice. Invoice ID: ' + sr.getId());
      // 获取插入帐户的账单 ID
   } else {
      // 对于失败的记录将执行此条件
      for(Database.Error objErr : sr.getErrors()) {
         System.debug('The following error has occurred.');
         
         // 在调试日志中打印错误消息
         System.debug(objErr.getStatusCode() + ': ' + objErr.getMessage());
         System.debug('Invoice oject field which are affected by the error:' 
            + objErr.getFields());
      }
   }
}

更新操作

现在让我们考虑使用数据库方法的业务案例示例。 假设我们需要更新 Invoice 对象的状态字段,但同时我们还需要记录状态、失败记录 ID、成功计数等信息。这是使用 DML 语句无法实现的,因此我们必须使用数据库方法 获取我们的运营状态。

示例

如果账单的"状态"字段处于"待处理"状态且创建日期为今天,我们将更新该账单的"状态"字段。

下面给出的代码将有助于使用 Database.update 方法更新账单记录。 另外,在执行此代码之前创建一个账单记录。

// 使用数据库方法更新记录的代码
List<apex_invoice__c> invoiceList = [SELECT id, Name, APEX_Status__c,
   createdDate FROM APEX_Invoice__c WHERE createdDate = today];

// 获取今天创建的账单
List<apex_invoice__c> updatedInvoiceList = new List<apex_invoice__c>();
for (APEX_Invoice__c objInvoice: invoiceList) {
   if (objInvoice.APEX_Status__c == 'Pending') {
      objInvoice.APEX_Status__c = 'Paid';
      updatedInvoiceList.add(objInvoice);    //Adding records to the list
   }
}

Database.SaveResult[] srList = Database.update(updatedInvoiceList, false);
// 更新List中记录的数据库方法

// 迭代该方法的每个返回结果
for (Database.SaveResult sr : srList) {
   if (sr.isSuccess()) {
      // 对于成功的记录将执行此条件并获取
      // 成功记录的id
      System.debug('Successfully updated Invoice. Invoice ID is : ' + sr.getId());
   } else {
      // 对于失败的记录将执行此条件
      for(Database.Error objErr : sr.getErrors()) {
         System.debug('The following error has occurred.');
         
         // 在调试日志中打印错误消息
         System.debug(objErr.getStatusCode() + ': ' + objErr.getMessage());
         System.debug('Invoice oject field which are affected by the error:' 
            + objErr.getFields());
      }
   }
}

本教程中我们将仅讨论插入和更新操作。 其他操作与这些操作和我们在上一章中所做的非常相似。