DropDownList 中的值不会保存到 SQL Server 表中

Posted

技术标签:

【中文标题】DropDownList 中的值不会保存到 SQL Server 表中【英文标题】:Value from DropDownList will not save into SQL Server table 【发布时间】:2021-11-26 06:32:17 【问题描述】:

我有一个 DropDownList,它由名为 tblVisa 的 SQL Server 表填充。我的问题是从 SQL Server 表中填充的值没有被保存。除了我的 DropDownLists 之外,其他所有内容都会被保存。我试过使用.SelectedValue.Text,但还是不行。

这是我的代码

protected void PopulateVisaType()

        List<ListItem> result = new List<ListItem>  new ListItem("", "") ;

        SqlCommand cmd = new SqlCommand()  Connection = sqlConn, CommandText = "SELECT VisaType FROM tblVisa ORDER BY VisaType ASC" ;

        if (sqlConn.State == ConnectionState.Closed) 
        
            sqlConn.Open(); 
        

        SqlDataReader read = cmd.ExecuteReader();

        while (read.Read())
        
            result.Add(new ListItem(read["VisaType"].ToString(), read["VisaType"].ToString()));
        

        read.Close();
        sqlConn.Close();
        cmd.Dispose();

        DDLVisa.DataSource = result;
        DDLVisa.DataValueField = "value";
        DDLVisa.DataTextField = "text";
        DDLVisa.DataBind();

这是我将信息保存到数据库中的代码:

protected void LbSaveProfile_Click(object sender, EventArgs e)

    SqlCommand cmd = new SqlCommand()  Connection = sqlConn, CommandText = "spSaveNewProviderInformation", CommandType = CommandType.StoredProcedure ;

    if (sqlConn.State == ConnectionState.Closed)
     
        sqlConn.Open(); 
    

    cmd.Parameters.AddWithValue("@EmployeeNumber", TbEmployeeNumber.Text.Trim());
    cmd.Parameters.AddWithValue("@SSN", TbSSN.Text.Trim());
    cmd.Parameters.AddWithValue("@ContractType", DDLContractType.SelectedItem.Value);
    cmd.Parameters.AddWithValue("@Firstname", TbFirstname.Text.Trim());
    cmd.Parameters.AddWithValue("@Lastname", TbLastname.Text.Trim());
    cmd.Parameters.AddWithValue("@MiddleInitial", TbMiddleInitial.Text.Trim());
    cmd.Parameters.AddWithValue("@ContractRenewalDate", TbContractRenewalDate.Text.Trim());
    cmd.Parameters.AddWithValue("@Position", DDLPosition.Text.Trim());
    cmd.Parameters.AddWithValue("@Specialty", DDLSpecialty.Text.Trim());
    cmd.Parameters.AddWithValue("@PrimaryDepartment", DDLPrimaryDepartment.Text.Trim());
    cmd.Parameters.AddWithValue("@SecondaryDepartment", DDLSecondaryDepartment.Text.Trim());
    cmd.Parameters.AddWithValue("@Gender", DDLGender.Text.Trim());
    cmd.Parameters.AddWithValue("@Birthdate", TbBirthdate.Text.Trim());
    cmd.Parameters.AddWithValue("@EmailAddress", TbEmailAddress.Text.Trim());
    cmd.Parameters.AddWithValue("@PhoneNumber", TbPhoneNumber.Text.Trim());
    cmd.Parameters.AddWithValue("@Address", TbAddress.Text.Trim());
    cmd.Parameters.AddWithValue("@PassportNumber", TbPassportNumber.Text.Trim());
    cmd.Parameters.AddWithValue("@Citizenship", DDLCitizenship.Text.Trim());
    cmd.Parameters.AddWithValue("@Visa", DDLVisa.Text.Trim());
    cmd.Parameters.AddWithValue("@Status", 1);

    cmd.ExecuteNonQuery();

    sqlConn.Close();

    Alert("Provider Information saved!");

    ClearControls();

【问题讨论】:

您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果... 你调试过你的代码吗? DDLVisa.Text 和其他 DDL 文本有什么价值? 试试(ListItem)DDLVisa.SelectedValue。旁注:您的连接、命令和阅读器需要using 块。不缓存连接 @Chetan 是的,我添加了一个断点来帮助我跟踪代码。对于我所有的 DDL 文本,它们都是空字符串。 【参考方案1】:

最好为下拉列表提供列名。

所以,这样说:

    protected void PopulateVisaType()
    
        SqlConnection sqlConn = new SqlConnection("");

        using (SqlCommand cmd = new SqlCommand("SELECT VisaType FROM tblVisa ORDER BY VisaType ASC", sqlConn))
        
            if (sqlConn.State == ConnectionState.Closed)
            
                sqlConn.Open();
            

            DDLVisa.DataSource = cmd.ExecuteReader();
            DDLVisa.DataValueField = "VisaType";
            DDLVisa.DataTextField = "VisaType";

            DDLVisa.DataBind();
            //DDLVisa.Items.Insert(0, new ListItem(""));   // optional blank row choice

            sqlConn.Close();
        
    

所以 TextField 和 DataText 字段需要是来自数据源的命名列。

如果您需要/想要/期望别无选择,我还提供了一个可选的第一个空白选项。

但是,请记住,如果您不允许(或不希望)空字符串,并且希望该值具有空值,则该空字符串应在数据库中转换为空值。这适用于您的所有价值观。 (也许存储过程会这样做?)。

【讨论】:

以上是关于DropDownList 中的值不会保存到 SQL Server 表中的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 使用视图中的值填充 DropDownList

asp.net怎样把数据库中字段的值绑定到dropdownlist上,

在@Html.DropDownList 中从控制器端绑定下拉列表选择的值

如何使用 jQuery 设置 DropDownList 的值?

如何将RequiredFieldValidator 添加到DropDownList 控件?

多次点击Button后DropDownList选中的值变为默认值?