无法使用MVC将数据插入DataBase(SQL)

时间:2015-11-19 21:58:28

标签: sql sql-server asp.net-mvc-4 sql-server-2012

这是我的控制器类

[HttpPost]
        public ActionResult SignUp(SignupModel model)
        {
            User u = new User();
            u.LoginId = model.LoginId;
            u.Password = model.Password;
            u.FullName = model.FullName;
            new UsersHandler().AddUser(u);}

UserHandler类包含

public void AddUser(User user)
        {
            new DAC().Insert(user);
        }

DAC类包含连接,UsersDAC包含查询

插入查询

internal void Insert(User user)
    {
        List<SqlParameter> temp = new List<SqlParameter> 
                                    {
                                        new SqlParameter("@FullName", user.FullName),
                                        new SqlParameter("@LoginId", user.LoginId),
                                        new SqlParameter("@Password", user.Password)       
                                    };
             SqlConnection con = DACHelper.GetConnection();
            using (con)
            {
                con.Open();
                SqlTransaction t = con.BeginTransaction();
                try
                {
                    user.Id = (int)DACHelper.ExecuteScalar(INSERT, temp, t);
                    DACHelper.Execute(INSERT, temp);
                    t.Commit();
                }
                catch (Exception)
                {
                    t.Rollback();
                }
            }

        }
  

DACHelper.Execute(INSERT,temp);   它执行但不在表格中插入任何内容。

存储过程

ALTER PROCEDURE [dbo].[Users_Insert]
    @FullName           varchar(50),
    @LoginId            varchar(50),
    @Password           varchar(50)
AS
    Insert into [Users]
        ([FullName],[LoginId],[Password])
Values  (@FullName,@LoginId,@Password)

Select @@IDENTITY from [Users]

4 个答案:

答案 0 :(得分:0)

我的建议:

  1. 使用程序使用的相同SQL凭据在程序外部测试存储过程。如果这样做,问题是你的代码。
  2. 尝试通过构建代码来调用存储过程,而不使用隐藏正在执行的操作的类。
  3. 确保SqlCommand对象知道它应该使用CommandType CommandType.StoredProcedure

  4. 请勿使用SCOPE_IDENTITY@@IDENTITY。获取标识字段的最安全方法如下(假设字段名称为ID):

    INSERT into [Users] ([FullName],[LoginID],[Password]) OUTPUT INSERTED.ID VALUES (@FullName, @LoginID, @Password)

  5. 这将始终是正确的值。

答案 1 :(得分:0)

提交模式怎么样?它是否处于自动提交模式。如果不是尝试使用脚本手动执行提交。这应该在提交事务时显示消息。

答案 2 :(得分:0)

你没有用过sqlparamater.appwithvalue可能会导致这个问题..

internal void Insert(User user)
{
    List<SqlParameter> temp = new List<SqlParameter> 
                                {
                                    new SqlParameter().AddWithvalue("@FullName", user.FullName),
                                    new SqlParameter().AddWithvalue("@LoginId", user.LoginId),
                                    new SqlParameter().AddWithvalue("@Password", user.Password)       
                                };
         SqlConnection con = DACHelper.GetConnection();
        using (con)
        {
            con.Open();
            SqlTransaction t = con.BeginTransaction();
            try
            {
                user.Id = (int)DACHelper.ExecuteScalar(INSERT, temp, t);
                DACHelper.Execute(INSERT, temp);
                t.Commit();
            }
            catch (Exception)
            {
                t.Rollback();
            }
        }

    }

答案 3 :(得分:0)

internal void Insert(User user)
    {
        List<SqlParameter> temp = new List<SqlParameter>
        {
            new SqlParameter("@LoginId", user.LoginId),
            new SqlParameter("@Password", user.Password),
            new SqlParameter("@FullName", user.FullName),

        };
        SqlConnection con = DACHelper.GetConnection();
        using (con)
        {
            con.Open();
            SqlTransaction t = con.BeginTransaction();
            user.Id = (Int32)DACHelper.ExecuteScalar(INSERT, temp, t);
            t.Commit();
        }
  }

这可以通过删除try / catch来实现。