在C#Application中找不到InvalidCastException

时间:2015-06-08 15:26:45

标签: c# winforms visual-studio visual-studio-2012 webforms

我在Visual Studio中遇到一个奇怪的错误,当然这个很棒的软件无法告诉我错误在哪里,只是我收到了错误。我想我能做的最好就是粘贴我的代码。

using (SQLiteCommand cmd = new SQLiteCommand(query, con))
{
    using (SQLiteDataReader rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            //Console.WriteLine("{0} ", rdr["logLnNum"]);
            ulong start, end, delta = 0;
            string contentStr;
            string contentMarkup;
            String group;

            start = (ulong)rdr["startTime"];
            end = (ulong)rdr["endTime"];
            convertTimes(start, end, 2728232, delta);

            contentStr = String.Format("{0}, {1}, {2}, {3}, {4} (ms)", 
                rdr["offsetOfData"], rdr["amountOfData"], rdr["filename"], 
                rdr["logLnNum"], (delta * .001));
            contentMarkup = "<div title=\"" + contentStr + "\">" + contentStr + "</div>";

            group = String.Format("{0:X}", rdr["threadId"]);
            group = group + ", " + rdr["threadName"];

            TimelineData inputData = new TimelineData(contentMarkup, end, group, start);
            Console.WriteLine("Data processed");
            dataSet.Add(inputData);
        }
    }
}

同样,我得到的唯一错误是.exe中出现“System.InvalidCastException”。

2 个答案:

答案 0 :(得分:1)

从对象直接强制转换仅在该对象继承自您要转换到的类型(沿线的某个位置,无论如何)时才起作用。

DataReader获取所需类型的简单方法是调用

[type].Parse(reader[index].ToString())

其中[type]是您要投放到的内容,即

ulong.Parse(rdr["startTime"].ToString())

DataReader个对象通常有.GetInt32(int).GetDecimal(int)等,只需要您传入要解析的列索引。如果您只有列的名称,则可以使用Reader.GetOrdinal("yourColumnName")

答案 1 :(得分:0)

我建议您使用额外的方法来分隔此类错误。 例如,请考虑以下代码:

protected T getDataValue<T>(object value)
{
        if (value != null && DBNull.Value != value)
            return (T)value;
        else
            return default(T);
}

然后在datareader迭代中为每个检索到的值调用它,这将在调试期间帮助您检测哪个字段产生异常。 示例:

start = getDataValue<ulong>(rdr["startTime"]);
end = getDataValue<ulong>(rdr["endTime"]);

简而言之,我在处理数据访问时通常会遵循这些准则以避免例外:

  • 如果您有权访问数据库,请在从ADO执行查询之前使用数据库客户端检查数据,这可以在执行相同的查询时完成。

  • 考虑在两个层(DB和App)中使用相同的类型,以避免强制转换异常 - &gt;从varchar转换为int是不一样的,从int到int进行简单的转换(当然它是一个对象,但肯定它有一个预期值的类型),你减少了很多验证逻辑使用相同类型时。

  • 如果您的表格字段接受空值,请考虑使用转换策略(如我给您的方法)在null时指定有效值。

  • 尽量避免写太多&#34;逻辑&#34;在DataAccess方法中,只需保持简单,您可以使用DTO或业务类来存储您从db获得的所有值,然后在业务层中使用它/修改/创建逻辑。

希望有所帮助