Search code examples
c#sql-serverdata-access-layersqlcommand

Why is my SqlParameter not being recognised?


I am getting this error:

System.Data.SqlClient.SqlException: 'The parameterized query '(@inputKarakterSoort varchar(8000))SELECT TOP 2 * FROM Karakter ' expects the parameter '@inputKarakterSoort', which was not supplied.

But I think I have given the parameterized query.

My DAL:

public class SortedKarakterContext : ISortedKarakterContext
{
        public string conn { get; set; }

        public SortedKarakterContext()
        {
            this.conn = "MYCONNECTIONSTRING";
        }

        private SqlConnection GetConnection()
        {
            return new SqlConnection(conn);
        }

        public IEnumerable<KarakterDTO> GetSortedKarakters(string inputKarakterSoort)//User input was not supplied?? Hoe veranderen
        {
            using (SqlConnection connection = GetConnection())
            {
                connection.Open();
                var command = new SqlCommand("SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = @inputKarakterSoort ORDER BY NEWID();", connection);
                command.Parameters.Add("@inputKarakterSoort", SqlDbType.VarChar).Value = inputKarakterSoort;
                var reader = command.ExecuteReader();
                var sortedKarakters = new List<KarakterDTO>();

                while (reader.Read())
                {
                    var karakter = new KarakterDTO
                    {
                        KarakterId = (int)reader["KarakterId"],
                        KarakterSoort = reader["KarakterSoort"]?.ToString(),
                        KarakterNaam = reader["KarakterNaam"]?.ToString()
                    };

                    sortedKarakters.Add(karakter);
                }

                return sortedKarakters;
            }
        }
    }
}

I thought I did that at this line:

   command.Parameters.Add("@inputKarakterSoort", SqlDbType.VarChar).Value = inputKarakterSoort;

I am sure that inputKaraktersoort has a value because when I put a breakpoint there it says it has the right value.

The error is on this line:

var reader = command.ExecuteReader();

Can anyone help me?

As requested the value of the command and the inputKarakterSoort: Values

When I type this:

 inputKarakterSoort = "Defensive"

above: connection.Open()

It does work, but I want my parameter in my query.


Solution

  • I tried the comment of sgmoore and implemented it. It works now.

    This is my DAL now:

    public class SortedKarakterContext : ISortedKarakterContext
    {
            public string conn { get; set; }
    
            public SortedKarakterContext()
            {
                this.conn = "MYCONNECTIONSTRING";
            }
    
            private SqlConnection GetConnection()
            {
                return new SqlConnection(conn);
            }
    
            public IEnumerable<KarakterDTO> GetSortedKarakters(string inputKarakterSoort)
            {
                using (SqlConnection connection = GetConnection())
                {
                    connection.Open();
                    var command = new SqlCommand("SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = @inputKarakterSoort ORDER BY NEWID();", connection);
                    if (inputKarakterSoort == null)         
                         command.Parameters.Add("@inputKarakterSoort", SqlDbType.VarChar).Value = DBNull.Value;     
                    else        
                         command.Parameters.Add("@inputKarakterSoort", SqlDbType.VarChar).Value = inputKarakterSoort;
                    var reader = command.ExecuteReader();
                    var sortedKarakters = new List<KarakterDTO>();
    
                    while (reader.Read())
                    {
                        var karakter = new KarakterDTO
                        {
                            KarakterId = (int)reader["KarakterId"],
                            KarakterSoort = reader["KarakterSoort"]?.ToString(),
                            KarakterNaam = reader["KarakterNaam"]?.ToString()
                        };
    
                        sortedKarakters.Add(karakter);
                    }
    
                    return sortedKarakters;
                }
            }
        }
    }