【发布时间】: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