我有一个使用RadGrid
的telerik SqlDataSource
。
我为insert / select / update语句等设置了参数,但在尝试添加新记录时,我收到了这个错误......
Cannot insert the value NULL into column 'fld_title', table 'DB_Tests.dbo.tbl_posts'; column does not allow nulls. INSERT fails.
The statement has been terminated.
修改
我的问题最初可能不清楚 - 我实际上并不想在数据库中输入空值,我想添加使用add new record
命令选项输入的数据。
所以我的问题是......
为什么我得到空值而不是我输入的数据?
这是我的完整代码。
<telerik:RadGrid id="pageGrid" runat="server"
AutoGenerateColumns="false"
DataSourceID="pageSrc"
AutoGenerateDeleteColumn="false"
AutoGenerateEditColumn="true"
AllowAutomaticInserts="true"
AllowAutomaticUpdates="true"
BackColor="#d9e8ff"
BorderColor="#000066"
>
<MasterTableView CommandItemDisplay="Top">
<Columns>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_title" HeaderText="Title" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_short_desc" HeaderText="Short Description" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_text" HeaderText="Text" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_cat" HeaderText="Category" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_live" HeaderText="Live?" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
<asp:SqlDataSource ID="pageSrc" runat="server"
ConnectionString="<%$ ConnectionStrings:localTest %>"
DeleteCommand="DELETE FROM tbl_posts WHERE pk_ID = @pk_ID"
InsertCommand="INSERT INTO [tbl_posts] VALUES (@title, @short_desc, @text, @cat, @live)"
SelectCommand="SELECT [pk_ID], [fld_title], [fld_short_desc], [fld_text], [fld_cat] , fld_live FROM [tbl_posts]"
UpdateCommand="UPDATE [tbl_posts] SET [fld_title] = @title, [fld_short_desc] = @short_desc, [fld_text] = @text, [fld_cat] = @cat, [fld_live] = @live WHERE [pk_ID] = @pk_ID">
<DeleteParameters>
<asp:Parameter Name="pk_ID" Type="Int32"></asp:Parameter>
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="pk_ID" Type="Int32" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="title" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="short_desc" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="text" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="cat" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="live" Type="Boolean" ConvertEmptyStringToNull="false"></asp:Parameter>
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="pk_ID" Type="Int32" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="title" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="short_desc" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="text" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="cat" Type="String" ConvertEmptyStringToNull="false"></asp:Parameter>
<asp:Parameter Name="live" Type="Boolean" ConvertEmptyStringToNull="false"></asp:Parameter>
</UpdateParameters>
</asp:SqlDataSource>
修改 我已经读过人们有类似问题的其他问题,但是他们都通过正确配置参数来解决,我相信我的。
有人能指出我正确的方向吗?
答案 0 :(得分:0)
添加验证并错误处理ItemInserted和InsertCommand事件:http://demos.telerik.com/aspnet-ajax/grid/examples/data-editing/automatic-crud-operations/defaultcs.aspx 网格无法为您验证缺失值,因此您必须处理此问题。
为了进一步说明这一点 - 考虑通过网格事件自己创建数据源操作,这样您就可以轻松验证内容,而不是使用自动操作:http://demos.telerik.com/aspnet-ajax/grid/examples/data-editing/manual-crud-operations/defaultcs.aspx
此外,您可以自己定义编辑表单,这样您就可以使用更多的compex控件并添加客户端验证以防止不需要的回发:http://demos.telerik.com/aspnet-ajax/grid/examples/data-editing/form-template-update/defaultcs.aspx
答案 1 :(得分:0)
您的UniqueName属性必须与参数名称相同。
<Columns>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_title" UniqueName="title" HeaderText="Title" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_short_desc" UniqueName="short_desc" HeaderText="Short Description" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_text" UniqueName="text" HeaderText="Text" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_cat" UniqueName="cat" HeaderText="Category" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
<telerik:GridBoundColumn runat="server" AllowSorting="true" DataField="fld_live" UniqueName="live" HeaderText="Live?" HeaderStyle-BackColor="#ff66ff"></telerik:GridBoundColumn>
</Columns>
您似乎也缺少用作参数的PK_ID字段。您需要添加GridBoundColumn以便CRUD操作找到它,然后确保UniqueName属性反映参数名称。
答案 2 :(得分:-3)
转到SQL Server Management并选择该表并允许空值。这将解决问题。