【问题标题】:SQLDataReader doesnt show first element, but accesses it?SQLDataReader 不显示第一个元素,但访问它?
【发布时间】:2012-11-05 01:00:21
【问题描述】:

我有类似下面的代码:

SqlDataReader sdr = null;
.
.
sdr = cmd.ExecuteReader();

while(sdr.Read()){
    string x = sdr["x"].ToString();
    Console.WriteLine(x);
    long? y = Int64.Parse(sdr["y"].ToString());
}

我目前在解析 y 的值时正在调试一个问题。在数据库中,对于写入控制台的值 x,它表示 y 是一个数值(如果不是,则为 null)。

当抛出异常时,我将鼠标悬停在 sdr 上并导航到正在存储的实际数据。元素 [0] 中的值与刚刚写入屏幕的值 x 相对应。换句话说,肯定会访问 x,因为我可以看到 x 的正确值正在显示。但是,在 Visual Studio 2008 中,在调试时,查看对象的内存时,第一个元素的 x 列值与刚刚在控制台上显示的值不同!

-为什么我看不到被访问的元素? - 这个问题是否与我的数值未正确解析有关?

我确实注意到另一个奇怪的事情:我第一次在 Visual Studio 中查看 sdr 对象时,我可以看到元素。如果我将鼠标移动到屏幕的另一侧,然后将鼠标悬停在对象上,尝试遍历 sdr 读取器对象的元素,没有元素 - 好像它是空的?!?!

【问题讨论】:

  • 我很惊讶string x = sdr["x"]; 编译。您正在声明一个字符串变量并分配一个对象(数据读取器的indexer 始终返回一个对象)。
  • (编辑了我的最后一条评论)在 VB.NET 中,您可以设置 OPTION STRICT off(不推荐)。然后,您可以将对象分配给字符串。但这永远不会在 C# 中编译。
  • 你确定 x 是 0 吗?试试 sdr.GetSting(0)。

标签: c# .net visual-studio-2008 .net-3.5


【解决方案1】:

这真的不是使用 SqlDataReader 的方式...

除了@TimSchmelter 所述的编译问题,您应该在尝试访问和转换 SqlDataReader 的值之前编写检查 DBNull.Value 的代码

string x = string.Empty;
int index = sdr.GetOrdinal("x");
if (!sdr.IsDBNull(index))
     x = sdr.GetString(index);

long? y;
index = sdr.GetOrdinal("y");
if (!sdr.IsDBNull(index))
    y = sdr.GetInt64(index);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    相关资源
    最近更新 更多