我的下拉列表绑定到数据库,我希望它允许选择空值。因此,当它被选择时,表中没有任何内容。现在,如果我将该值设置为整数,它就可以工作,但我不希望它以这种方式工作。我怎样才能在 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();
}
您将
string
类型(SQL 中的 NVARCHAR
类型)的值传递给 @ContractID
的存储过程,并且 SQL 参数期望该值应为 INT
类型。
因此,您需要处理以下场景:
当
ContractID
为空/空字符串时,您需要将值作为DBNull.Value
传递。
当
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