¿Debe declarar la variable escalar @Id?

Así que estoy tratando de obtener mis “Clientes” de mi base de datos, pero recibo una excepción

Se produjo una excepción del tipo ‘System.Data.SqlClient.SqlException’ en System.Data.dll pero no se manejó en el código de usuario

Información adicional: debe declarar la variable escalar "@Id" .

  using Core; using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DatabaseAccess { public class DbCustomer { private string ConnectionString = ConfigurationManager.ConnectionStrings["local"].ConnectionString; private SqlConnection connection { get; set; } public DbCustomer() { connection = new SqlConnection(ConnectionString); } public Customer GetCustomer(int Id) { Customer customer = null; connection.Open(); using (SqlCommand command = connection.CreateCommand()) { command.CommandText = "SELECT * FROM CUSTOMER WHERE Id = @Id;"; var reader = command.ExecuteReader(); while (reader.Read()) { customer = new Customer(); customer.Id = reader.GetInt32(reader.GetOrdinal("Id")); customer.FirstName = reader.GetString(reader.GetOrdinal("FirstName")); customer.LastName = reader.GetString(reader.GetOrdinal("LastName")); customer.Address = reader.GetString(reader.GetOrdinal("Address")); } command.ExecuteNonQuery(); connection.Close(); } return customer; } } } using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace Core { [DataContract] public class Customer { [DataMember] public int Id { get; set; } [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } [DataMember] public string Address { get; set; } [DataMember] public string Country { get; set; } [DataMember] public string PhoneNumber { get; set; } } } using Core; using DatabaseAccess; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BusinessLogic { public class CustomerController { public DbCustomer DbCustomer { get; set; } public CustomerController() { DbCustomer = new DbCustomer(); } public Customer GetCustomer(int Id) { return DbCustomer.GetCustomer(Id); } } } using BusinessLogic; using Core; using DatabaseAccess; using System.Collections.Generic; namespace WCF { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together. public class CustomerService : ICustomerService { CustomerController CustomerController = new CustomerController(); public Customer GetCustomer(int Id) { return CustomerController.GetCustomer(Id); } public List GetCustomers() { return new List(); } } } using Core; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WCF { // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together. [ServiceContract] public interface ICustomerService { [OperationContract] Customer GetCustomer(int Id); [OperationContract] List GetCustomers(); } } 

Debe agregar un SqlParameter con el nombre @Id

 command.CommandText = "SELECT * FROM CUSTOMER WHERE Id = @Id;"; command.Parameters.Add("@Id", SqlDbType.Int32).Value = Id; 

Necesitas pasar un parámetro:

 command.CommandText = "SELECT * FROM CUSTOMER WHERE Id = @Id;"; command.Parameters.Add("@Id", SqlDbType.Int).Value = Id; var reader = command.ExecuteReader();