检查数据库中是否存在

时间:2013-06-19 05:22:27

标签: asp.net database exists

我有一个文本框,其值来自用于生成随机数的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 个答案:

答案 0 :(得分:0)

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

为什么不在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

希望这有帮助。

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

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。