0

我有类似于以下的代码:

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 是一个数值(如果不是,它将为空)。

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

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

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

4

1 回答 1

0

真的,这不是使用 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);
于 2012-11-16T10:24:38.050 回答