检查数据库中是不是存在
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。
【讨论】:
我们的项目没有使用存储过程.. :(以上是关于检查数据库中是不是存在的主要内容,如果未能解决你的问题,请参考以下文章