【问题标题】:Why am I getting "Specified cast is not valid."?为什么我会收到“指定的演员表无效。”?
【发布时间】:2016-05-13 16:03:45
【问题描述】:

它指向Id = dataReader.GetGuid(0),的行

    while (dataReader.Read())
    {
        Partners.Add(new Partner {
            Id = dataReader.GetGuid(0),
            Name = dataReader.GetString(1),
            Email = dataReader.GetString(2),
            Finished = dataReader.GetInt32(3) == 1
        });
    }
}

我已经验证了IddataReader.GetGuid(0) 的类型都是Guid,如果您相信的话。

IdGuid 类型,因为它是来自

的字段
public class Partner
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool Finished { get; set; }
}

dataReader.GetGuid(0)Guid 类型,因为当我这样做时

public class Partner
{
    //public Guid Id { get; set; }
    public string Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool Finished { get; set; }
}

Id = dataReader.GetString(0)

我得到了错误

无法将“System.Guid”类型的对象转换为“System.String”类型

没有意义!

编辑:当我隐式输入时,看起来我确实得到了我们的值:

【问题讨论】:

  • 光标中有null吗? dataReader.GetValue(0).GetType() 返回什么?
  • 可能的方式:Id = new Guid(Convert.ToString(dataReader.GetValue(0)))
  • dataReader 的第 0 列中的数据可能无法转换为 Guid。见stackoverflow.com/questions/27699781/…
  • @DmitryBychenko 刚刚检查过它返回null。嗯。知道为什么吗?我正在调用的存储过程从CREATE TABLE Partners ( id UNIQUEIDENTIFIER NOT NULL DEFAULT NEWID(), name NVARCHAR(50) NOT NULL, email NVARCHAR(254) NOT NULL, finished BIT NOT NULL DEFAULT 0, PRIMARY KEY (id) );生成的 T-SQL 表中获取所有列
  • @user5648283: 那是表,那查询存储过程又是什么?

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


【解决方案1】:

dataReader.GetString(0) 返回一个String,它不会将您的Guid 隐式转换为String,因此您的InvalidCastException

试试:

Id = dataReader.GetGuid(0).ToString()

另外,尝试使用String 索引器获取值,而不是integer 索引器:

Id = dataReader.GetGuid("Id"),
Name = dataReader.GetString("Name"),
Email = dataReader.GetString("Email"),
Finished = dataReader.GetInt32("Finished") == 1

否则,向结果中添加列会破坏您的代码。

更好的是,尝试使用EntityFramework 为您完成所有映射。

【讨论】:

  • 我正在尝试以最老式的方式做到这一点
  • 我在这里看不到GetGuid(string) 方法msdn.microsoft.com/en-us/library/… ....
  • 我找到了here
  • @Alexei,输入参数类型是 Int32,所以你不能做 dataReader.GetGuid("Id") 。错了
【解决方案2】:

这是你的答案。如果你想在 Partner 类中使用 Guid 类型的 Id,当你从 SQL Server 读取数据时,将从服务器返回的字符串数据类型转换为 Guid 类型,如下所示

while (dataReader.Read())
{
    Partners.Add(new Partner {
    Id = Guid.Parse(dataReader.GetString(0)),
    Name = dataReader.GetString(1),
    Email = dataReader.GetString(2),
    Finished = dataReader.GetInt32(3) == 1 });
}

但是您的合作伙伴班级的 ID 类型为 Guid,如下所示

public class Partner
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool Finished { get; set; }
}

【讨论】:

  • 我最终不得不使用可为空的 guid 来执行此操作; uRow.UserRoleId = oRow["UserRoleId"] as Guid?;
【解决方案3】:

我在尝试将操作参数转换为 Guid 时遇到了这个问题。

Guid.Parse(context.ActionArguments["someArgument"])

这里的问题是 ActionArguments 是一个 IDictionary,其中包含像 IDictionary<string, object> 这样的对象

当尝试将object 转换为Guid 时,出现错误。解决方案是将其转换为字符串,然后进行强制转换。

Guid.Parse(context.ActionArguments["someArgument"].ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多