为什么我的 SqlParameter 没有被识别?

Why is my SqlParameter not being recognised?

我收到这个错误:

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

不过我好像给了参数化查询

我的 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;
            }
        }
    }
}

我以为我是在这一行做的:

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

我确定 inputKaraktersoort 有一个值,因为当我在那里放置一个断点时,它说它有正确的值。

错误在这一行:

var reader = command.ExecuteReader();

谁能帮帮我?

根据请求的命令值和inputKarakterSoort:

当我键入此内容时:

 inputKarakterSoort = "Defensive"

以上:connection.Open()

它确实有效,但我想在我的查询中使用我的参数。

我尝试了sgmoore的评论并实现了它。现在可以使用了。

现在这是我的 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)
        {
            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;
            }
        }
    }
}

改为使用

var command = new SqlCommand($"SELECT TOP 2 * FROM Karakter WHERE KarakterSoort = {inputKarakterSoort} ORDER BY NEWID();", connection);