0

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

请帮忙。。谢谢。。

4

1 回答 1

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.

希望这可以帮助。

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

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。

于 2013-06-19T06:59:53.133 回答