关于TableAdapter的疑问

uxspy 2006-05-21 11:50:40
小弟试图从winform中的两个textbox中搜集数据回存到数据库中,假设数据库中也只有两个字段
然后 我把它们以新行的形式添加到dataset中,然后用TableAdapter的updata方法来更新这个dataset
myTableAdapter.updata(mydataset),为了监视是否添加成功,我放置了个DataGrid在窗体上,
然后我看到DataGrid中的数据在预期的一条条增加,然后我stop debug,察看我的数据库,我发现
我的数据库里仍然是空的,怎么回事?
...全文
530 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lnwuyaowei 2006-09-21
  • 打赏
  • 举报
回复
如果楼主用的是slqserverexpress,那么问题可能在于你已经加入了记录,并且写入了数据库.这个你可以通过不关闭程序,而重新加载数据的方法以看得出来.

至于为什么重新运行后数据没有改变,楼主可以看一下debug目录,再在vs.net的ide中看一下数据库文件的属性:复制
就会明白了.
uxspy 2006-05-22
  • 打赏
  • 举报
回复
'dataset.desian.vb里关于InitAdapter的代码部分,问题应该不会出在这里吧

Private Sub InitAdapter()
Me._adapter = New System.Data.SqlClient.SqlDataAdapter
Dim tableMapping As System.Data.Common.DataTableMapping = New System.Data.Common.DataTableMapping
tableMapping.SourceTable = "Table"
tableMapping.DataSetTable = "mytest"
tableMapping.ColumnMappings.Add("ID", "ID")
tableMapping.ColumnMappings.Add("Test", "Test")
Me._adapter.TableMappings.Add(tableMapping)
Me._adapter.DeleteCommand = New System.Data.SqlClient.SqlCommand
Me._adapter.DeleteCommand.Connection = Me.Connection
Me._adapter.DeleteCommand.CommandText = "DELETE FROM [mytest] WHERE (([ID] = @Original_ID) AND ([Test] = @Original_Test))"
Me._adapter.DeleteCommand.CommandType = System.Data.CommandType.Text
Me._adapter.DeleteCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_ID", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, 0, 0, "ID", System.Data.DataRowVersion.Original, false, Nothing, "", "", ""))
Me._adapter.DeleteCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Test", System.Data.SqlDbType.NChar, 0, System.Data.ParameterDirection.Input, 0, 0, "Test", System.Data.DataRowVersion.Original, false, Nothing, "", "", ""))
Me._adapter.InsertCommand = New System.Data.SqlClient.SqlCommand
Me._adapter.InsertCommand.Connection = Me.Connection
Me._adapter.InsertCommand.CommandText = "INSERT INTO [mytest] ([Test]) VALUES (@Test);"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"SELECT ID, Test FROM mytest WHERE "& _
"(ID = SCOPE_IDENTITY())"
Me._adapter.InsertCommand.CommandType = System.Data.CommandType.Text
Me._adapter.InsertCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Test", System.Data.SqlDbType.NChar, 0, System.Data.ParameterDirection.Input, 0, 0, "Test", System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
Me._adapter.UpdateCommand = New System.Data.SqlClient.SqlCommand
Me._adapter.UpdateCommand.Connection = Me.Connection
Me._adapter.UpdateCommand.CommandText = "UPDATE [mytest] SET [Test] = @Test WHERE (([ID] = @Original_ID) AND ([Test] = @Or"& _
"iginal_Test));"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"SELECT ID, Test FROM mytest WHERE (ID = @ID)"
Me._adapter.UpdateCommand.CommandType = System.Data.CommandType.Text
Me._adapter.UpdateCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Test", System.Data.SqlDbType.NChar, 0, System.Data.ParameterDirection.Input, 0, 0, "Test", System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
Me._adapter.UpdateCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_ID", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, 0, 0, "ID", System.Data.DataRowVersion.Original, false, Nothing, "", "", ""))
Me._adapter.UpdateCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Original_Test", System.Data.SqlDbType.NChar, 0, System.Data.ParameterDirection.Input, 0, 0, "Test", System.Data.DataRowVersion.Original, false, Nothing, "", "", ""))
Me._adapter.UpdateCommand.Parameters.Add(New System.Data.SqlClient.SqlParameter("@ID", System.Data.SqlDbType.Int, 4, System.Data.ParameterDirection.Input, 0, 0, "ID", System.Data.DataRowVersion.Current, false, Nothing, "", "", ""))
End Sub
tonny008 2006-05-22
  • 打赏
  • 举报
回复
建议你查看.Disigner.vb 里面的code
uxspy 2006-05-22
  • 打赏
  • 举报
回复
还有,我没有.InsertCommand.*/.UpdateCommand.*/并不是说我没有.Insert/.Update/这两个方法
uxspy 2006-05-22
  • 打赏
  • 举报
回复
如果方便的话,小弟愿意远程协助
uxspy 2006-05-22
  • 打赏
  • 举报
