如何在代码后端使用SqlDataAdapter?

3

看起来我的代码不完整或者语法有误,但我已经尽力想出了某种解决方案,但是迄今为止还没有成功……所以这就是我正在尝试做的事情:

我有几个下拉框,希望将每个下拉框选择的值分配给表适配器中的值。以下是到目前为止的代码,但不确定缺少什么:

protected void Page_Load(object sender, EventArgs e)
{
    ID = Convert.ToInt32(Request.QueryString["myID"]);
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString);
    SqlDataAdapter da = new SqlDataAdapter("SELECT NAME, DEPARTMENT, LOCATION from MyTable WHERE ID =  '" + ID + "' ", con);
    DataTable dt= new DataTable();
    da.Fill(dt);

    ddl_Name.SelectedValue = dt[0].Name;
    ddl_DEPARTMENT.SelectedValue = dt[0].DEPARTMENT;
    ddl_LOCATION.SelectedValue = dt[0].LOCATION;
}

当我输入 dt[0].Name 时,问题就开始了,似乎它不喜欢我添加零。 请帮忙解决,谢谢。

1个回答

3

dt 是一个没有索引器的 DataTable,你想要 DataRow 的字段,所以你需要通过 DataTable.Rows[index] 先获取行:

if(dt.Rows.Count > 0)
{
    DataRow row = dt.Rows[0];
    ddl_Name.SelectedValue = row.Field<string>("Name");
    ddl_DEPARTMENT.SelectedValue = row.Field<string>("DEPARTMENT");
    ddl_LOCATION.SelectedValue = row.Field<string>("LOCATION");
}

如果没有一个强类型的DataTable,你无法直接访问该字段。您必须使用DataRow.Field来获取字段的值或旧的弱类型索引器:

object name = row["Name"];
  • 此外,您不应使用字符串拼接来构建SQL查询。您的url参数存在sql注入的风险。请使用SQL参数来防止这种情况。
  • 我假设您正在使用默认的ViewState,那么请将此代码块放在一个!IsPostBack检查中,否则SelectedIndexChanged事件将不会触发,因为用户选择将被旧数据库值覆盖。
protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        ID = Convert.ToInt32(Request.QueryString["myID"]);
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString);
        SqlDataAdapter da = new SqlDataAdapter("SELECT NAME, DEPARTMENT, LOCATION from MyTable WHERE ID =  @ID", con);
        DataTable dt= new DataTable();
        da.SelectCommand.Parameters.AddWithValue("@ID", int.Parse(ID));
        da.Fill(dt);
        // Code above... 
    }   
}

非常感谢,您的解决方案有效了,我很感激您教我一些额外的东西。谢谢。 - moe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接