关于SqlDataReader使用的一点疑惑

C#中的SqlDataReader类(System.Data.SqlClient)是用来在保持打开数据库连接的状态下取数据用的

用法如下图:

“保持与数据库的连接”这个特性也是SqlDataReader与SqlDataAdapter的最大区别,

思考:

既然SqlDataReader在读取数据的时候是保持对数据库的连接,

那么,如果在ExecuteReader();方法执行之后,在reader.Read()进行逐行取值的过程中,

我们改变数据库某一行的值,那么此时这个reader走到这一行时,显示的应该是改变之前的值,还是改变之后的值呢?

试一试:

首先数据库有两条数据,F_XMJSName字段内容分别为“张三” “李四”

执行代码,并读取reader返回的第一行的字段值,是“张三”没错。

此时我们修改数据库第二行的值,把“李四”改成“王五”

此时继续执行代码,进行第二行数据的字段抓取,取得的数据依然是“李四”,而非我希望的“王五”

猜想:  当Command执行过ExecuteReader()方法之后,返回回来的reader对象,应该是引用了数据库的一个快照,

所以无论在这之后如何改变数据库里面的数据,reader遍历读取的数据应该是不会跟着变化的。

为了验证猜想,扒了扒微软的源码,但是没找到太根本的解释,也有可能是技术太菜,没看懂。。

如果有大神知道其中的原理,欢迎留言

原文地址:https://www.cnblogs.com/qfl-blog/p/9501820.html

时间: 2024-08-25 19:00:11

关于SqlDataReader使用的一点疑惑的相关文章

iOS单例创建的一点疑惑

线程安全的单例常用写法, +(AccountManager *)sharedManager{ static AccountManager *defaultManager = nil; disptch_once_t once; disptch_once(&once,^{ defaultManager = [[self alloc] init]; }); return defaultManager; } 在用的过程中,有点疑惑的点是:static AccountManager *defaultMan

关于“在本类中访问本类私有静态变量”的一点疑惑解析

关于"在本类中访问本类私有静态变量"的一点疑惑解析 代码如下: public class StaticVar { private static int x = 100; public static void main(String[] args) { StaticVar var1 = new StaticVar(); var1.x++; StaticVar var2 = new StaticVar(); var2.x++; StaticVar.x++; System.out.print

一点疑惑, 一点不解, 一点担忧, 自我警醒

首先,拿我来说,学历不高,工作时间不长,受当时学好IT高薪就业的口号,开始进入IT行业.在学习的过程中,从未新生厌恶,反而感觉神秘好玩,就这样,坚持学了下来.时间过得飞快,一转眼毕业了.开始找工作.....开始正式工作. 在工作过程中,逐渐意识到自己非科班出身(好像绝大多数IT人所学专业都不是计算机),基础又很薄弱,故越学越虚,就如同盖一座大楼,地基是关键. 那么怎么办呢?努力弥补,大量的看专业书籍,加以视频辅之,虽然我到目前为止仍旧感觉基础不牢固,但是经过这么一个不断弥补的过程,也是收获了不少

在学习“contains()和compareDocumentPositon()"过程中遇到的一点疑惑!

JS开发人员经常都需要确定某个节点是否包含另一个节点,由此IE率先引入了contains()函数,随后,Safari3及其更高版本,Opera 8及其更高版本,Chrome都支持了这个方法(Safari 2.x中虽然也支持这个方法,但无法正常使用).FireFox不支持这个方法,但在DOM3中提供了一个替代方法compareDocuemntPosition().由于此种原因,要想跨平台确定某个节点是否包含另一个节点,就必须提供一个通用的contains()函数来解决这种差异,通常的解法方法如下:

关于teleport_pro使用过程中的一点疑惑

在我新建工程的时候,有两个选项,一个是"new project wizard"另一个是"new project",然后就纠结了,我应该使用那个呢? 使用第一个的时候它会引导你新建"starting address",使用第二个则不会. 经过慢慢摸索,发现使用第一种新建的工程的第一个和第二个选项(第一个大致意思是在本地磁盘上创建一个可浏览的站点,第二个大致意思是完全复制一个站点,保持目录结构)的区别反应到project properties -&g

在学习"$(this)和this"过程中遇到的一点疑惑!

在学习JQuery的过程中,我遇到了$(this),this,通过查阅网上资料,我发现大部分来源中对于它们的解释基本一致,其最终来源似乎都来自一位叫做Remy Sharp的程序员的一篇文章https://remysharp.com/2007/04/12/jquerys-this-demystified ,其中我发现了一些解释并不够清楚的地方,写下来与各位讨论. 以下是在查阅资料过程过发现的一个例子: $("#desktop a img").each(function(index){ a

委托修饰符的一点疑惑。

写字段的时候一般会这么写: 1 private string _msg; 2 3 public string Msg 4 { 5 get { return _msg; } 6 set { _msg = value; } 7 } 或者直接自动属性,反编译后其实也生成了一个私有字段,即 1 public string Msg { get; set; } 于是昨天在写委托实例的时候这么写: 1 delegate void AfterSendMsg(string msg); 2 public After

C++中map的一点疑惑...

int CRuntimePara::getInt(const string& strKey,int iDefault){ map<string,string>::const_iterator iter; if ((iter = _mapParaValue.find(strKey)) != _mapParaValue.end()) return atoi((*iter).second.c_str()); else return iDefault;} _mapParaValue.end()

对于函数名本质的一点思考

自己在学习函数指针的时候对函数名的意义产生了一点疑惑,经过一些尝试和思考,感觉应该可以像下面这样理解,如果有啥不对的希望大家指正. 首先 我们对变量名的定义做一下回顾: 在C语言里面,我们声明一个变量的时候就会给这个变量名分配一个内存空间,也就是说变量名和内存空间相对应:同时每个内存空间都会有个地址. int a; a=5; 上面两句话说明了:变量a对应的内存空间存储了一个整型数5,并且我们还可以知道这个内存空间的地址是&a. 对于函数的调用我们一般是直接用函数名的,但是在汇编语言里面,调用函数