【问题标题】:Stored Procedure call in MVC 4 EF5 Not returning the correct dataMVC 4 EF5中的存储过程调用未返回正确的数据
【发布时间】:2017-06-29 18:53:29
【问题描述】:

我正在调用一个存储过程,它正在为内部系统的新用户创建一个随机生成的临时密码。我有并调用了其他存储过程,它们工作得很好。出于某种原因,当它应该返回类似 UtUdHUVx7fCu 的东西时,它正在返回 "System.Data.Objects.ObjectResult1[System.String]"

我尝试将 Context.cs 中的 <usp_GeneratePassword_Result> 更改为 <string> 但这给了我同样的错误。

SP

ALTER PROCEDURE [dbo].[usp_GeneratePassword]

@PasswordLength INT

AS
BEGIN

DECLARE @SourceString VARCHAR(100)
SET @SourceString = 'abcdefhkmnpqrstuvwxyzABCDEFHJKMNPQRSTUVWXYZ23456789'

SELECT (
    SELECT  TOP (@PasswordLength)
            SUBSTRING(@SourceString, 1 + (CAST(ROUND(RAND(CHECKSUM(NEWID())) * 1000, 0) AS INT) % LEN(@SourceString)), 1)
    FROM    sysobjects
    FOR     XML PATH('')
) AS GeneratedPassword


END

控制器

    private AdventureWorksEntities db = new AdventureWorksEntities();
    ^^ this is at the top 

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Register(mvcUser model)
    {
        if (ModelState.IsValid)
        {

            var pass = db.usp_GeneratePassword(10);
            model.UserPassword = pass.ToString();

            db.mvcUsers.Add(model);
            db.SaveChanges();
            ModelState.Clear();
            model = null;

        }

        // If we got this far, something failed, redisplay form
        return RedirectToAction("index","Home");
    }

型号

    public partial class usp_GeneratePassword_Result
{
    public string GeneratedPassword { get; set; }
}

Context.cs

        public virtual ObjectResult<usp_GeneratePassword_Result> GeneratePassword(Nullable<int> passwordLength)
    {
        var passwordLengthParameter = passwordLength.HasValue ?
            new ObjectParameter("PasswordLength", passwordLength) :
            new ObjectParameter("PasswordLength", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<usp_GeneratePassword_Result>("GeneratePassword", passwordLengthParameter);
    }

再次,如果我遗漏任何东西,请告诉我。

【问题讨论】:

  • 您调用的程序是否正确?这里的一切都是关于密码,但你打电话给usp_GenerateUsername
  • 抱歉编辑了。我有两个 SP 做同样的事情,我在复制和粘贴时删除了错误的一个。 usp_GeneratePassword 是正确的
  • 好的。顺便说一句,您为什么不为此使用 C#?与使用RNGCryptoServiceProvider相比,访问数据库似乎效率低且随机性更小
  • SP 对我来说工作正常。您是否在model.UserPassword = pass.ToString(); 设置了一个休息时间来查看pass 的值?
  • @Crowcoder - 我同意它效率低下但更高层希望它在 SP 中。

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


【解决方案1】:

您的信息已被放入列表中,因此您可能想尝试类似的方法。

 if (ModelState.IsValid)
    {

            var pass = db.usp_GeneratePassword(10).ToList();
            model.UserPassword = pass[0];                

            db.mvcUsers.Add(model);
            db.SaveChanges();
            ModelState.Clear();
            model = null;

    }

【讨论】:

  • 我猜想使用 LINQ 也有更好的方法。
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多