我的代码类似于以下内容:
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上并导航到存储的实际数据。 element [0]中的值与刚刚写入屏幕的值x相对应。换句话说,x是绝对可访问的,因为我可以看到显示x的正确值。但是,在Visual Studio 2008中,在调试时,查看对象的内存时,第一个元素的x列值与控制台上显示的值不同!
- 为什么我看不到被访问过的元素? - 这个问题与我的数值没有被正确解析有关吗?
我注意到了另一件奇怪的事情:我第一次看到Visual Studio中的sdr对象时,我可以看到这些元素。如果我将鼠标移动到屏幕的另一侧然后将鼠标悬停在对象上,尝试遍历sdr reader对象的元素,没有元素 - 就好像它是空的一样?!?!
答案 0 :(得分: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);