Error en MySqlCommandBuilder (MySQL)

09/05/2006 - 18:16 por mafraeb | Informe spam
Hola a todos

He creado un metodo para crear adaptadores genericos (odbc, sqlserver, mysql...)

public static DbDataAdapter CreateDataAdapter(

if (_Provider == provider_sqlclient

SqlDataAdapter da = new SqlDataAdapter()
SqlCommandBuilder cb = new SqlCommandBuilder(da)
da.UpdateCommand = cb.GetUpdateCommand()
da.DeleteCommand = cb.GetDeleteCommand()
da.InsertCommand = cb.GetInsertCommand()
return da

else if (_Provider == provider_odbc

OdbcDataAdapter da = new OdbcDataAdapter()
OdbcCommandBuilder cb = new OdbcCommandBuilder(da)
da.UpdateCommand = cb.GetUpdateCommand()
da.DeleteCommand = cb.GetDeleteCommand()
da.InsertCommand = cb.GetInsertCommand()
return da

else if (_Provider == provider_mysql

MySqlDataAdapter da = new MySqlDataAdapter()
MySqlCommandBuilder cb = new MySqlCommandBuilder(da)
da.UpdateCommand = cb.GetUpdateCommand()
da.DeleteCommand = cb.GetDeleteCommand()
da.InsertCommand = cb.GetInsertCommand()
return da

els

throw (new Exception(Mensajes.ProveedorIncorrecto.ToString()))



Este metodo devuelve un tipo generico DbDataAdapter
Al hacer la conversion (return da) si visualizo este objeto devuelto en todos los metodos Comand (por ejemplo UpdateCommand ) ha dado una excepción
Aun así EL ADAPTADOR FUNCIONA CORRECTAMENTE cuando hago la update

¿¿¿¿Alguien sabe si esto me puede acarrear algún problema en el futuro???
Si no es así, que esto sirva de aclaración para aquellos que esten haciendo una clase de acceso a datos genérica y que tambien sirva para mysql

Gracias de antemano

mafraeb

Ver este tema: http://www.softwaremix.net/viewtopic-513405.htm

Enviado desde http://www.softwaremix.net
 

Leer las respuestas

#1 Miguel Ortiz Falcón
10/05/2006 - 02:21 | Informe spam
mafraeb,

en esencia no sería muy escalable que digamos, tendría desventajas si existe
proveedores que den más performance, es decir por ejemplo, así como SqlClient
te ofrece mejoras en general cuando trabajas con SQL Server, en lugar de
conectarte con SQL Server usando ole db por ejemplo obviamente usarías las
clases de System.Data.SqlClient, pero qué pasa si hay que usar ahora Oracle,
Sybase, o cualquier otro ?, te conectarías vía odbc?, ole db?, aun existiendo
un proveedor por parte de ellos "especializado"?, o estarías agregandole un
"if" por cada conector?.

Para esos casos, que es lo que estas haciendo, te puedo dar dos soluciones
mucho mejores, y por mucho mas escalables:

1. Maneja todo vía interfaces, todos los proveedores, incluyendo el
proveedor de SQL Server, Oracle, el mismo de MySQL, etc, etc, deben
implementar interfaces, tomalo como una regla, porque asi lo hacen, por
ejemplo un comando, internamente en pocas palabras un SqlCommand implementa
IDbCommand, entonces asi se vuelven generalizados, nota GENERALIZADOS no
GENERICO, pero con el rendimiento de un Genérico, debido a que como sabes que
el proveedor especializado debio de implementar la interfaz te aseguras que
nunca fallará, aparentemente estas llamando a los métodos de la interfaz,
pero como la referencia de interfaz está apuntando al "objeto especializado"
por eso es que se logra esto.

2. La segunda opción que te doy es que uses la Enterprise Library, que en
escecia hace lo que te comenté en el paso 1.

Saludos...!

Miguel Ortiz Falcón



"mafraeb" escribió:


Hola a todos:

He creado un metodo para crear adaptadores genericos (odbc, sqlserver, mysql...):

public static DbDataAdapter CreateDataAdapter()
{
if (_Provider == provider_sqlclient)
{
SqlDataAdapter da = new SqlDataAdapter();
SqlCommandBuilder cb = new SqlCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.InsertCommand = cb.GetInsertCommand();
return da;
}
else if (_Provider == provider_odbc)
{
OdbcDataAdapter da = new OdbcDataAdapter();
OdbcCommandBuilder cb = new OdbcCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.InsertCommand = cb.GetInsertCommand();
return da;
}
else if (_Provider == provider_mysql)
{
MySqlDataAdapter da = new MySqlDataAdapter();
MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.InsertCommand = cb.GetInsertCommand();
return da;
}
else
{
throw (new Exception(Mensajes.ProveedorIncorrecto.ToString()));
}
}

Este metodo devuelve un tipo generico DbDataAdapter .
Al hacer la conversion (return da) si visualizo este objeto devuelto en todos los metodos Comand (por ejemplo UpdateCommand ) ha dado una excepción.
Aun así EL ADAPTADOR FUNCIONA CORRECTAMENTE cuando hago la update.

¿¿¿¿Alguien sabe si esto me puede acarrear algún problema en el futuro????
Si no es así, que esto sirva de aclaración para aquellos que esten haciendo una clase de acceso a datos genérica y que tambien sirva para mysql.

Gracias de antemano.


mafraeb


Ver este tema: http://www.softwaremix.net/viewtopic-513405.html

Enviado desde http://www.softwaremix.net



Preguntas similares