检查数据库中是不是存在

Posted

技术标签:

【中文标题】检查数据库中是不是存在【英文标题】:check if exist in database检查数据库中是否存在 【发布时间】:2013-06-19 05:22:27 【问题描述】:

我有一个文本框,其值来自用于生成随机数的 jquery 函数。现在我要做的是检查复选框的值(随机数)是否存在于数据库中。如果它存在于数据库中,生成的随机数不会发布在文本框中,而是会重新生成新的随机数,直到它产生一个尚未保存在数据库中的数字..

这是我的标记:

<p>
<label>Reference Code:</label>
<span class="field">
<asp:TextBox ID="GenerateCode" runat="server" CssClass="smallinput random" CausesValidation="True" Enabled="False"></asp:TextBox>
<asp:HiddenField ID="txthidden" runat="server" />
<br /><small style="color: red">Please write the code at the back of yours check</small>
</span>
</p>

这是我的 jquery 函数:

        function randomString()
        
            var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
            var result = '';
            for (var i = 8; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
            return result;
        

        function generateRandomNumber() 
            var rndStr = randomString();
            $("#<%=GenerateCode.ClientID%>").val(rndStr);
            $("#<%=txthidden.ClientID%>").val(rndStr);

        

        window.onload = function () 
            generateRandomNumber();
        

这是我将其保存到数据库的方法:

    string EchequeMaster = ClassEmailCheque.InsertEmailCheque(SenderID, Convert.ToInt32(ddlCurrency.SelectedIndex), Convert.ToDecimal(Amount.Text), ChequeNumber.Text, code2, PendingStatus, DateTime.Now);

这是 InsertEmailCheque 的代码:

        string retEcheque = "";
        string EchequeSQL = "INSERT INTO ServiceVirtualAccountEmailCheck (SenderID, CurrencyID, Amount, ChequeNo, ReferenceNo, Status, DateCreated) "
                          + "VALUES (@SenderID, @CurrencyID, @Amount, @ChequeNo, @ReferenceNo, @Status, @DateCreated)";

        string[] param =  "@SenderID", "@CurrencyID", "@Amount", "ChequeNo", "@ReferenceNo", "@Status", "@DateCreated" ;
        object[] paramVal =  SenderID, CurrencyID, Amount, ChequeNo, ReferenceNo, Status, DateCreated ;

        try
        
            ClassDBQuery.ExecNonQuery(EchequeSQL, param, paramVal);
        
        catch (Exception ex)
        
            retEcheque = ex.Message;
        

        return retEcheque;

请帮忙.. 谢谢你。。

【问题讨论】:

【参考方案1】:

我建议你宁愿在你的存储过程中生成这个数字。

与其在 ASP 中直接调用 INSERT 语句,不如创建一个过程来生成 AutoNum 并检查它是否存在于数据库中,如果不存在则使用它?

CREATE PROC InsertEmailCheque
(
@SenderID INT, @CurrencyID INT, @Amount FLOAT, @ChequeNo INT, @ReferenceNo NVARCHAR(126), @Status NVARCHAR(MAX), @DateCreated DATETIME
)
AS
BEGIN
    DECLARE @AutoNum INT
    DECLARE @IsValid BIT

    SET @IsValid = 0

    WHILE @IsValid = 0
    BEGIN
        SELECT @AutoNum = CONVERT(NUMERIC(8,0),RAND() * 99999999) + 10000000

        IF NOT EXISTS (SELECT AutoNum FROM ServiceVirtualAccountEmailCheck WHERE AutoNum = @AutoNum)
            SET @IsValid = 1
    END

    INSERT INTO ServiceVirtualAccountEmailCheck (AutoNum, SenderID, CurrencyID, Amount, ChequeNo, ReferenceNo, [Status], DateCreated)
    VALUES (@AutoNum, @SenderID, @CurrencyID, @Amount, @ChequeNo, @ReferenceNo, @Status, @DateCreated)

    SELECT @AutoNum
END

我不知道您会将 AutoNum 与哪个列一起使用,因此我假设有一个名为 AutoNum 的新列。您可以看到我如何使用该 AutoNum 列来检查数字是否存在,然后将 @IsValid 设置为 1,以便我们可以突破 WHILE LOOP

希望这会有所帮助。

添加(对于非存储过程环境):

var _result = ClassDBQuery.ExecuteQuery(@"DECLARE @AutoNum INT
                DECLARE @IsValid BIT

                SET @IsValid = 0

                WHILE @IsValid = 0
                BEGIN
                    SELECT @AutoNum = CONVERT(NUMERIC(8,0),RAND() * 99999999) + 10000000

                    IF NOT EXISTS (SELECT AutoNum FROM Tests1 WHERE AutoNum = @AutoNum)
                        SET @IsValid = 1
                END

                INSERT INTO Tests1 (AutoNum) VALUES (@AutoNum);

                SELECT @AutoNum");

        lblResult.Text = Convert.ToString(_result.Tables[0].Rows[0][0]);

在上面的示例中,我执行语句并返回一个数据集,该数据集有 1 列,1 行。我相信你可以让它直接返回 1 个值。

然后可以使用这个值,在我的例子中,它被转换成一个字符串并传递给 lblResult。

【讨论】:

我们的项目没有使用存储过程.. :(

以上是关于检查数据库中是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

检查firebase数据库中是不是存在值

如何检查 scapy 数据包中是不是存在层?

检查数据库中是不是存在

如何检查某个数据是不是已存在于firestore中

Firebase 存储安全规则:检查是不是存在另一个对象/检查对象的元数据

如何检查数据库中是不是存在表或列?