我有一个调用数据库中存在的存储过程的方法
public Guid GetUserID(string userName)
{
using (var entities = new entities ())
{
return Guid.Parse(entities.Database.SqlQuery<Guid>(
"dbo.[GetUserID] @UserName",
new Object[] { new SqlParameter("@UserName",
userName)
}).ToString());
}
}
我的存储过程:
CREATE PROCEDURE [dbo].[GetUserID]
@UserName NVARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 1 ID FROM [DBO].[USER] WHERE USERNAME = @UserName
ORDER BY CREATEDON DESC
END
GO
我添加了一些日志并收到以下错误:
Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
at System.Guid.TryParseGuidWithNoStyle(String guidString, GuidResult& result)
at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
at System.Guid.Parse(String input)
导致上述错误的原因是什么?
答案 0 :(得分:1)
每the docs SqlQuery
返回一组结果。如果您只想要一个结果,则需要致电Single
或First
:
var userIdQuery = entities.Database.SqlQuery<Guid>(
"dbo.[GetUserID] @UserName",
new Object[] { new SqlParameter("@UserName", userName)});
// userIdQuery is a collection of Guids.
// We need to take either the first one, or ensure there
// is only one:
Guid.Parse(userIdQuery.Single().ToString());
请注意,如果没有返回任何结果,Single()
将抛出异常,并且如果返回了多个结果。
答案 1 :(得分:0)
GUID(全局唯一标识符)是SQL Server,实体框架和其他来源中的特定数据类型。它表示为带有4个破折号的32位十六进制数字,如下所示:B98332DB-F5E0-4022-860F-9A42A7DEB965
当您使用public Guid
时,您正尝试将用户名(当然也不是带有四个破折号的32位十六进制数字)分配为GUID数据格式。
将proc的数据类型从Guid更改为String或其他更正确的数据类型。
编辑:我错误地读取了原始条目,但上述内容不正确。但是,错误消息指示传递给Guid.Parse的值不是GUID的字符串表示形式。
那么,实际存储在Id
字段中的值是多少?它是一个标识字段,一个实际的GUID(在这种情况下你不需要.Parse它),一个字符串,或者??