Ejecutar un stored procedure con una conexión distinta a la que está logueado el usuario del ERP.
Útil para cuando necesitamos permisos de otro usuario para, por ejemplo, lanzar una stored.
Código VB6:
' Esta función crea una nueva conexión a la base de datos con el usuario sa y lanza una stored con parámetros.
' Gentileza de nuestro compañero de AXIUM, Ioseba Gárate. ;)
Function Pers_ejecutaStore(nombre)
Dim conn: Set conn = CreateObject("ADODB.Connection")
conn.open "Driver={SQL Server};Server=DBSERVER\INSTANCIA;Database=MIDB;Uid=sa;Pwd=*********;"
Dim cmdUA
Set cmdUA = CreateObject("ADODB.Command")
Set cmdUA.ActiveConnection = conn
cmdUA.CommandText = nombre
cmdUA.CommandType = 4
Set Param = cmdUA.CreateParameter("NOMBRE_PARAMETRO", 3, 1, 8, "VALOR_DEL_PARAMETRO" )
cmdUA.Parameters.Append Param
Set rs = cmdUA.Execute
Pers_ejecutaStore= rs.Fields(0).Value
End FunctionCódigo C#:
Para que sea más sencillo realizar pruebas se adjunta el código del procedure personalizado al que llamamos. Ejecutar en SQL Server:
CREATE PROCEDURE pPers_Crear_Cliente (@IdCliente varchar(50), @NombreCliente varchar(250)) AS BEGIN SELECT * FROM Clientes_Datos INSERT INTO Clientes_Datos (IdCliente, Cliente, RazonSocial) VALUES (@IdCliente, @NombreCliente, @NombreCliente) END
Para la prueba de C# tendremos que referenciar ADODB y sus métodos y propiedades mediante Reflection. El ejemplo de Visual Basic, transcrito de esta forma a C# en un script vacío sería de la siguiente forma.
using AhoraCore;
using AhoraCl;
using AhoraOCX;
using System;
using static AhoraCore.VBA.Interaction;
using System.Reflection;
using AhoraSistema;
namespace AhoraScriptsVacia
{
public class Script_58 : AhoraOCX.AhoraBaseScript
{
public void Main()
{
try
{
Type tipoConexion = Type.GetTypeFromProgID("ADODB.Connection");
object lConn = System.Activator.CreateInstance(tipoConexion);
Object[] parameters1 = new Object[1];
Object[] parameters5 = new Object[5];
parameters1[0] = "Driver={SQL Server};Server=NOMBRE_INSTANCIA_SQLSERVER;Database=NOMBRE_BBDD;Uid=NOMBRE_USUARIO;Pwd=-PASSWORD;";
// Invocamos el método "Open" de "ADODB.Connection"
tipoConexion.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, lConn, parameters1);
Type tipoCommand = Type.GetTypeFromProgID("ADODB.Command");
object lCommand = System.Activator.CreateInstance(tipoCommand);
parameters1[0] = lConn;
tipoCommand.InvokeMember("ActiveConnection", BindingFlags.SetProperty, null, lCommand, parameters1);
// Invocamos el procedure
parameters1[0] = "pPers_Crear_Cliente";
tipoCommand.InvokeMember("CommandText", BindingFlags.SetProperty, null, lCommand, parameters1);
parameters1[0] = 4; // Evaluates CommandText as a stored procedure name.
tipoCommand.InvokeMember("CommandType", BindingFlags.SetProperty, null, lCommand, parameters1);
// Añadimos los parámetros (configurándolos uno a uno)
// ---------------------------------------------------
// Parámetro "@IdCliente"
parameters5[0] = "@IdCliente"; // Name
parameters5[1] = 200; // Type (3 -> Integer, 200 -> Varchar) (https://learn.microsoft.com/en-us/sql/ado/reference/ado-api/datatypeenum?view=sql-server-ver16)
parameters5[2] = 1; // Direction (1 -> adParamInput) (https://learn.microsoft.com/en-us/sql/ado/reference/ado-api/parameterdirectionenum?view=sql-server-ver16)
parameters5[3] = 50; // Size
parameters5[4] = "00098"; // Value
object Param1 = tipoCommand.InvokeMember("CreateParameter", BindingFlags.InvokeMethod, null, lCommand, parameters5);
object Parameters = tipoCommand.InvokeMember("Parameters", BindingFlags.GetProperty, null, lCommand, null);
// Añadimos el parámetro
parameters1[0] = Param1;
tipoCommand.InvokeMember("Append", BindingFlags.InvokeMethod, null, Parameters, parameters1);
// Parámetro "@IdCliente"
parameters5[0] = "@NombreCliente"; // Name
parameters5[1] = 200; // Type (3 -> Integer, 200 -> Varchar) (https://learn.microsoft.com/en-us/sql/ado/reference/ado-api/datatypeenum?view=sql-server-ver16)
parameters5[2] = 1; // Direction (1 -> adParamInput) (https://learn.microsoft.com/en-us/sql/ado/reference/ado-api/parameterdirectionenum?view=sql-server-ver16)
parameters5[3] = 250; // Size
parameters5[4] = "Nombre Cliente"; // Value
object Param2 = tipoCommand.InvokeMember("CreateParameter", BindingFlags.InvokeMethod, null, lCommand, parameters5);
Parameters = tipoCommand.InvokeMember("Parameters", BindingFlags.GetProperty, null, lCommand, null);
// Añadimos el parámetro
parameters1[0] = Param2;
tipoCommand.InvokeMember("Append", BindingFlags.InvokeMethod, null, Parameters, parameters1);
// Ejecutamos el procedure y recuperamos el RecordSet que devuelve
object lRes = tipoCommand.InvokeMember("Execute", BindingFlags.InvokeMethod, null, lCommand, null);
// Recuperamos "lRes.Fields"
object lFields = tipoCommand.InvokeMember("Fields", BindingFlags.GetProperty, null, lRes, null);
// Recuperamos "lRes.Fields[0]"
parameters1[0] = 0;
object lField0 = tipoCommand.InvokeMember("Item", BindingFlags.InvokeMethod, null, lFields, parameters1);
object lValue = tipoCommand.InvokeMember("Value", BindingFlags.GetProperty, null, lField0, null);
MsgBox(lValue.ToString());
}
catch (Exception ex)
{
MsgBox("ERROR CONECTANDO: " + ex.Message);
return;
}
}
}
}¿Le ha sido útil este artículo?
¡Qué bien!
Gracias por sus comentarios
¡Sentimos mucho no haber sido de ayuda!
Gracias por sus comentarios
Sus comentarios se han enviado
Agradecemos su esfuerzo e intentaremos corregir el artículo