| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 986 人关注过本帖
标题:为什么不能更新数据
只看楼主 加入收藏
casualhewo
Rank: 1
等 级:新手上路
帖 子:267
专家分:0
注 册:2006-6-13
收藏
 问题点数:0 回复次数:11 
为什么不能更新数据

using System;
using System.Data ;
using System.Data.SqlClient ;

namespace DataReaderExample
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class DataReaderExample
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
SqlConnection llSqlcnt = new SqlConnection (@"Data Source = (local) ; Integrated Security = SSPI ;" +"Initial Catalog = Northwind") ;
llSqlcnt.Open () ;
SqlDataAdapter thisSda = new SqlDataAdapter ("SELECT 产品ID ,产品名称 FROM 产品" ,llSqlcnt) ;
SqlCommandBuilder scbd = new SqlCommandBuilder (thisSda) ;
DataSet dset = new DataSet () ;
thisSda.Fill (dset,"产品") ;
Console.WriteLine ("jfslja;fjs{0}" , dset.Tables ["产品"].Rows [2]["产品名称"]) ;//产品表//Rows[2]表示"产品名称"那一列第二行的意思.

dset.Tables ["产品"].Rows [2]["产品ID"] ="1" ;
thisSda.Update(dset ,"产品") ;
Console.WriteLine ("{0}",dset.Tables ["产品"].Rows [2]["产品ID"]) ;

//
// TODO: 在此处添加代码以启动应用程序
//
}
}
}

图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 数据 
2006-08-27 20:37
casualhewo
Rank: 1
等 级:新手上路
帖 子:267
专家分:0
注 册:2006-6-13
收藏
得分:0 
能不能告诉我哪里出错了啊 !!!晕.

超越自己,挣脱平凡
2006-08-27 20:38
mylover624
Rank: 1
来 自:乖乖的心中
等 级:新手上路
帖 子:868
专家分:0
注 册:2006-7-6
收藏
得分:0 

请问你这"产品ID"是不是主键啊.


一个天才顶不上十个笨蛋!
书山有路勤为径,学海无涯友相伴。
我的E-mail:mylover624@.cn
2006-08-27 22:00
casualhewo
Rank: 1
等 级:新手上路
帖 子:267
专家分:0
注 册:2006-6-13
收藏
得分:0 
恩,不是的,和这个有关系吗?
产品的是表名啊!

超越自己,挣脱平凡
2006-08-27 22:36
月夜枫华
Rank: 4
等 级:贵宾
威 望:12
帖 子:437
专家分:42
注 册:2006-1-2
收藏
得分:0 
SqlDataAdapter进行更新时,使用的是关联的UpdateCommand,如果你的SqlDataAdapter是用系统自动生成的,表还没有主键则UpdateCommand的ComamndText属性为"",无法进行更新。

2006-08-28 11:57
casualhewo
Rank: 1
等 级:新手上路
帖 子:267
专家分:0
注 册:2006-6-13
收藏
得分:0 
版主我用什么方法可以设主键了.
或者用代码,版主你可以不可以给个实例,跟我的表一样的实例.
谢谢!

超越自己,挣脱平凡
2006-08-28 15:01
mylover624
Rank: 1
来 自:乖乖的心中
等 级:新手上路
帖 子:868
专家分:0
注 册:2006-7-6
收藏
得分:0 
DataColumn[] keys = new DataColumn [1] ;
keys[0] = dat.Columns ["产品id"] ;
dat.PrimaryKey = keys ;

一个天才顶不上十个笨蛋!
书山有路勤为径,学海无涯友相伴。
我的E-mail:mylover624@.cn
2006-08-28 16:03
casualhewo
Rank: 1
等 级:新手上路
帖 子:267
专家分:0
注 册:2006-6-13
收藏
得分:0 

using System;
using System.Data ;
using System.Data.SqlClient ;
using System.Data.OleDb ;

