我有一个文本框,其值来自用于生成随机数的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;
请帮忙.. 谢谢..
答案 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。