ASP.NET WebForms从SQL Server取表名到下拉框并填充GridView问题
问题排查与修复方案
一、下拉框表名不可读的问题
你当前用con.GetSchema()获取的是数据库全部架构元数据,并非仅表名集合,所以row[2]取到的不是正确表名。正确做法是指定获取表的架构信息:
protected void Page_Load(object sender, EventArgs e) { // 仅首次加载时绑定下拉框,避免回发重复添加表名 if (!IsPostBack) { using (SqlConnection con = new SqlConnection("Data Source=SQLD1.ad.shared;Initial Catalog=TestDeployment;Persist Security Info=True;User ID=<UserId>")) { con.Open(); // 过滤获取用户自定义表(排除系统表) DataTable schema = con.GetSchema("Tables", new[] { null, null, null, "BASE TABLE" }); foreach (DataRow row in schema.Rows) { // 直接取TABLE_NAME字段,保证表名准确可读 DropDownList2.Items.Add(row["TABLE_NAME"].ToString()); } } } }
务必给DropDownList设置
AutoPostBack="True",否则选择表名不会触发回发事件;同时绑定逻辑要放在!IsPostBack判断内,避免重复添加数据。
二、GridView未显示的问题
你的代码存在3个关键错误:
fillgridview仅设置数据源,未调用DataBind()触发渲染;- 触发数据填充的事件绑定错误,应绑定到DropDownList的
SelectedIndexChanged,而非GridView的同名事件; - SQL语句缺少空格,会导致
SELECT * FROMTableName这类语法错误。
修复后的代码:
protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e) { fillgridview(); } public void fillgridview() { using (SqlConnection con = new SqlConnection("Data Source=SQLD1.ad.shared;Initial Catalog=TestDeployment;Persist Security Info=True;User ID=<UserId>")) { con.Open(); // 用QUOTENAME处理表名,避免特殊字符报错+防范SQL注入 string sql = $"SELECT * FROM {QUOTENAME(@TableName)}"; SqlDataAdapter da = new SqlDataAdapter(sql, con); da.SelectCommand.Parameters.AddWithValue("@TableName", DropDownList2.SelectedValue); DataTable dt = new DataTable(); da.Fill(dt); GridView1.DataSource = dt; // 必须调用DataBind()才能渲染数据到GridView GridView1.DataBind(); } }
三、其他优化点
- 资源释放:用
using块包裹数据库连接、数据适配器等资源,确保自动释放,避免连接池耗尽; - 移除多余控件:你手动添加的SQL数据源会和代码逻辑冲突,建议删除页面上的SQL数据源控件,完全用代码控制数据绑定;
- 错误捕获:可以添加
try-catch块捕获数据库操作异常,方便排查问题。
内容的提问来源于stack exchange,提问作者Shubh kumar
相关产品推荐
相关产品推荐

