c# MVC - SP不插入值

本文关键字:插入 SP MVC | 更新日期: 2023-09-27 18:14:11

我正试图从我的控制器插入到我的数据库。我已经调试了,它从来没有进入异常。但是我不能看到db上的值

这是我的sp:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[RegisterUser]
-- Add the parameters for the stored procedure here
@Username nvarchar(10),
@Password nvarchar(10),
@Mail nvarchar(10),
@Birthday date
AS
BEGIN
SET NOCOUNT ON
INSERT INTO Users
(
    Username,
    Pass,
    Mail,
    Birthday
)
VALUES 
(
    @Username,
    @Password,
    @Mail,
    @Birthday
)
END

在我的模型中,我使用了这个方法:

public bool registerUser(UserModel user)
    {
        bool isOk = false;
        using (SqlConnection connection = DbConnection.OpenConnection2())
        {
            try
            {
                using (SqlCommand command = new SqlCommand("RegisterUser", connection))
                {
                    command.CommandType = CommandType.StoredProcedure;
                    SqlCommandBuilder.DeriveParameters(command);
                    command.Parameters.Add(new SqlParameter("@UserName", SqlDbType.VarChar)).Value = user.userName.Trim();
                    command.Parameters.Add(new SqlParameter("@Password", SqlDbType.VarChar)).Value = user.password.Trim();
                    command.Parameters.Add(new SqlParameter("@Mail", SqlDbType.VarChar)).Value = user.mail.Trim();

                    command.ExecuteNonQuery();
                }
        }
        catch (Exception e)
        {
        }
        finally
        {
            if (connection.State.Equals(ConnectionState.Open))
                {
                    connection.Close();
                    isOk = true;
                }
        }
    }
return isOk;
}

知道为什么不工作吗?

谢谢

c# MVC - SP不插入值

如果以适当的方式使用异常处理,事情很容易。您正在吞下Ado.net抛出的异常。按照以下步骤解决问题:

  • 首先,你应该在你的catch块中添加一个throw语句来获得正在抛出的异常。在生产环境中,您应该在以后调用函数或层时捕获该问题。
  • 您需要为存储过程提供所有参数。目前,您没有传递一个名为@Birthday的参数及其值。

修改后的代码应该可以工作了。

command.CommandType = CommandType.StoredProcedure;                  
command.Parameters.Add(new SqlParameter("@UserName", SqlDbType.VarChar)).Value = user.userName.Trim();
command.Parameters.Add(new SqlParameter("@Password", SqlDbType.VarChar)).Value = user.password.Trim();
command.Parameters.Add(new SqlParameter("@Mail", SqlDbType.VarChar)).Value = user.mail.Trim();
//Assuming that the user object has a field named Birthday
command.Parameters.Add(new SqlParameter("@Birthday", SqlDbType.Date)).Value = user.Birthday; 
command.ExecuteNonQuery();

如果你遵循我的第一个建议,你几乎会遇到代码中出现的任何其他问题。

我希望它能对你有所帮助。谢谢!

如果您愿意,您可以为@Birthday参数提供一个默认值:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[RegisterUser]
-- Add the parameters for the stored procedure here
@Username nvarchar(10),
@Password nvarchar(10),
@Mail nvarchar(10),
@Birthday date = NULL
AS
BEGIN
SET NOCOUNT ON
INSERT INTO Users
(
    Username,
    Pass,
    Mail,
    Birthday
)
VALUES 
(
    @Username,
    @Password,
    @Mail,
    @Birthday
)
END

如果不提供"@Birthday"参数,请在如下存储过程中将"@Birthday date"指定为"@Birthday date = NULL":

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[RegisterUser]
-- Add the parameters for the stored procedure here
@Username nvarchar(10),
@Password nvarchar(10),
@Mail nvarchar(10),
@Birthday date = NULL
AS
BEGIN
SET NOCOUNT ON
INSERT INTO Users
(
    Username,
    Pass,
    Mail,
    Birthday
)
VALUES 
(
    @Username,
    @Password,
    @Mail,
    @Birthday
)
END

你剩下的代码看起来都很好。