2016-07-31 131 views
0

我使用查询生成器插入到LeaveApplication表。据说当我点击申请假时,他们应该有一个消息“申请成功”。相反,我得到这个错误:“无法将NULL值插入列‘STAFFID’,表,列不允许空INSERT失败的语句已终止。”。这可能与我的查询生成器来解决错误有关。但我不知道如何解决它。我将在我的代码下面附上几张图片,并附上错误信息。无法将NULL值插入列“ STAFFID”,表

我的输出:

click image

LeaveApplication DB表:

CREATE TABLE [dbo].[LeaveApplications] (
    [Id]     INT   IDENTITY (1, 1) NOT NULL, 
    [StaffId]   INT   NOT NULL, 
    [LeaveTypeId]  INT   NOT NULL, 
    [StartDate]   VARCHAR (10) NOT NULL, 
    [StartLeavePeriodId] INT   NOT NULL, 
    [EndDate]   VARCHAR (10) NOT NULL, 
    [EndLeavePeriodId] INT   NOT NULL, 
    [NumDays]   FLOAT (53) NOT NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_LeaveApplications_ToStaff] FOREIGN KEY ([StaffId]) REFERENCES [dbo].[Staff] ([StaffId]), 
    CONSTRAINT [FK_LeaveApplications_ToLeaveType] FOREIGN KEY ([LeaveTypeId]) REFERENCES [dbo].[LeaveType] ([Id]), 
    CONSTRAINT [FK_LeaveApplications_ToStartLeavePeriod] FOREIGN KEY ([StartLeavePeriodId]) REFERENCES [dbo].[LeavePeriod] ([LeavePeriodId]), 
    CONSTRAINT [FK_LeaveApplications_ToEndLeavePeriod] FOREIGN KEY ([EndLeavePeriodId]) REFERENCES [dbo].[LeavePeriod] ([LeavePeriodId]) 
); 

