为DropDownList绑定数据源报错:System.Data.Common.DataRecordInternal无对应属性
DropDownList绑定SQL Server数据的错误分析与修复方案
错误原因
把字段值误设为字段名
你写的Year.DataTextField = reader["Name"].ToString();会读取当前行Name列的具体值(比如2021),并将这个值设置为DataTextField。绑定程序会以此为依据,去数据源里寻找名为"2021"的属性,自然找不到,这就是报错'System.Data.Common.DataRecordInternal' does not contain a property with the name '2021'的根本原因。DataTextField和DataValueField需要的是数据库表的列名字符串,而非列的具体内容。不必要的循环绑定
SqlDataReader本身就是可直接绑定的数据源,不需要通过while(reader.Read())逐行循环。你在循环内重复设置数据源并执行绑定,不仅逻辑错误,还会导致重复操作,最终即便不报错,也只会显示最后一行数据。
修复后的完整代码
string query = @"SELECT Id, Name, Status FROM Period"; // 数据库连接字符串 string connectionString = "Data Source=TEST;Initial Catalog=Test1;Integrated Security=SSPI"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlCommand command = new SqlCommand(query, connection)) { using (SqlDataReader reader = command.ExecuteReader()) { // 直接将reader设为数据源 Year.DataSource = reader; // 指定对应的列名字符串 Year.DataTextField = "Name"; Year.DataValueField = "Id"; // 执行数据绑定 Year.DataBind(); } } }
补充说明
如果需要筛选特定数据(比如仅启用状态的年份),直接在SQL语句中添加WHERE条件即可,例如:
SELECT Id, Name, Status FROM Period WHERE Status = 1
无需在代码中通过循环处理数据。
内容的提问来源于stack exchange,提问作者Mikhail Zhuikov
相关产品推荐
相关产品推荐

