我有一个简单的存储过程,可以在ASP.NET网页上输入字符串时检查重复的条目。
网页包含一个组合框,如果条目已经存在,用户可以在输入时告诉它,因此包含一些自动完成的数据,但是,如果您尝试添加重复项,显然希望捕获并阻止插入
<ajaxToolkit:ComboBox
ID="IngredientInput"
runat="server"
ShowToggleImage="false"
AutoPostBack="false"
AutoCompleteMode="SuggestAppend"
DataSourceID="DsIngredients"
DataTextField="IngredientName"
DataValueField="IngredientID"
MaxLength="0"
>
</ajaxToolkit:ComboBox>
<asp:Button id="Button3" class="btn btn-light" runat="server" OnClick="EditButton_Click" Text="Add" />
<asp:SqlDataSource ID="DsIngredients" runat="server"
ConnectionString="<%$ ConnectionStrings:DB_A0C2A7_KessiesKitchenConnectionString %>"
SelectCommand="SELECT * FROM [Ingredients]"
InsertCommand="InsertIngredient"
InsertCommandType="StoredProcedure">
<InsertParameters>
<asp:ControlParameter Name="IngredientName" ControlID="IngredientInput" PropertyName="text"></asp:ControlParameter>
</InsertParameters>
</asp:SqlDataSource>
从按钮
后面的代码调用SQL数据源protected void EditButton_Click(object sender,EventArgs e)
{
DsIngredients.Insert();
IngredientInput.Text = null;
IngredientInput.SelectedValue = null;
GVIngredientResults.DataBind();
}
正在调用存储过程,其中2个版本都返回相同的结果。
CREATE PROCEDURE [dbo].[InsertIngredient]
@IngredientName NVARCHAR(50)
AS
BEGIN
DECLARE @counter INT
SET @counter = (SELECT COUNT(*) FROM [Ingredients] WHERE IngredientName LIKE @IngredientName)
IF @counter = 0
INSERT INTO [dbo].[Ingredients] ([IngredientName])
VALUES (@IngredientName)
ELSE
RETURN
END
GO
第二版
IF NOT EXISTS (SELECT * FROM [dbo].[Ingredients] WHERE IngredientName = @IngredientName)
INSERT INTO [dbo].[Ingredients] ([IngredientName])
VALUES (@IngredientName)
ELSE
RETURN
在这两种情况下,我觉得其他方面都是多余的,但是出于测试目的而包括在内。我一直在SQL Server上运行一些代码,结果正确。评论和非评论。
DECLARE @IngredientName NVARCHAR(50)
-- DECLARE @counter INT
SET @IngredientName = 'Red Cabbage'
-- SET @counter = (SELECT COUNT(*) FROM [Ingredients] WHERE IngredientName = @IngredientName)
-- IF @counter = 0
IF NOT EXISTS (SELECT * FROM [dbo].[Ingredients] WHERE IngredientName = @IngredientName)
INSERT INTO [dbo].[Ingredients] ([IngredientName])
VALUES (@IngredientName)
ELSE
RETURN
但是,当我运行ASP.NET网页并输入重复的字符串值时,它会为原始值插入recordID
,而不是在没有插入的情况下返回。一旦完成此操作,输入相同的重复值就没有效果。
该问题的现场演示可用,只需在http://kessieskitchen.zedicussoftware.com/IngredientManagement输入现有值,它就会插入原始条目的recordID。
我可能错过了一些简单的事情,但我无法理解为什么会这样做