从ASP.NET

时间:2018-06-08 10:35:50

标签: sql asp.net sql-server stored-procedures

我有一个简单的存储过程,可以在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。

我可能错过了一些简单的事情,但我无法理解为什么会这样做

0 个答案:

没有答案