Clases de Virtualizacion
De
<keywords content="keywords">
virtualizacion, virtualización, entidades virtuales, entidades virtualizadas, virtualización de entidades, virtualizacion de entidades, virtualizacion entidades, virtualizar entidad, virtualización entidades, integración a nivel de datos, nivel de datos, mySQL, virtualización personalizada, virtualizacion personalizada
</keywords>
|
Aplica para las EDICIONES ENTERPRISE |
Contenido |
Clases de Virtualización
Introducción
Este artículo presenta un ejemplo de las clases de virtualización que implementan las interfaces "IProviderVirtualDA" y "IEntityVirtualDA". Esta implementación es requerida para una virtualización personalizada (a una fuente de datos diferente a Oracle o Microsoft SQL Server).
El ejemplo a continuación ilustra una virtualización personalizada contra una fuente de datos en MySQL.
|
Alerta: Tenga en cuenta que el siguiente código provee una guía sobre la implementación del método "AddEntity()", sin embargo los otros métodos no están incluídos y por lo tanto deberán ser completados en las clases. |
Prerequisitos
Para implementar estas clases, se requiere descargar e instalar el componente "MySQL Connector/Net" que se utiliza para la conexión a la instancia de MySQL.
Para este ejemplo, estas clases fueron trabajadas en Microsoft Visual Studio. En el proyecto de .Net (con Visual Studio), la librería "MySql.Data.dll" instalada por el componente "MySQL Connector/Net" debe ser referenciado en el proyecto de .Net.
De igual manera, se requiere referenciar también la librería "Bizagi.EntityManager.Interfaces.IEntityDA.dll" de Bizagi, que se encuentra ubicada en el folder de la aplicación web del proyecto (por defecto en "C:\Bizagi\Enterprise\Projects\[NOMBRE_PROYECTO]\WebApplication\bin\".
Ejemplo de Implementación de las clases
Clase que implementa la interface IProviderVirtualDA
using System;
using System.Data;
using System.Data.OleDb;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using MySql.Data.MySqlClient;
using Bizagi.EntityManager.Interfaces;
namespace BizagiMySQL
{
public class CMySQLProvider : IProviderVirtualDA
{
protected HybridDictionary m_htMetadata;
protected MySqlConnection MySqlconn;
protected bool bDisposed;
public CMySQLProvider()
{
bDisposed = false;
MySqlconn = null;
}
#region IProviderVirtualDA Members
public void BeginTransaction()
{
// TODO: Add CMySQLProvider.BeginTransaction implementation
}
public void Rollback()
{
// TODO: Add CMySQLProvider.Rollback implementation
}
public void Commit()
{
// TODO: Add CMySQLProvider.Commit implementation
}
public void OpenConnection()
{
if (MySqlconn == null)
{
// Verify that the metadata fields are correct
if (!m_htMetadata.Contains("Server") || !m_htMetadata.Contains("Database") ||
!m_htMetadata.Contains("Username") || !m_htMetadata.Contains("Password"))
{
throw new CEntityClassInterfaceException("Incomplete metadata:"
+ "connection parameters missing");
}
else
{
// build the connection string
string sConn;
string sServer = m_htMetadata["Server"].ToString();
string sDatabase = m_htMetadata["Database"].ToString();
string sUsername = m_htMetadata["Username"].ToString();
string sPassword = m_htMetadata["Password"].ToString();
sConn = "Server=" + sServer + ";Database=" + sDatabase
+ ";Uid=" + sUsername + ";Pwd=" + sPassword + ";";
MySqlconn = new MySqlConnection(sConn);
MySqlconn.Open();
}
}
}
public void Init(HybridDictionary htMetadata)
{
m_htMetadata = htMetadata;
}
public void CloseConnection()
{
if (MySqlconn != null)
MySqlconn.Close();
MySqlconn = null;
}
#endregion
#region IDisposable Members
public void Dispose()
{
if (!bDisposed)
{
// never close the connection in this method!!
bDisposed = true;
}
}
#endregion
public MySqlConnection getConnection()
{
return this.MySqlconn;
}
public DataSet executeMySQLQuery(string sSQL)
{
MySqlCommand command;
MySqlDataAdapter adapter;
DataSet ds = new DataSet();
command = new MySqlCommand(sSQL, this.getConnection());
adapter = new MySqlDataAdapter(command);
adapter.Fill(ds);
return ds;
}
public void executeNonQueryMySQL(string sSQL)
{
MySqlCommand command;
command = new MySqlCommand(sSQL, this.getConnection());
command.ExecuteNonQuery();
}
}
}
Clase que implementa la interface IEntityVirtualDA
using System;
using System.Data;
using System.Data.OleDb;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Xml;
using MySql.Data.MySqlClient;
using Bizagi.EntityManager.Interfaces;
using Bizagi.Defs;
namespace BizagiMySQL
{
public class CMySQLEntity : IEntityVirtualDA
{
/// <summary>
/// Flag to show if object has been disposed
/// </summary>
protected bool m_bDisposed;
/// <summary>
/// Metadata used to initialize object, as collection of name-value pairs
/// </summary>
protected HybridDictionary m_htMetadata;
/// <summary>
/// Connection with the virtual System
/// </summary>
protected CMySQLProvider m_objSystem;
public CMySQLEntity()
{
m_bDisposed = false;
}
#region IEntityVirtualDA Members
public Hashtable AddEntity(string sEntSource, Hashtable htAddCols,
string[] arrsKeyColumns, object[] arroKeyValues, string[] arrsAutoColumns)
{
Hashtable htResult = new Hashtable();
DataTable dtAutoAttribValues = new DataTable();
try
{
StringBuilder sbIntoList = new StringBuilder(htAddCols.Count * 10);
StringBuilder sbValuesList = new StringBuilder(htAddCols.Count * 10);
// Columns to add
foreach (DictionaryEntry oEntry in htAddCols)
{
// Builds INTO clause and VALUES clauses separately
sbIntoList.Append(oEntry.Key);
sbIntoList.Append(",");
// Adds values as parameters
if (oEntry.Value.GetType() == typeof(string))
sbValuesList.Append("'"+oEntry.Value+"'");
else
if(oEntry.Value.GetType() == typeof(DateTime))
{
string sFecha = ((DateTime)oEntry.Value).
ToString("dd/MM/yyyy hh:mm:ss tt");
sbValuesList.Append("STR_TO_DATE('"
+ sFecha + "','%d/%m/%Y %h:%i:%s %p')");
}
else
sbValuesList.Append(oEntry.Value);
sbValuesList.Append(",");
}
if (sbIntoList.Length == 0 || sbValuesList.Length == 0)
{
throw new CEntityClassInterfaceException("Nothing to insert.");
}
StringBuilder sbSQL = new StringBuilder();
StringBuilder sbSQLSelectCols = new StringBuilder();
// Inserts values in entity table
sbSQL.Append("INSERT INTO ");
sbSQL.Append(sEntSource);
sbSQL.Append(" ( ");
sbSQL.Append(sbIntoList.Remove(sbIntoList.Length - 1, 1).ToString());
sbSQL.Append(" ) VALUES ( ");
sbSQL.Append(sbValuesList.Remove(sbValuesList.Length - 1, 1).ToString());
sbSQL.Append(" ) ");
m_objSystem.executeNonQueryMySQL(sbSQL.ToString());
return htResult;
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
}
public void Init(IProviderVirtualDA objProvider, HybridDictionary htMetadata)
{
m_objSystem = (CMySQLProvider)objProvider;
m_htMetadata = htMetadata;
}
public bool DeleteEntity(string sEntSource,
string[] arrsKeyColumns, object[] arroKeyValues)
{
// TODO: Add DeleteEntity implementation
return false;
}
public int ExistsEntityInstance(string sEntSource, string sColumn,
object oValue, string[] arrsKeyColumns, object[] arroKeyValues)
{
try
{
StringBuilder sbSQL = new StringBuilder();
sbSQL.Append(" SELECT ");
sbSQL.Append(string.Join(",", arrsKeyColumns));
sbSQL.Append(" FROM ");
sbSQL.Append(sEntSource);
sbSQL.Append(" WHERE ");
sbSQL.Append(buildWhereClause(arrsKeyColumns, arroKeyValues));
DataSet ds = m_objSystem.executeMySQLQuery(sbSQL.ToString());
return ds.Tables[0].Rows.Count;
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
}
bool Bizagi.EntityManager.Interfaces.IEntityVirtualDA.ExistsEntityInstance(string sEntSource,
string[] arrsKeyColumns, object[] arroKeyValues)
{
// TODO: Add ExistsEntityInstance implementation
return true;
}
public Hashtable UpdateEntity(string sEntSource, string[] arrsKeyColumns,
object[] arroKeyValues, Hashtable htUpdateCols, string[] arrsAutoColumns)
{
// TODO: Add UpdateEntity implementation
return null;
}
public DataSet GetEntityInstance(string sEntSource,
string[] arrsKeyColumns, object[] arroKeyValues, string[] arrsColList)
{
try
{
StringBuilder sbSQL = new StringBuilder();
sbSQL.Append(" SELECT ");
sbSQL.Append(string.Join(",", arrsColList));
sbSQL.Append(" FROM ");
sbSQL.Append(sEntSource);
sbSQL.Append(" WHERE ");
sbSQL.Append(buildWhereClause(arrsKeyColumns, arroKeyValues));
DataSet ds = m_objSystem.executeMySQLQuery(sbSQL.ToString());
return ds;
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
}
public object GetAttributeValue(string sEntSource,
string[] arrsKeyColumns, object[] arroKeyValues, string sAttrSource)
{
try
{
StringBuilder sbSQL = new StringBuilder();
// Column to be retrieved
sbSQL.Append("SELECT ");
sbSQL.Append(sAttrSource);
// FROM clause
sbSQL.Append(" FROM ");
sbSQL.Append(sEntSource);
// Uses surrogate key value to find instance
sbSQL.Append(" WHERE ");
sbSQL.Append(buildWhereClause(arrsKeyColumns, arroKeyValues));
DataSet ds = m_objSystem.executeMySQLQuery(sbSQL.ToString());
DataTable dtAttribValues = ds.Tables[0];
return dtAttribValues;
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
}
public DataSet GetEntityInstancesTable(string sEntSource, string[] arrsKeyColumns,
string[] arrsColList, string sFilterText, bool bFillSchema, int iTopReturnRows)
{
try
{
StringBuilder sbSQL = new StringBuilder();
sbSQL.Append(" SELECT ");
sbSQL.Append(string.Join(",", arrsColList));
// FROM clause
sbSQL.Append(" FROM ");
sbSQL.Append(sEntSource);
// WHERE clause
if (sFilterText.Length > 0)
{
// Filter text must be formatted in OleDb syntax
sbSQL.Append(" WHERE ");
sbSQL.Append(sFilterText);
}
sbSQL.Append(" ORDER BY ");
sbSQL.Append(string.Join(",", arrsKeyColumns));
DataSet ds = m_objSystem.executeMySQLQuery(sbSQL.ToString());
return ds;
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}
}
#endregion
#region IDisposable Members
public void Dispose()
{
if (!m_bDisposed)
{
m_bDisposed = true;
}
}
#endregion
public string buildWhereClause(string[] keyColumns, object[] keyValues)
{
StringBuilder sbSQL = new StringBuilder();
string[] arrsKeyValues = new string[keyValues.Length];
string sAnd = " AND ";
for (int iKeyIndex = 0; iKeyIndex < keyColumns.Length; iKeyIndex++)
{
// associate columns with values....
sbSQL.Append(keyColumns[iKeyIndex]);
sbSQL.Append(" = ");
sbSQL.Append(keyValues[iKeyIndex].ToString());
sbSQL.Append(sAnd);
}
return sbSQL.Remove(sbSQL.Length - 4, 3).ToString();
}
}
}
Artículos Relacionados
- Cómo integrar a Bizagi con una fuente externa de datos.
- Virtualización Personalizada.
- Ejemplos de clases de replicación para MySQL.
<comments />
