Duda NET Llamar a Procedimientos almacenados

#1
pregunta en .Net y procedimientos almacenados

====ESTE ES EL PROCEDIMEINTO ALMACENADO
ALTER PROCEDURE [dbo].[Ins_Clientes]
@Id_Cli varchar(8),
@Nombre varchar(Max),
@Mensaje varchar(50) OUTPUT
AS
BEGIN
INSERT INTO Clientes(Id_Cli, Nombre) VALUES (@Id_Cli,@Nombre)
set @Mensaje='Guardado'
END

==CODIGO C# PARA LLAMARLO
Funciones.Formato_Texto(Nombre);
Inicia.myCmd = new SqlCommand("Ins_Clientes", Inicia.Conexion);
Inicia.myCmd.CommandType = CommandType.StoredProcedure;
Inicia.myCmd.Parameters.AddWithValue("@Id_Cli", Id.Text);
Inicia.myCmd.Parameters.AddWithValue("@Nombre", Nombre.Text);
Inicia.myCmd.Parameters.Add("@Mensaje", SqlDbType.VarChar, 50);
Inicia.myCmd.Parameters["@Mensaje"].Direction = ParameterDirection.Output;
Inicia.Conexion.Open();
Inicia.myCmd.ExecuteReader();
Funciones.Mensaje(Inicia.myCmd.Parameters[2].SqlValue.ToString(), Pagina.Page);
Inicia.Conexion.Close();


==PREGUNTA
mis variables en el procedimiento almacenado son @Id_Cli, @Nombre, @Mensaje
¿tienen que tener el mismo nombre al ser llamados desde C#?
Inicia.myCmd.Parameters.AddWithValue("@Id_Cli", Id.Text);
Inicia.myCmd.Parameters.AddWithValue("@Nombre", Nombre.Text);
Inicia.myCmd.Parameters.Add("@Mensaje", SqlDbType.VarChar, 50);

porque sabes si se los cambio no corre pero si lo dejo asi pues si
¿Hay alguna forma de poner el nombre que quieras en el codigo C#?

NOTA sin tener que ocupar adodb como si fuese vb6 es decir sin la referencia COM de
microsoft activex data object recordset
 

dramms

Bovino adolescente
#2
pregunta en .Net y procedimientos almacenados

====ESTE ES EL PROCEDIMEINTO ALMACENADO
ALTER PROCEDURE [dbo].[Ins_Clientes]
@Id_Cli varchar(8),
@Nombre varchar(Max),
@Mensaje varchar(50) OUTPUT
AS
BEGIN
INSERT INTO Clientes(Id_Cli, Nombre) VALUES (@Id_Cli,@Nombre)
set @Mensaje='Guardado'
END

==CODIGO C# PARA LLAMARLO
Funciones.Formato_Texto(Nombre);
Inicia.myCmd = new SqlCommand("Ins_Clientes", Inicia.Conexion);
Inicia.myCmd.CommandType = CommandType.StoredProcedure;
Inicia.myCmd.Parameters.AddWithValue("@Id_Cli", Id.Text);
Inicia.myCmd.Parameters.AddWithValue("@Nombre", Nombre.Text);
Inicia.myCmd.Parameters.Add("@Mensaje", SqlDbType.VarChar, 50);
Inicia.myCmd.Parameters["@Mensaje"].Direction = ParameterDirection.Output;
Inicia.Conexion.Open();
Inicia.myCmd.ExecuteReader();
Funciones.Mensaje(Inicia.myCmd.Parameters[2].SqlValue.ToString(), Pagina.Page);
Inicia.Conexion.Close();


==PREGUNTA
mis variables en el procedimiento almacenado son @Id_Cli, @Nombre, @Mensaje
¿tienen que tener el mismo nombre al ser llamados desde C#?
Inicia.myCmd.Parameters.AddWithValue("@Id_Cli", Id.Text);
Inicia.myCmd.Parameters.AddWithValue("@Nombre", Nombre.Text);
Inicia.myCmd.Parameters.Add("@Mensaje", SqlDbType.VarChar, 50);

porque sabes si se los cambio no corre pero si lo dejo asi pues si
¿Hay alguna forma de poner el nombre que quieras en el codigo C#?

NOTA sin tener que ocupar adodb como si fuese vb6 es decir sin la referencia COM de
microsoft activex data object recordset
Bueno si ejecutas la consulta de esa forma ... si necesariamente se tienen que llamar igual... una forma alternativa es con un comando donde te hagas a mano el CommandText... es decir con un string format y ejecutes el comando.
PHP:
string mensaje=String.Empty;
string proce=String.Format("exec Ins_Clientes({0},{1},{2})",Id.Text,Nombre.Text,mensaje);
Inicia.myCmd = new SqlCommand(proce, Inicia.Conexion);
Inicia.Conexion.Open();
Inicia.Conexion.Open();
Inicia.myCmd.ExecuteReader();
mensaje=Inicia.myCmd.Parameters[2].SqlValue.ToString();
Funciones.Mensaje(mensaje, Pagina.Page); 
Inicia.Conexion.Close();
 
#3
si funciona como dijiste dramms pero el problema es que no me devuelve el valor de la variable Mensaje de tipo Output hay alguna forma de hacer que lo debuelva para mandarlo como un alert
 
#4
Hola bakuno , estaba biendo tu codigo y bueno no se mucho pero la variable @Mensaje solo la utilizas para avisar de que el registro se guardo ? de ser asi x que no al momento de finalizar la operacion en la base de datos pones Messagebox.Show("El registro se guardo correctamente") o lo que deses poner digo si esa es la unica funcion de la variable mensaje.


Espero a ver ayudado :vientos:
 
#6
Para que funcione con exec Ins_Clientes({0},{1},{2})"
debes poner string.format("exec Ins_Clientes '{0}', '{1}', output {3}", var1, var2, var3)
 
Arriba