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