DART中使用ORACLE DART pub的未来函数

时间:2014-09-08 18:32:35

标签: oracle dart

我正在使用oracledart pub,并且需要将结果作为Map返回到main函数,我知道它是一个FUTURE函数,并且读到了FUTURE,但看起来仍然不清楚,或者我我在代码中做错了,我的功能如下:

void main() {
     var ORAresults = <Map>[];

     ORA()
          .then((results) => ORAresults = results) 
          .catchError((e) => 'Sorry, something wrong!'); 
}


ORA() {
    var results = <Map>[];
   connect(
               "SYSTEM","pswd",
               "(DESCRIPTION="
               "(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))"
               "(CONNECT_DATA=(SERVICE_NAME=XE)(SERVER=DEDICATED)))")
   .then(  
          (oracleConnection) {
          var resultset = oracleConnection.select("select * from vendors");

          while(resultset.next()) {
               results.add({"code":"vCode 1","name": "${resultset.getStringByName('NAME')}"});
            } 

      print('the results inside  $results');  // this works very well
      return results;
   }, 
   onError: (error) {
          print("Failed to connect: $error");
   });
}

当我运行上述内容时,我收到此错误:

  Breaking on exception: object of type NoSuchMethodError

文件dart:core-patch_object_patch.dart正在打开,并指向:

  noSuchMethod(Invocation invocation) {
   =>   return _noSuchMethod(invocation.isMethod,        // this line is being highlighted!
        internal.Symbol.getName(invocation.memberName),
        invocation._type,
        invocation.positionalArguments,
        _symbolMapToStringMap(invocation.namedArguments));
    }

我认为错误是由于此处出现了问题,因为如果删除这些行,则错误消失。:

         ORA()
          .then((results) => ORAresults = results) 
          .catchError((e) => 'Sorry, something wrong!');

任何帮助。

2 个答案:

答案 0 :(得分:1)

您的ORA()函数不会返回它使用的Future。将connect(行更改为return connect(,它应该有效。

当您执行ORA().then(...)时,您将ORA()的返回值用作Future,但您的ORA()函数返回null(它具有没有return语句,因此默认返回null。您真正想做的是使用Future返回您正在构建的connect()

答案 1 :(得分:0)

感谢@Tonio和@Robert,我想现在我更了解未来的意义了:)

我能够根据您的提示和解释解决问题,如下所示:

<.d>在server.dart

void handlePost(HttpRequest req) {
HttpResponse res = req.response;
     switch (req.uri.path) {
            ...
            case '/getVendors':
              getVendors(req);
              break;
            default:
              break;
           }     
   }

void getVendors(HttpRequest req) {
HttpResponse res = req.response;
addCorsHeaders(res);
print('${req.method}: ${req.uri.path}');

var vendors = <Map>[];
connect(
    "SYSTEM",
    "pswrd",
    "(DESCRIPTION="
      "(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))"
      "(CONNECT_DATA=(SERVICE_NAME=XE)(SERVER=DEDICATED)))")
.then(  
  (oracleConnection) {
     var resultset = oracleConnection.select("select * from vendors");

     while(resultset.next()) {
        vendors.add({"code":"${resultset.getStringByName('CODE')}","name": "${resultset.getStringByName('NAME')}"});
      } 
      res.write(JSON.encode(vendors));
      res.close(); 
  }, 
  onError: (error) {
    print("Failed to connect: $error");
  });
}

并在client.dart中

 main(){
           HttpRequest request;  
           String serverResponse = '';  
    ...
 }
 void submit(){
     request = new HttpRequest();
     request.onReadyStateChange.listen(onData_getvendors); 

     var url = 'http://127.0.0.1:8004/getVendors';  
     request.open('POST', url);
     request.send('');
  } 

  onData_getvendors(_){ 
      if (request.readyState == HttpRequest.DONE && request.status == 200) {   // Data saved OK.                                
      for(Map vendor in JSON.decode(request.responseText)){
          vendor..children.add(new OptionElement(value: vendor['code'], data: vendor['name']));
       } 
      else if (request.readyState == HttpRequest.DONE &&
               request.status == 0) {         // Status is 0...most likely the server isn't running.
              serverResponse=request.responseText;
           }
   }