namespace DataReaderExample
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class DataReaderExample
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{

//thisSda.InsertCommand = str;

string myConnection =@"provider= microsoft.Jet.OLEDB.4.0;Data Source = C:\BegCSharp\AppendixB\Northwind.mdb" ;
string myTableName = "订单" ;
OleDbConnection llSqlcnt = new OleDbConnection (myConnection) ;
llSqlcnt.Open () ;
DataSet dset = new DataSet () ;

OleDbDataAdapter thisSda = new OleDbDataAdapter ("SELECT * FROM 订单" ,llSqlcnt) ;
thisSda.FillSchema(dset,"订单ID");
DataColumn[] keys = new DataColumn [1] ;
keys[0] = dset.Tables ["订单"].Columns ["订单ID"] ;
dset.Tables ["订单"].PrimaryKey = keys ;
//OleDbCommand str;
//cmd = new OleDbCommand("UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
// "WHERE CustomerID = @oldCustomerID", conn);
// cmd = new OleDbCommand("INSERT INTO Customers (CustomerID, CompanyName) " +
// "VALUES (@CustomerID, @CompanyName)", conn);


//str = new OleDbCommand ("INSERT INTO 订单 (订单ID, 客户ID) " +"VALUES (@111, @2222)", llSqlcnt);
//thisSda.InsertCommand = str;
OleDbCommandBuilder scbd = new OleDbCommandBuilder (thisSda) ;

string mySelectQuery = "SELECT * FROM 订单" ;
thisSda.SelectCommand = new OleDbCommand (mySelectQuery , llSqlcnt) ;

thisSda.Fill (dset,myTableName) ;
Console.WriteLine ("fjskjflskjf{0}" , dset.Tables ["订单"].Rows.Count ) ;

DataRow findRow = dset.Tables ["订单"].Rows.Find("123456") ;

if (findRow== null)
{
DataRow drow = dset.Tables ["订单"].NewRow () ;
drow["订单ID"] ="111" ;
drow["客户ID"] = "VISSL" ;
dset.Tables ["订单"].Rows.Add(drow) ;
Console.WriteLine ("{0}" ,dset.Tables["订单"].Rows.Count ) ;
if ((findRow = dset.Tables ["订单"].Rows.Find("123456"))!=null)
{
Console.WriteLine ("fskajriwjfsiojfiwfojsof") ;
}
}
else
{
Console.WriteLine ("fjsioaw8jrowjddddddddddddddddddddddddd") ;
}
thisSda.Update (dset ,myTableName) ;
我是这么写的啊!过不去啊!不行啊.


超越自己,挣脱平凡
2006-08-28 16:37
casualhewo
Rank: 1
等 级:新手上路
帖 子:267
专家分:0
注 册:2006-6-13
收藏
得分:0 


大家知道,DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本”进行更新,然后在将“原本”更新,按照我的理解就是把“原本”覆盖掉。具体到过程,首先是要找到需要更新的行,然后赋新值,最后更新原数据库。

要找到需要修改的行,比较方便的做法就是根据记录中的某个值进行查找,这样比用“列号”“行号”什么的方便多了。要做到这一点,首先就是要给数据库指定一个主键,然后即可按照主键进行查找。要注意的是这个主键必须要是在程序中指定的,并且这个主键不一定和你数据库原来有的主键一样。

然后就是最后的更新,当然是用DataAdapter的Update()方法借助CommandBuilder来实现,要注意的是,如果你的数据库一开始没有定义主键,那进行更新的时候会出错,返回的错误将是“对于不返回任何键列信息的 SelectCommand 不支持 UpdateCommand 的动态 SQL 生成。”这是因为我们用的Update()实际上是通过CommandBuilder动态生成sql语句,然后才进行的数据库操作。但如果你在一开始创建DataAdapter时的那个sql语句没有包含有主键的列的话,那CommandBuilder将不会发生作用。这一点是必须要牢记的。

说了这么多,如果有不明白的就看下面的程序,这个是我练习时写的,里面有一些个人的设定,比如记录名什么的,相信大家一看就明白。
DataColumn[] keys = new DataColumn [1] ;
keys[0] = dset.Tables ["产品"].Columns ["产品ID"] ;
dset.Tables ["产品"].PrimaryKey = keys ;
用Update()方法必须设置主健


超越自己,挣脱平凡
2006-08-28 18:59
mylover624
Rank: 1
来 自:乖乖的心中
等 级:新手上路
帖 子:868
专家分:0
注 册:2006-7-6
收藏
得分:0 
呵呵,这都是在做的过程中所得的经验啊。。

一个天才顶不上十个笨蛋!
书山有路勤为径,学海无涯友相伴。
我的E-mail:mylover624@.cn
2006-08-28 19:58
快速回复:为什么不能更新数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025779 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved