Foros del Web » Programando para Internet » PHP » Zend »

Acceso a SqlServer desde zend

Estas en el tema de Acceso a SqlServer desde zend en el foro de Zend en Foros del Web. Buenas, estoy empezando a desarrollar un portal en zend que conecta de dos bases de datos distintas: Una mysql (la principal) y una SqlServer (secundaria). ...
  #1 (permalink)  
Antiguo 09/07/2012, 09:06
 
Fecha de Ingreso: julio-2012
Ubicación: Madrid
Mensajes: 2
Antigüedad: 11 años, 9 meses
Puntos: 0
Acceso a SqlServer desde zend

Buenas, estoy empezando a desarrollar un portal en zend que conecta de dos bases de datos distintas: Una mysql (la principal) y una SqlServer (secundaria).

Antes de exponer mi error decir que la conexión a ambas bases de datos es correcta y soy capaz de ejecutar consultas en ambas con resultados positivos.

Mi problema empieza al crear el siguiente modelo de datos:

Código PHP:
Ver original
  1. class Application_Model_DbTable_Contact extends Zend_Db_Table_Abstract
  2. {
  3.  
  4.     protected $_name = 'Contact';
  5.     protected $_dbadapter = null;
  6.    
  7.     public function init()
  8.     {
  9.         //load the other adapter
  10.         $registry=Zend_Registry::getInstance();
  11.         $session = $registry['session'];
  12.         $this->_dbadapter = $session->dbNav;
  13.     }
  14.    
  15.     function fetchAll($where = null, $order = null, $count = null, $offset = null) {
  16. //        print_object($this->_dbadapter);
  17.        
  18.         $this->_dbadapter->fetchAll();
  19.     }

Código PHP:
Ver original
  1. class Application_Model_Contact
  2. {
  3. public function __set($name, $value)
  4.     {
  5.         $method = 'set' . $name;
  6.         if (('mapper' == $name) || !method_exists($this, $method)) {
  7.             throw new Exception('Invalid user property');
  8.         }
  9.         $this->$method($value);
  10.     }
  11.    
  12.     public function __get($name)
  13.     {
  14.         $method = 'get' . $name;
  15.         if (('mapper' == $name) || !method_exists($this, $method)) {
  16.             throw new Exception('Invalid user property');
  17.         }
  18.         return $this->$method();
  19.     }
  20.  public function getNo_() {
  21.         return $this->_No_;
  22.     }
  23.  
  24.     public function setNo_($No_) {
  25.         $this->_No_ = (string) $No_;
  26.         return $this;
  27.     }
  28. }

Código PHP:
Ver original
  1. class Application_Model_ContactMapper
  2. {
  3.     protected $_dbTable;
  4.  
  5.     public function setDbTable($dbTable)
  6.     {
  7.         if (is_string($dbTable)) {
  8.             $dbTable = new $dbTable();
  9.         }
  10.         if (!$dbTable instanceof Zend_Db_Table_Abstract) {
  11.             throw new Exception('Invalid table data gateway provided');
  12.         }
  13.         $this->_dbTable = $dbTable;
  14.         return $this;
  15.     }
  16.  
  17.     public function getDbTable()
  18.     {
  19.         if (null === $this->_dbTable) {
  20.             $this->setDbTable('Application_Model_DbTable_Contact');
  21.         }
  22.         return $this->_dbTable;
  23.     }
  24.    // .....
  25. public function fetchAll()
  26.     {
  27.         $resultSet = $this->getDbTable()->fetchAll();
  28.  
  29.             $entries   = array();
  30.             foreach ($resultSet as $row) {
  31.             $entry = new Application_Model_Contact();
  32.             $entry->setName($row->Name);
  33.             $entries[] = $entry;
  34.         }
  35.         return $entries;
  36.     }
  37. }


Y el error es el siguiente:

Exception information:

Message: [Microsoft][Administrador de controladores ODBC] Longitud de cadena o de b�fer no v�lida
Stack trace:

#0 C:\xampp\htdocs\Portal\library\Zend\Db\Statement.p hp(115): Zend_Db_Statement_Sqlsrv->_prepare(NULL)
#1 C:\xampp\htdocs\Portal\library\Zend\Db\Adapter\Sql srv.php(298): Zend_Db_Statement->__construct(Object(Zend_Db_Adapter_Sqlsrv), NULL)
#2 C:\xampp\htdocs\Portal\library\Zend\Db\Adapter\Abs tract.php(478): Zend_Db_Adapter_Sqlsrv->prepare(NULL)
#3 C:\xampp\htdocs\Portal\library\Zend\Db\Adapter\Abs tract.php(736): Zend_Db_Adapter_Abstract->query(NULL, Array)
#4 C:\xampp\htdocs\Portal\application\models\DbTable\ Contact.php(20): Zend_Db_Adapter_Abstract->fetchAll()
#5 C:\xampp\htdocs\Portal\application\models\ContactM apper.php(61): Application_Model_DbTable_Contact->fetchAll()
#6 C:\xampp\htdocs\Portal\application\controllers\Use rsController.php(55): Application_Model_ContactMapper->fetchAll()
#7 C:\xampp\htdocs\Portal\library\Zend\Controller\Act ion.php(516): UsersController->userpageAction()
#8 C:\xampp\htdocs\Portal\library\Zend\Controller\Dis patcher\Standard.php(295): Zend_Controller_Action->dispatch('userpageAction')
#9 C:\xampp\htdocs\Portal\library\Zend\Controller\Fro nt.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#10 C:\xampp\htdocs\Portal\library\Zend\Application\Bo otstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#11 C:\xampp\htdocs\Portal\application\Bootstrap.php(8 0): Zend_Application_Bootstrap_Bootstrap->run()
#12 C:\xampp\htdocs\Portal\library\Zend\Application.ph p(366): Bootstrap->run()
#13 C:\xampp\htdocs\Portal\public\index.php(27): Zend_Application->run()
#14 {main}


Si podeis ayudarme os lo agradeceria, no tengo claro ni porque da el error, la llamada la hago asi:

Código PHP:
Ver original
  1. $contacts = new Application_Model_ContactMapper();
  2.         $this->view->contacts = $contacts->fetchAll();

como en los ejemplos de Zend oficiales
  #2 (permalink)  
Antiguo 09/07/2012, 09:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Acceso a SqlServer desde zend

Lo correcto sería que al iniciar (en tu init()) usaras $this->_setAdapter() para establecer el adapter a usar, así no necesitarías re-definir ningún método, y puedes usar tu dbTable de forma transparente.

Saludos.
  #3 (permalink)  
Antiguo 10/07/2012, 03:59
 
Fecha de Ingreso: julio-2012
Ubicación: Madrid
Mensajes: 2
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Acceso a SqlServer desde zend

Necesito que mi base de datos por defecto sea la Mysql. A mi lo que me preocupa es que la consulta a la segunda base de datos me de ese error.

Ademas en el init de la clase le asigno el adaptador como dices, para que esa clase llame a esa base de datos y no a la principal
  #4 (permalink)  
Antiguo 10/07/2012, 08:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Acceso a SqlServer desde zend

En ese caso manda a llamar a setAdapter solo en el método que lo ocupas, o crea un método para cambiar el adapter ej:
Código PHP:
Ver original
  1. class MyTable extends Zend_Db_Table_Abstract {
  2.        public function swapToSQL()
  3.        {
  4.                $sqlAdapter = Zend_Registry::get('sqlAdapter');
  5.                $this->_setAdapter($sqlAdapter);
  6.        }
  7.  
  8.        public function swapToMySQL()
  9.        {
  10.                $this->_setAdapter(self::getDefaultAdapter());
  11.        }
  12. }

Así puedes hacer el cambio antes de hacer la consulta ej:
Código PHP:
Ver original
  1. $table->swapToSQL();
  2. $table->fetchAll();
  3.  
  4. $table->swapToMySQL();

Saludos.

Etiquetas: model, query, sql-server
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:54.