ApplyLeave.aspx编码:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ApplyLeave.aspx.cs" Inherits="BookReservation.ApplyLeave" %> 
<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="ajaxToolkit" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContentPlaceHolder" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 

    <h3>Leave Application</h3> 
    <asp:Label ID="lblLeaveType" runat="server" CssClass="labelClass" Text="Leave Type:"></asp:Label> 
    <asp:DropDownList ID="ddlLeaveType" runat="server" Width="200px" DataSourceID="SqlDSLeaveType" DataTextField="Description" DataValueField="Id"> 
    </asp:DropDownList> 
    <br /> 
    <asp:Label ID="Label1" runat="server" CssClass="labelClass" Text="Start Date:"></asp:Label> 
    <asp:TextBox ID="tbStartDate" runat="server" Width="200px"></asp:TextBox> 
    <ajaxToolkit:CalendarExtender ID="CalExtStartDate" runat="server" TargetControlID="tbStartDate" /> 
    <br /> 
    <asp:Label ID="lblStartLeavePeriod" runat="server" CssClass="labelClass" Text="Start Leave Period:"></asp:Label> 
    <asp:DropDownList ID="ddlStartLeavePeriod" runat="server" Width="110px" DataSourceID="SqlDSStartLeavePeriod" DataTextField="Description" DataValueField="LeavePeriodId"> 
    </asp:DropDownList> 
    <br /> 
    <asp:Label ID="lblEndDate" runat="server" CssClass="labelClass" Text="End Date:"></asp:Label> 
    <asp:TextBox ID="tbEndDate" runat="server" Width="200px"></asp:TextBox> 
    <ajaxToolkit:CalendarExtender ID="CalExtEndDate" runat="server" TargetControlID="tbEndDate" /> 
    <asp:CompareValidator ID="cvEndDate" runat="server" ErrorMessage="Select a date" ControlToCompare="tbStartDate" ControlToValidate="tbEndDate" ForeColor="Red"></asp:CompareValidator> 
    <br /> 
    <asp:Label ID="lblEndLeavePeriod" runat="server" CssClass="labelClass" Text="End Leave Period:"></asp:Label> 
    <asp:DropDownList ID="ddlEndLeavePeriod" runat="server" Width="110px" DataSourceID="SqlDSEndLeavePeriod" DataTextField="Description" DataValueField="LeavePeriodId"> 
    </asp:DropDownList> 
    <br /> 
    <br /> 
    <asp:Button ID="btnApply" runat="server" Text="Apply Leave" OnClick="btnApply_Click" /> 
    <br /> 
    <br /> 
    <asp:Label ID="lblOutput" runat="server"></asp:Label> 
    <br /><br /> 
    <asp:SqlDataSource ID="SqlDSLeaveType" runat="server" ConnectionString="<%$ ConnectionStrings:LeaveManagementCS %>" SelectCommand="SELECT * FROM [LeaveType]"></asp:SqlDataSource> 
    <br /> 
    <asp:SqlDataSource ID="SqlDSStartLeavePeriod" runat="server" ConnectionString="<%$ ConnectionStrings:LeaveManagementCS %>" SelectCommand="SELECT * FROM [LeavePeriod]"></asp:SqlDataSource> 
    <br /> 
    <asp:SqlDataSource ID="SqlDSEndLeavePeriod" runat="server" ConnectionString="<%$ ConnectionStrings:LeaveManagementCS %>" SelectCommand="SELECT * FROM [LeavePeriod]"></asp:SqlDataSource> <br /> 
    <asp:SqlDataSource ID="SqlDSApplyLeave" runat="server" ConnectionString="<%$ ConnectionStrings:LeaveManagementCS %>" DeleteCommand="DELETE FROM [LeaveApplications] WHERE [Id] = @Id" InsertCommand="INSERT INTO [LeaveApplications] ([StaffId], [LeaveTypeId], [StartDate], [StartLeavePeriodId], [EndDate], [EndLeavePeriodId], [NumDays]) VALUES (@StaffId, @LeaveTypeId, @StartDate, @StartLeavePeriodId, @EndDate, @EndLeavePeriodId, @NumDays)" SelectCommand="SELECT * FROM [LeaveApplications]" UpdateCommand="UPDATE [LeaveApplications] SET [StaffId] = @StaffId, [LeaveTypeId] = @LeaveTypeId, [StartDate] = @StartDate, [StartLeavePeriodId] = @StartLeavePeriodId, [EndDate] = @EndDate, [EndLeavePeriodId] = @EndLeavePeriodId, [NumDays] = @NumDays WHERE [Id] = @Id"> 
     <DeleteParameters> 
      <asp:Parameter Name="Id" Type="Int32" /> 
     </DeleteParameters> 
     <InsertParameters> 
      <asp:Parameter Name="StaffId" Type="Int32" /> 
      <asp:ControlParameter ControlID="ddlLeaveType" Name="LeaveTypeId" PropertyName="SelectedValue" Type="Int32" /> 
      <asp:ControlParameter ControlID="tbStartDate" Name="StartDate" PropertyName="Text" Type="String" /> 
      <asp:ControlParameter ControlID="ddlStartLeavePeriod" Name="StartLeavePeriodId" PropertyName="SelectedValue" Type="Int32" /> 
      <asp:ControlParameter ControlID="tbEndDate" Name="EndDate" PropertyName="Text" Type="String" /> 
      <asp:ControlParameter ControlID="ddlEndLeavePeriod" Name="EndLeavePeriodId" PropertyName="SelectedValue" Type="Int32" /> 
      <asp:Parameter Name="NumDays" Type="Double" /> 
     </InsertParameters> 
     <UpdateParameters> 
      <asp:Parameter Name="StaffId" Type="Int32" /> 
      <asp:Parameter Name="LeaveTypeId" Type="Int32" /> 
      <asp:Parameter Name="StartDate" Type="String" /> 
      <asp:Parameter Name="StartLeavePeriodId" Type="Int32" /> 
      <asp:Parameter Name="EndDate" Type="String" /> 
      <asp:Parameter Name="EndLeavePeriodId" Type="Int32" /> 
      <asp:Parameter Name="NumDays" Type="Double" /> 
      <asp:Parameter Name="Id" Type="Int32" /> 
     </UpdateParameters> 
    </asp:SqlDataSource><br /> 

</asp:Content> 

ApplyLeave.aspx.cs编码:

public partial class ApplyLeave : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      CalExtStartDate.StartDate = DateTime.Today; 
     } 

     protected void btnApply_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       SqlDSApplyLeave.Insert(); 
       lblOutput.Text = "Application success"; 
      } 
      catch(Exception ex) 
      { 
       lblOutput.Text = ex.Message; 
      } 

     } 
    } 

InsertQuery:

click image

+0

似乎很清楚,你是不是提供一个STAFFID值。解决方案是为StaffId提供一个值,或者在创建列时删除“not null”。 – mason

+1

您需要提供STAFFID为这对维护表之间的引用完整性的值。如果您允许StaffId的空值,那么在此表中填写此列没有任何意义,因为不能保证您始终从此处获得staffID。 – Dileep

+0

你已经引用了LeavApplications中的staffid,所以你应该只将数据插入到员工表中的数据中,因此你不能插入空值只是检查员工ID的值你是怎么传递的 –

回答

0

取下,STAFFID NOT NULL,所以更改此:

[StaffId]   INT   NOT NULL, 

这样:

[StaffId]   INT   , 

和你的外键也必须允许NULL这里:

CONSTRAINT [FK_LeaveApplications_ToStaff] FOREIGN KEY ([StaffId]) REFERENCES [dbo].[Staff] ([StaffId]), 
+0

我相信制作CONSTRAINT StaffId null会在表格之间产生长期的数据不一致。 StaffId似乎是Staff表中的主键。 – Dileep

+0

是的......你说得对... – 2016-07-31 02:47:11

相关问题