C# ASP.NET MVC注册警报SQL func用户存在

C# ASP.NET MVC注册警报SQL func用户存在,c#,sql,asp.net-mvc,model-view-controller,error-handling,C#,Sql,Asp.net Mvc,Model View Controller,Error Handling,我正在ASP.NET MVC中注册。我正在使用SQL Server函数检查是否已经存在具有相同用户名/电子邮件的用户。我不擅长编程,因为可能有一个明显的解决方案,而我目前还没有找到 我试图通过控制器或SQL Server函数直接调用警报弹出消息,就像“已经有一个用户使用相同的用户名/电子邮件。” 我从SQL Server函数返回了一个位,并将其转换为控制器中的布尔值,试图找到一种方法来警告消息,方法是使用javascript和model,或者尝试在视图中使用if语句,并通过控制器传递值 SQL

我正在ASP.NET MVC中注册。我正在使用SQL Server函数检查是否已经存在具有相同用户名/电子邮件的用户。我不擅长编程,因为可能有一个明显的解决方案,而我目前还没有找到

我试图通过控制器或SQL Server函数直接调用警报弹出消息,就像“已经有一个用户使用相同的用户名/电子邮件。”

我从SQL Server函数返回了一个位,并将其转换为控制器中的布尔值,试图找到一种方法来警告消息,方法是使用javascript和model,或者尝试在视图中使用if语句,并通过控制器传递值

SQL Server功能代码:

CREATE FUNCTION [dbo].[userExists]
     (@email VARCHAR(1024), 
      @userName VARCHAR(1024))
RETURNS BIT
AS
BEGIN
    IF ((SELECT Email FROM Users WHERE Email = @email) IS NOT NULL)
    BEGIN
        RETURN 1
    END

    IF ((SELECT UserName FROM Users WHERE UserName = @userName) IS NOT NULL)
    BEGIN
        RETURN 1
    END

    RETURN 0
END
SqlCommand eCmd = new SqlCommand("SELECT dbo.userExists(@email, @userName)", con);
eCmd.Parameters.AddWithValue("email", regModel.Email);
eCmd.Parameters.AddWithValue("userName", regModel.UserName);

bool exists = Convert.ToBoolean(eCmd.ExecuteScalar());

eCmd.Dispose();

if (exists != true)
{
    SqlCommand cmd = new SqlCommand("INSERT INTO Users (UserName, Email, Password) VALUES (@userName, @email, @password)", con);

    cmd.Parameters.AddWithValue("userName", regModel.UserName);
    cmd.Parameters.AddWithValue("email", regModel.Email);
    cmd.Parameters.AddWithValue("password", MD5Hash(regModel.Password));

    cmd.ExecuteNonQuery();
    cmd.Dispose();
}
else
{                                             
    return View();
}
控制器操作代码:

CREATE FUNCTION [dbo].[userExists]
     (@email VARCHAR(1024), 
      @userName VARCHAR(1024))
RETURNS BIT
AS
BEGIN
    IF ((SELECT Email FROM Users WHERE Email = @email) IS NOT NULL)
    BEGIN
        RETURN 1
    END

    IF ((SELECT UserName FROM Users WHERE UserName = @userName) IS NOT NULL)
    BEGIN
        RETURN 1
    END

    RETURN 0
END
SqlCommand eCmd = new SqlCommand("SELECT dbo.userExists(@email, @userName)", con);
eCmd.Parameters.AddWithValue("email", regModel.Email);
eCmd.Parameters.AddWithValue("userName", regModel.UserName);

bool exists = Convert.ToBoolean(eCmd.ExecuteScalar());

eCmd.Dispose();

if (exists != true)
{
    SqlCommand cmd = new SqlCommand("INSERT INTO Users (UserName, Email, Password) VALUES (@userName, @email, @password)", con);

    cmd.Parameters.AddWithValue("userName", regModel.UserName);
    cmd.Parameters.AddWithValue("email", regModel.Email);
    cmd.Parameters.AddWithValue("password", MD5Hash(regModel.Password));

    cmd.ExecuteNonQuery();
    cmd.Dispose();
}
else
{                                             
    return View();
}
到目前为止一切正常。我试图实现的是消息警报,指示用户是否已经存在


我试着研究如何使用“return JavaScript(“\code\””)尽我所能,但是,我不想工作。

在您的
控制器
方法中,您需要使用
ExecuteNonQuery
从sql语句中获取返回的内容。您必须将您的值存储在从函数获取的某个变量中


if (exists != true)
{
    SqlCommand cmd = new SqlCommand("INSERT INTO Users (UserName, Email, Password) VALUES (@userName, @email, @password)", con);

    cmd.Parameters.AddWithValue("userName", regModel.UserName);
    cmd.Parameters.AddWithValue("email", regModel.Email);
    cmd.Parameters.AddWithValue("password", MD5Hash(regModel.Password));

    ViewBag.myval = cmd.ExecuteNonQuery();  // need to use ExecuteNonQuery 

    cmd.Dispose();
}
else
{                                             
    return View();
}

查看时,访问您的值

 @Model.myval 

之后,您可以使用
javascript
发布消息。根据您的产品结构

int result=0;
SqlCommand cmd = new SqlCommand("INSERT INTO Users (UserName, Email, Password) VALUES (@userName, @email, @password)", con);

cmd.Parameters.AddWithValue("userName", regModel.UserName);
cmd.Parameters.AddWithValue("email", regModel.Email);
cmd.Parameters.AddWithValue("password", MD5Hash(regModel.Password));

result=cmd.ExecuteNonQuery();
cmd.Dispose();
现在,根据您获得的值,您可以使用jQuery警告消息。您可以将此值作为
Model
或在
viewBag
中传递。我将尝试使用
viewbag
as

ViewBag.resultOfQuery=result;
return View();
<script>
 function YourFunctionName()
  {
    if('@ViewBag.resultOfQuery'=="1")
       alert("There is already a user with same Username/Email.");
    else
       alert("Inserted Successfully");
  }
</script>
从jQuery的前端,您可以根据需要基于警报
@ViewBag.resultOfQuery

ViewBag.resultOfQuery=result;
return View();
<script>
 function YourFunctionName()
  {
    if('@ViewBag.resultOfQuery'=="1")
       alert("There is already a user with same Username/Email.");
    else
       alert("Inserted Successfully");
  }
</script>

函数YourFunctionName()
{
如果('@ViewBag.resultOfQuery'==“1”)
警报(“已存在具有相同用户名/电子邮件的用户”);
其他的
警报(“插入成功”);
}

为什么要使用
.ExecuteScalar()
执行不返回任何数据的
插入操作??对于这种情况,请使用
.ExecuteNonQuery()
来代替……啊,我错过了那部分。我会换的。很好,很有效!我所做的只是在else语句中,我使用ViewBag.EmailExists=1并包含js代码,经过测试,现在它工作了!谢谢这很好,唯一的一点是ViewBag.myval只有在电子邮件不存在的情况下才被分配,所以我想说的是,我只是想让事情匹配起来,这样我就知道什么在哪里了。因为我从这篇文章中学到的是,我可以指定一个自定义ViewBag变量,所以我可以坚持使用ViewBag.EmailExists=1或0。