允许选择空白或空的下拉列表

问题描述 投票:0回答:1

我的下拉列表绑定到数据库,我希望它允许选择空值。因此,当它被选择时,表中没有任何内容。现在,如果我将该值设置为整数,它就可以工作,但我不希望它以这种方式工作。我怎样才能在 asp.net 中以最简单的方式以编程方式完成此操作。我能够将空白插入下拉列表中,但是当我单击插入按钮时,它不会将空值插入到表中。我不断收到错误消息,要么显示错误将 Nvarchar 转换为 int,要么显示 Fk 约束消息,我相信这是由于数据库不允许插入不在数据库表中的内容。

这是我用来创建空白的代码:

<asp:DropDownList ID="DDlContract" runat="server" DataSourceID="SqlDataSource1" DataTextField="ContractName" DataValueField="ContractID" Width="200px" AppendDataBoundItems="True">
         <Items>
<asp:ListItem Text="" value =""></asp:ListItem>

我试过了:

<asp:DropDownList ID="DDlContract" runat="server" DataSourceID="SqlDataSource1" DataTextField="ContractName" DataValueField="ContractID" Width="200px" AppendDataBoundItems="True">
         <Items>
<asp:ListItem Text="" value =""></asp:ListItem>

我期待它允许我插入空值

Here is my insert code:


  protected void Page_Load(object sender, EventArgs e)
  {

           

      Databinder();
  }
  protected void BtnNew_Click(object sender, EventArgs e)
  {
          string GPOEmailID = TxtGPO.Text;
          string LastName = TxtLname.Text;
          string FirstName = TxtFname.Text;
          string WorkPhone = TxtWork.Text;
          string ContractID = DDlContract.SelectedValue.ToString();
          string JobSeriesID = DDlJob.SelectedValue.ToString();
          string PositionID = DDlPosition.SelectedValue.ToString();
          string PersonalPhone = TxtPersonal.Text;
          string SupervisorGPOEmailID = DDlSupervisor.SelectedValue.ToString();
          string EmpCatID = DDlCat.SelectedValue.ToString();
          string EmpStatusID = DDlStatus.SelectedValue.ToString();
          string EmployeeRoleID = DDlRole.SelectedValue.ToString();

          con.Open();
          SqlCommand cmd = new SqlCommand("dbo.spNewEmployeeList ", con);
          cmd.CommandType = CommandType.StoredProcedure;
          cmd.Parameters.AddWithValue("@GPOEmailID ", GPOEmailID);

          cmd.Parameters.AddWithValue("@LastName ", LastName);
          cmd.Parameters.AddWithValue("@FirstName ", FirstName);
          cmd.Parameters.AddWithValue("@WorkPhone ", WorkPhone);
          cmd.Parameters.AddWithValue("@ContractID ", ContractID);
          cmd.Parameters.AddWithValue("@JobSeriesID ", JobSeriesID);
          cmd.Parameters.AddWithValue("@PositionID  ", PositionID);
          cmd.Parameters.AddWithValue("@PersonalPhone ", PersonalPhone);
          cmd.Parameters.AddWithValue("@SupervisorGPOEmailID ", SupervisorGPOEmailID);
          cmd.Parameters.AddWithValue("@EmpCatID ", EmpCatID);
          cmd.Parameters.AddWithValue("@EmpStatusID ", EmpStatusID);
          cmd.Parameters.AddWithValue("@EmployeeRoleID ", EmployeeRoleID);



          cmd.ExecuteNonQuery();

          con.Close();
          GridView1.DataBind();
          LoadRecord();
      }
c# asp.net webforms
1个回答
0
投票

您将

string
类型(SQL 中的
NVARCHAR
类型)的值传递给
@ContractID
的存储过程,并且 SQL 参数期望该值应为
INT
类型。

因此,您需要处理以下场景:

  1. ContractID
    为空/空字符串时,您需要将值作为
    DBNull.Value
    传递。

  2. ContractID
    有值时,需要将其转换为整数。

cmd.Parameters.AddWithValue("@ContractID ", String.IsNullOrEmpty(ContractID)
    ? (object)DBNull.Value
    : Convert.ToInt32(ContractID));

在此社区中,我们建议为参数提供值和类型,而不是仅通过

AddWithValue()
提供值。您可以阅读这篇文章:AddWithValue 是邪恶的

cmd.Parameters.Add("@ContractID", SqlDbType.Int).Value = String.IsNullOrEmpty(ContractID)
    ? (object)DBNull.Value
    : Convert.ToInt32(ContractID);

另外,请注意,应使用

ContractID
参数修改您的存储过程以允许为空。由于它是可为空且可选的,因此该参数需要放置在末尾(强制/不可为空参数排在前面)。

CREATE PROCEDURE dbo.spNewEmployeeList
  -- Other Parameters,
  ContractID INT = NULL
© www.soinside.com 2019 - 2024. All rights reserved.