Check the value of cliente.Nombre (and the others) to ensure it is not null
. If you need to insert a NULL value, use DBNull.Value. Also, avoid using AddWithValue.
Microsoft.Data.SqlClient.SqlException: 'Procedure or function 'USP_GUARDAR_CLIENTE' expects parameter '@Nombre', which was not supplied.'
Carlos J. Paco Quezada
5
Reputation points
I use Visual Studio Community 2022 and SQL Server Management Studio M 2019
CONTROLLER:
using System.Data;
using Microsoft.AspNetCore.Mvc;
using Capa.Datos;
using Capa.Modelo;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
namespace CPV_SistemaWeb.Controllers
{
public class ClientesController : Controller
{
private readonly IConfiguration config;
public ClientesController(IConfiguration _config)
{
config = _config;
}
public IActionResult Index()
{
return View();
}
public JsonResult Obtener()
{
List<Cliente> Lista = CD_Clientes.Instancia.OBTENERCLIENTE();
return Json(new { data = Lista });
}
public JsonResult Guardar(Cliente cliente)
{
string connectionString = config.GetConnectionString("CadenaSQL");
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("USP_GUARDAR_CLIENTE", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@Nombre", cliente.Nombre);
command.Parameters.AddWithValue("@TipoDocumento", cliente.TipoDocum);
command.Parameters.AddWithValue("@NumeroDocumento", cliente.NumDocum);
command.Parameters.AddWithValue("@Direccion", cliente.Direccion);
command.Parameters.AddWithValue("@Telefono", cliente.Telefono);
command.Parameters.AddWithValue("@Email", cliente.Email);
command.Parameters.AddWithValue("@Activo", cliente.Activo);
command.ExecuteNonQuery();
}
}
return Json(new { success = true });
}
}
}
SQL Server:
--TABLA CLIENTES
if not exists (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Clientes')
create table Clientes(
IdCliente int primary key identity(1,1),
Nombre Varchar (40),
TipoDocum Varchar (10),
NumDocum int,
Direccion Varchar (40),
Telefono int,
Email Varchar (40) ,
Activo bit,
FechaRegistro datetime default getdate() );
STORED PROCEDURE:
CREATE PROCEDURE USP_GUARDAR_CLIENTE
@Nombre VARCHAR(40),
@TipoDocum VARCHAR(10),
@NumDocum INT,
@Direccion VARCHAR(40),
@Telefono INT,
@Email VARCHAR(40),
@Activo BIT,
@Resultado INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
IF NOT EXISTS (SELECT * FROM Clientes WHERE NumDocum = @NumDocum)
BEGIN
INSERT INTO Clientes (Nombre, TipoDocum, NumDocum, Direccion, Telefono, Email, Activo)
VALUES (@Nombre, @TipoDocum, @NumDocum, @Direccion, @Telefono, @Email, @Activo);
SET @Resultado = 1; -- Inserción exitosa
END
ELSE
BEGIN
SET @Resultado = 0; -- Registro ya existe, no se realiza la operación
END
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SET @Resultado = 0; -- Error durante la operación
END CATCH;
END
2 answers
Sort by: Most helpful
-
Dan Guzman 9,211 Reputation points
2023-06-30T10:01:26.27+00:00 -
Olaf Helper 40,901 Reputation points
2023-06-30T10:05:32.2133333+00:00 C#: command.Parameters.AddWithValue("@ NumeroDocumento", cliente.NumDocum); Stored procedure: @ NumDocum INT,
And as may follow up failure: parameter names are different: C# NumeroDocumento vs SQL NumDocum