sql - Calling multiple stored procedures in .net, how to do it? -
i need call stored procedure multiple times, i'm using informix. know if calling procedure multiple times same connection same generating string multiple calls stored procedure , executing query.
this example of code:
ifxcommand cmd = new ifxcommand("storedata", myconn); cmd.commandtype = commandtype.storedprocedure; (int = 0; < lbim; i++) {    cmd.parameters.add("id", ibm.data.informix.ifxtype.varchar, 255).value = info.id;   cmd.parameters.add("descripciondescuentoimpuesto", ibm.data.informix.ifxtype.varchar, 255).value = info.data[i].value;   try   {      ifxdatareader myreader = cmd.executereader();      if (myreader.read())      {         boolean aux = (boolean)myreader[0];         myreturn = aux;      }      myreader.close();   }   catch (ifxexception ex)   {   }   cmd.parameters.clear(); }   the problem each stored procedure returns true or false.
thanks
for performance reasons best approach prepare command before loop. inside loop can set parameter values , execute reader. improve code 2 things:
- using factories; way can switch between odbcdriver , ifxdriver or else in future;
 - error handling: should close reader in section or use "usings" clause guarantees freeing resources in case of exception; prefere usings because in more complex scenarios section becomes complicated.
 
this changes give following code:
dbproviderfactory dbfactory; dbfactory = dbproviderfactories.getfactory("ibm.data.informix"); using (myconn = dbfactory.createconnection()) {     myconn.connectionstring = " ... ";     myconn.open();     dbcommand cmd = dbfactory.createcommand();     cmd.connection = myconn;     cmd.commandtext = "storedata";     cmd.commandtype = commandtype.storedprocedure;     cmd.parameters.clear();      dbparameter parameter = dbfactory.createparameter();     parameter.parametername = "id";     parameter.dbtype = dbtype.string;     parameter.size = 255; // not necessary     cmd.parameters.add(parameter);      parameter = dbfactory.createparameter();     parameter.parametername = "descripciondescuentoimpuesto";     parameter.dbtype = dbtype.string;     parameter.size = 255;     cmd.parameters.add(parameter);      cmd.prepare();     (int = 0; < lbim; i++)     {         cmd.parameters[0].value = info.id;         cmd.parameters[1].value = info.data[i].value;         using (dbdatareader myreader = cmd.executereader()) {             if (myreader.read())             {                 boolean aux = (boolean)myreader[0];                 myreturn = aux;             }         }     } }   code longer think advantages prevailing. better approach use spring.net (i'm learning it) - half size of code, driver independend (similarly factories approach), automatic disposal of resources in case of exception. use rather
myreturn = (bool)cmd.executescalar();
instead of data reader. next thing i'm using command type text rather , "execute procedure storedata(?,?)". because of informix bug in scenarios i've got long time ago. possible fixed - no longer necessary.
Comments
Post a Comment