回复
事实确实如此,是这样的,我的表里边的ID就是主键啊,你看我的做法啊
1,在solution里面添加一个database,然后它会自动为你生成一个强类型的dataset,对吧
2,但是这个时候数据库里是没有表的,所以下一步,我双击这个database,新建一张表,只有两个键,一个是ID(主键),一个随便叫Test吧
3,此时回过头来看刚才那个dataset,里边当然是空的,所以我又重新edit一下,选择我建的那
张表
4,然后重新编译一下,我那个TableAdapter出来了,那个dataset也好了
5,然后从tools里拉一个datagrid出来,此时一个databingsource出来了,我把这个datagrid
邦定到这个databingsource上
6,我放一个button上去,在它的click事件里添加代码
me.myTableAdapter.update(me.mydataset)
7,此时datagrid里的数据正常被更新了,但是数据库里就是没有更新


但是如我上所说,我这样想试图引用me.myTableAdapter.UpdateCommand.Parameters[].value时
并没有出现.UpdateCommand.Parameters[].value这样的智能感应
另外,我在design试图里看我这个TableAdapter时,在属性列中,确实有insert,update,delete
方法,而且我还专门察看了下updatacommand的commandtext,如上所说
update mytable
set Test=@Test
where (ID=@Original_ID)and(Test=@Original_Test)

但是如你所说,我为什么不能用智能感应到我的.updatacommand呢?
tonny008 2006-05-22
  • 打赏
  • 举报
回复
你把ID设成KEY,然后再生成一个强类型的dataset就可以了
tonny008 2006-05-22
  • 打赏
  • 举报
回复
顺便问下,我在vb.net的智能感应里找不到这个.InsertCommand,是不是该加什么引用?
--------------------
问题明白了:
所谓的TableAdapter就是一个类型化的dataadapter,你用IDE自动生成Command(insert、delete、update)的前提是表有Key(主键)还有一些条件。你智能感应里找不到这个.InsertCommand说明IDE没为你生成InsertCommand。
kssys 2006-05-22
  • 打赏
  • 举报
回复
自动生成更新语句,需要使用CommandBuilder才行。
uxspy 2006-05-22
  • 打赏
  • 举报
回复
哦,明白你的意思了,那个值是readonly的,
顺便问下,我在vb.net的智能感应里找不到这个.InsertCommand,是不是该加什么引用?
uxspy 2006-05-22
  • 打赏
  • 举报
回复
不是一个update语句就可以了吗,我看msdn里边也都是这么说的,难道我还要手工指定这些参数?好像不是吧
按你的说法,比如我想更新一个元组,那我还得这样?
dim id as intger=me.mydatabingsource.current("ID")
myTableAdapter.UpdateCommand.Parameters["@Original_ID"].Value=id
myTableAdapter.Update(mydataset)

不会这么麻烦吧老大
我感觉我并没有出什么问题,而且在我的实验中,我更改后,数据控件中是正常显示我更改的数据,但是等我第二次打开这些数据根本没变化,所以我怀疑的地方是我的数据只是在内存中被更新了而并没有回传到我的数据库,是不是vs本身设置的问题?顺便说一下,我用vs2005+sqlexpress
uxspy 2006-05-22
  • 打赏
  • 举报
回复
数据库中已经加了5组数据做测试
1 1
2 2
.. ..
.. ..
5 5
至于你说这两个参数怎么赋值我真的不是很清楚,这两个应该是自动赋的吧
比如我在更新整个dataset时它肯定一一从每一行检索这些个Original变量值
kssys 2006-05-22
  • 打赏
  • 举报
回复
这两个参数值,获取方法是:
myTableAdapter.InsertCommand.Parameters["@Original_ID"].Value;
..

看看值是否正确。
uxspy 2006-05-22
  • 打赏
  • 举报
回复
对了,ID是自动增长的
这两个参数的意思不是“原始值”吗?
意思也就是说拿我用select语句得到的这个ID值和我数据库中的值进行比较
在querybuider中这个Original_ID的source 就是Original,而不是current
其实如果ID是主键,那么后面的and(Test=@Original_Test)就可以省略,不是吗,因为主键已经可以唯一确定我要更新哪一个元组了
kssys 2006-05-22
  • 打赏
  • 举报
回复
where (ID=@Original_ID)and(Test=@Original_Test)

1)两个参数是否赋值?
2)数据库中是否有匹配的记录?
uxspy 2006-05-22
  • 打赏
  • 举报
回复
即便是这样,我默认建一个强类型的dataset,在自动生成的TableAdapter command中已经自动生成了updata delete insert等命令,为了做测试,我就在一个空的winform上拉一个datagrid过来,让它绑到我的dataset上,然后用一个按钮来执行MyTableAdapter.update(mydataset),但当我察看我的数据库时,里边什么也没有更改,郁闷了,快点救命啊!!!
uxspy 2006-05-22
  • 打赏
  • 举报
回复
看来还是不行,你看啊,假设我的数据库表中只有两个字段,一个是ID(主键),一个是Test
update mytable
set Test=@Test
where (ID=@Original_ID)and(Test=@Original_Test)
uxspy 2006-05-22
  • 打赏
  • 举报
回复
谢谢老大提醒,我以前好像遇到过类似的问题,就出在这个commandtext上
kssys 2006-05-21
  • 打赏
  • 举报
回复
检查:
myTableAdapter.InsertCommand.CommandText=?;

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