千分散尽还复来,发贴必高分.........追终为什么..................................................100

poloyzhang 2010-07-31 08:11:34
我碰到以下问题,......................................用sqlcommandBuilder 无法更新数据库.其实datagridview中已经更新了值.
虽然我用sqlcommand 命令也更新好达到同样效果.但是我想追究的是sqlcommadnbuilder 为什么会没有起作用.
看以下代码.............................


using (SqlConnection mycon = new SqlConnection(appCon))
{
mycon.Open();
string cmd = "SELECT * from [Salary]";
SqlDataAdapter sda = new SqlDataAdapter(cmd, mycon);

SqlCommandBuilder thisBulider = new SqlCommandBuilder(sda);
thisDataSet = new DataSet();
sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;//显式加载数据库主键
sda.Fill(thisDataSet, "salary");


////------------------Merge---------
thisDataSet.Tables["salary"].Merge(excelDataSet.Tables[sheetName], false, MissingSchemaAction.Ignore);
//
dataGridView1.DataMember = null;
dataGridView1.DataSource = null;
dataGridView1.DataSource = thisDataSet;
dataGridView1.DataMember = "salary";
///--------------------------------------------
///sqlcommand


sda.Update(thisDataSet, "salary");//这个步骤没有起作用................





------------------------------------------------------
另外说一下,我用 setModified() 也没有用..........................................................................
那位找得到原因吗?.....................................
如何解决这种情况......................................
...全文
496 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
小范f-li.cn 2010-08-12
  • 打赏
  • 举报
回复
峰子2017 2010-08-06
  • 打赏
  • 举报
回复
路过,学习一下,xiexeiLZS.
isaced 2010-08-06
  • 打赏
  • 举报
回复
哇,好的!!!!!!!
wangwenzhuang 2010-08-04
  • 打赏
  • 举报
回复
还是给你上代码,只是证明我说的是对的

class Program
{
static void Main(string[] args)
{
/* sql脚本
create database test
go
use test
go
create table tab1
(
id int identity primary key,
a varchar(10)
)
create table tab2
(
id int identity primary key,
a varchar(10)
)
insert into tab1 values('1')
insert into tab2 values('2')

select * from tab1
*/
DataSet ds = new DataSet();
SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True");
SqlDataAdapter da1 = new SqlDataAdapter("select * from tab1", con);
da1.Fill(ds, "Tab1");
SqlDataAdapter da2 = new SqlDataAdapter("select * from tab2", con);
da2.Fill(ds, "Tab2");
foreach (DataRow row in ds.Tables["Tab2"].Rows)
row.SetAdded();
ds.Tables["Tab1"].Merge(ds.Tables["Tab2"]);
SqlCommandBuilder cb = new SqlCommandBuilder(da1);
da1.Update(ds.Tables["Tab1"]);
}
}
poloyzhang 2010-08-03
  • 打赏
  • 举报
回复
以上总结一下:以便大家不要和我一样的错误.
主键我已经设置了,所以不存在主键的问题.
另外Modified 这种也是不行的.我用setModified 而且我用foreach后行状态的确是已修改的.可是也没有用.
------------------------------------------------
以上情况sqlcommandbuilder命令没有作用.只有手动指定update命令才是正道.
2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);
这点和13楼说的是一样的.
哥子谭 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yeyanbinghappy 的回复:]
SqlCommandBuilder只针对单张表,该表必须有主键
[/Quote]
同意,必须有主键
捷哥1999 2010-08-02
  • 打赏
  • 举报
回复
上面有误,应该是:
Added
已将该行添加到表中,但尚未调用 AcceptChanges。

Modified
已更改了行的某个元素。


捷哥1999 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wangwenzhuang 的回复:]

因为你是合并的表,所以合并的数据DataRow的RowState状态为未更改[DataRowState.Unchanged],
thisDataSet.Tables["salary"].Merge(excelDataSet.Tables[sheetName], false, MissingSchemaAction.Ignore);
这句话,你只要把excelDataSet.Tables[sh……
[/Quote]

楼主可以试试看foreach循环看看thisDataSet.Tables["salary"] 中的每条记录的rowState,是否是Added,或者Updated?
一克代码 2010-08-02
  • 打赏
  • 举报
回复
友情帮定!
porschev 2010-08-02
  • 打赏
  • 举报
回复
帮顶一下。。。。
JiuchunYoung 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuyq11 的回复:]
SqlCommandBuilder会根据查询语句自动生成Update,Delete,Insert命令,调用SqlDataAdapter.Update时会根据DataSet中DataTable的DataRow的行状态来执行对应的操作更新数据库
使用SqlCommandBuilder更新数据库失败,查看数据表是否有主键,看DataRow的行状态
DataSet ds = new DataSet……
[/Quote]

正解
pigadd 2010-08-02
  • 打赏
  • 举报
回复
楼上好多大牛都说了
菜鸟在成长 2010-08-02
  • 打赏
  • 举报
回复
呃,同遇,不知道该怎么搞,头大
weiwolong 2010-08-01
  • 打赏
  • 举报
回复
我是楼上,贴一下我的代码吧:

public Form1()
{
InitializeComponent();
conn = new SqlConnection("Data Source=.;Initial Catalog=BookManager;Integrated Security=SSPI");
Methodload();
}

private void Methodload()
{
da = new SqlDataAdapter("select * from BookInfo", conn);
ds = new DataSet();
da.Fill(ds, "BookIn");
this.dataGridView1.DataSource = ds.Tables["BookIn"];
}
SqlConnection conn = null;
SqlDataAdapter da = null;
DataSet ds = null;
private void button1_Click(object sender, EventArgs e)
{

if (MessageBox.Show("确定修改吗?", "修改", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
da = new SqlDataAdapter("select * from BookInfo", conn);
SqlCommandBuilder sb = new SqlCommandBuilder(da);
da.Fill(ds, "BookIn");
//判断是否修改成功
int num = da.Update(ds.Tables["BookIn"]);
if (num > 0)
{
MessageBox.Show("修改成功");
}
else
{
MessageBox.Show("修改失败");
}
Methodload();

}



}

private void button2_Click(object sender, EventArgs e)
{
Methodload();
}
weiwolong 2010-08-01
  • 打赏
  • 举报
回复
这个问题我也遇到过。
我出现问题是因为用来显示dataGridView的dataSet的table名和用来更改的table名不一样,导致填充时是一个新表,于是根本就没有修改。
你看一下外面用来显示dataGridView的数据源是不是thisDataSet.table["salary"],如果不是就改成一样的。
如果跟我是一样的问题,那就给点分给我吧。
悔说话的哑巴 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuyq11 的回复:]
SqlCommandBuilder会根据查询语句自动生成Update,Delete,Insert命令,调用SqlDataAdapter.Update时会根据DataSet中DataTable的DataRow的行状态来执行对应的操作更新数据库
使用SqlCommandBuilder更新数据库失败,查看数据表是否有主键,看DataRow的行状态
DataSet ds = new DataSet……
[/Quote]
UP
wangwenzhuang 2010-07-31
  • 打赏
  • 举报
回复
sqlcommandBuilder 在自动更新的时候是根据每行数据的RowState生成的。
wangwenzhuang 2010-07-31
  • 打赏
  • 举报
回复
因为你是合并的表,所以合并的数据DataRow的RowState状态为未更改[DataRowState.Unchanged],
thisDataSet.Tables["salary"].Merge(excelDataSet.Tables[sheetName], false, MissingSchemaAction.Ignore);
这句话,你只要把excelDataSet.Tables[sheetName]取出来的datatable的每行数据的RowStae状态改为新添加[DataRowState.Added],这样你就看到效果了
happyer_longlong 2010-07-31
  • 打赏
  • 举报
回复
string emailSql="select email,validFlag from emailMe";
DataSet emailAdd=new DataSet();
SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);
SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);
SqlCommand upCmd=new SqlCommand("update ["+strTableName+"] set validFlag=@validFlag where email=@email",myConn);
upCmd.Parameters.Add("@validFlag",SqlDbType.Int,8,"validFlag");
upCmd.Parameters.Add("@email",SqlDbType.NVarChar,100,"email");
emailAdapter.UpdateCommand=upCmd;
emailAdapter.Fill(emailAdd,"address");
myConn.Close();
......//修改myDs数据
emailAdapter.Update(emailAdd,"address");

总结一下,对这样的问题,解决方法两种:

1. 修改表的定义,定义一个主键;
2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);
upc_xiaowei 2010-07-31
  • 打赏
  • 举报
回复
恩,主键,不排除我有赚可用分的嫌疑
加载更多回复(17)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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