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

Popular posts from this blog

c++ - Convert big endian to little endian when reading from a binary file -

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -