【问题标题】:C# MVC - SP not insert valuesC# MVC - SP 不插入值
【发布时间】:2017-03-04 10:09:02
【问题描述】:

我正在尝试从我的控制器插入到我的数据库中。我已经调试过,它永远不会进入异常。但我看不到数据库上的值。

这是我的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;
}

关于为什么这不起作用的任何想法?

谢谢

【问题讨论】:

  • 您的存储过程中有一个必需的参数(@Birthday 日期),但您没有提供它。这可能会导致问题。
  • 你的用户表是如何定义的?生日属性有默认值吗?
  • 生日允许使用空值。

标签: c# sql asp.net stored-procedures


【解决方案1】:

如果您没有提供“@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

你的其余代码对我来说都很好。

希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    如果您以适当的方式使用异常处理,事情就很容易了。您正在吞噬 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();
    

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

    我希望它能以某种方式帮助你。谢谢!

    【讨论】:

    • 感谢您的评论。我使用 throw 并看到消息错误。我跟踪查询,问题是 exec 重复了两次值。所以它抛出 过程或函数指定了太多参数。所以有了 throw 和你的代码......现在它正在工作。谢谢!
    【解决方案3】:

    如果您愿意,可以为参数@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2018-08-24
      • 2011-08-12
      相关资源
      最近更新 更多