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

标签 c# sql-server data-access-layer sqlcommand

我收到这个错误:

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: Values

当我输入这个时:

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

关于c# - 为什么我的 SqlParameter 没有被识别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64772693/

相关文章:

c# - 是否有一个强制转换可以让我动态设置控件类型,而不是为每个控件类型创建 if() ?

sql - 更改列默认值

c# - 我需要确保应用程序使用最少数量的数据库连接

database - 长期交易是否可以接受?

c# - 使用 LINQ 处理文本文件

c# - 使用 64 位项目中的 32 位库 - .NET

sql-server - 结合 DB 和 Lucene 搜索的最佳实践

python - 通过子进程备份 SQL 数据库时出现操作系统错误 123

c# - WPF/.NET 数据访问模型 - 资源推荐

c# - 在Gtk#应用程序中将全局异常处理程序放在哪里?