以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  ExecuteReader的疑惑  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=32019)

--  作者:不倒的翁
--  发布时间:2013/4/24 13:29:00
--  ExecuteReader的疑惑

ExecuteReader有一个可选参数,如果设置为True,那么生成的DataTable不仅可以修改,还可以保存。
新建一个文件,在命令窗口测试下面的代码,会在A的第一行的第一列写入123:

Dim cmd As new SQLCommand
Dim
dt As DataTable
cmd
.CommandText = "select * From {A}"
dt = cmd.ExecuteReader(
True) \'记得将参数设置为True
dt
.DataRows(0)("第一列") = 123
dt.Save()

DataTables(
"A").Load() \'重新加载表A,看看值是否已经变化

如果以上代码改变为

Dim cmd As new SQLCommand
Dim
dt As DataTable
cmd
.CommandText = "select * From {A}"
dt = cmd.ExecuteReader(
True) \'记得将参数设置为True

Dim dr As DataRow = dt.DataRows(0)
dr("第一列") = 123
dr.Save()

提示找不到""的DataTable

是不是不能用Dim dr As DataRow = dt.DataRows(0)定义???

既然Dim dt As DataTable
按照帮助中前期的指导写基础代码,很多人容易写成Dim dr As DataRow = dt.DataRows(0)

会误导哦,希望帮助中对这部分的说明详细些。

希望不是BUG。。。。

=====================无敌分割======================================

看了下自己项目中的代码。

如果:

Dim cmd As new SQLCommand
Dim
dt As DataTable
cmd
.CommandText = "select * From {XX表}"
dt = cmd.ExecuteReader(
) \'True参数不设置,就是原来2012中的代码写法。

Dim dr As DataRow = dt.DataRows(0)
这样能直接引用dr("XX列")的值。

而2013中dt = cmd.ExecuteReader(True) \'加上True参数

Dim dr As DataRow = dt.DataRows(0)

引用的dr("XX列")的值都是“空”的。。。。

[此贴子已经被作者于2013-4-24 13:55:59编辑过]

--  作者:不倒的翁
--  发布时间:2013/4/24 13:56:00
--  
顶一下。。。。客服午休还没结束。。图片点击可在新窗口打开查看
--  作者:不倒的翁
--  发布时间:2013/4/24 14:33:00
--  
2:30咯。。等待回答。。。
--  作者:狐狸爸爸
--  发布时间:2013/4/24 14:46:00
--  
没有道理的,做个小例子发上来测试看看。
--  作者:不倒的翁
--  发布时间:2013/4/24 15:15:00
--  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目6.rar

我这用的SQL2008,例子用的ACC数据库

提示空表

貌似值在ACC好像能正常引用。。。

但保存数据行就出错。


--  作者:Bin
--  发布时间:2013/4/24 15:22:00
--  
.
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目6.zip


--  作者:不倒的翁
--  发布时间:2013/4/24 15:35:00
--  
以下是引用Bin在2013-4-24 15:22:00的发言:
.
 下载信息  [文件大小:30.0 KB  下载次数:0]
图片点击可在新窗口打开查看点击浏览该文件:管理项目6.zip

Dim cmd As New SQLCommand
cmd.C

cmd.CommandText = "Select * From {tb1}"
Dim dt As DataTable = cmd.ExecuteReader(True)
Dim dr As DataRow = DataTables("tb1").DataRows(0)
MessageBox.Show(dr("第一列"))
dr("第一列") = "更改"
dr.Save
MessageBox.Show("已保存")

为什么红字处不能用变量的呢????

这表如果将“tb1”的表从FT中删除肯定出错。(指的是直接通过SQLCommand取得SQL上的数据,而不在FT中添加外部数据表)

因为SQLCommand本来就是为了加载外部表用的。

DataTables("tb1")相当于在FT中已经加载的外部表保存的。

 

[此贴子已经被作者于2013-4-24 15:37:49编辑过]

--  作者:不倒的翁
--  发布时间:2013/4/24 15:41:00
--  

表达能力不好。

不知道说的问题大家理解没。

忘谅解啊。。。


--  作者:Bin
--  发布时间:2013/4/24 15:42:00
--  
以下是引用不倒的翁在2013-4-24 15:35:00的发言:

Dim cmd As New SQLCommand
cmd.C

cmd.CommandText = "Select * From {tb1}"
Dim dt As DataTable = cmd.ExecuteReader(True)
Dim dr As DataRow = DataTables("tb1").DataRows(0)
MessageBox.Show(dr("第一列"))
dr("第一列") = "更改"
dr.Save
MessageBox.Show("已保存")

为什么红字处不能用变量的呢????

这表如果将“tb1”的表从FT中删除肯定出错。(指的是直接通过SQLCommand取得SQL上的数据,而不在FT中添加外部数据表)

因为SQLCommand本来就是为了加载外部表用的。

DataTables("tb1")相当于在FT中已经加载的外部表保存的。

 

[此贴子已经被作者于2013-4-24 15:37:49编辑过]
变量中的DataTable 和FT中的显示出来的表.不是一回事.也不是同一个东西吧.


--  作者:不倒的翁
--  发布时间:2013/4/24 15:46:00
--  
以下是引用Bin在2013-4-24 15:42:00的发言:

BIN,我例子里的tb1表是外部表。你删除后用dt变量试试,出错的。

tb1外部表删除。用SQLCommand能获得ACC数据库的数据

但用cmd.ExecuteReader

定义Dim dr As DataRow = dt.DataRows(0)
出错的。

但能取到值。

MessageBox.Show(dr("第一列"))