我碰到以下问题,......................................用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() 也没有用..........................................................................
那位找得到原因吗?.....................................
如何解决这种情况......................................
虽然我用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() 也没有用..........................................................................
那位找得到原因吗?.....................................
如何解决这种情况......................................
是用select语句执行update的原因?
使用SqlCommandBuilder更新数据库失败,查看数据表是否有主键,看DataRow的行状态
DataSet ds = new DataSet();
SqlDataAdapter sda;
private void button1_Click(object sender, EventArgs e)
{
ds.Tables.Clear();
sda = new SqlDataAdapter("", conn);
sda.Fill(ds);
this.dataGridView1.DataSource = ds.Tables[0];
} private void button2_Click(object sender, EventArgs e)
{
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(ds);
this.dataGridView1.DataSource = ds.Tables[0];
}
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应该也一样);
thisDataSet.Tables["salary"].Merge(excelDataSet.Tables[sheetName], false, MissingSchemaAction.Ignore);
这句话,你只要把excelDataSet.Tables[sheetName]取出来的datatable的每行数据的RowStae状态改为新添加[DataRowState.Added],这样你就看到效果了
差不多的。
还有就是好像你什么也没有做。
SqlDataAdapter sda;
private void button1_Click(object sender, EventArgs e)
{
ds.Tables["表名"].Clear();
sda = new SqlDataAdapter("SQL语句", conn);
sda.Fill(ds);
this.dataGridView1.DataSource = ds.Tables["表名"];
} private void button2_Click(object sender, EventArgs e)
{
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(ds,"表名");
}
我出现问题是因为用来显示dataGridView的dataSet的table名和用来更改的table名不一样,导致填充时是一个新表,于是根本就没有修改。
你看一下外面用来显示dataGridView的数据源是不是thisDataSet.table["salary"],如果不是就改成一样的。
如果跟我是一样的问题,那就给点分给我吧。
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();
}
楼主可以试试看foreach循环看看thisDataSet.Tables["salary"] 中的每条记录的rowState,是否是Added,或者Updated?
Added
已将该行添加到表中,但尚未调用 AcceptChanges。
Modified
已更改了行的某个元素。
主键我已经设置了,所以不存在主键的问题.
另外Modified 这种也是不行的.我用setModified 而且我用foreach后行状态的确是已修改的.可是也没有用.
------------------------------------------------
以上情况sqlcommandbuilder命令没有作用.只有手动指定update命令才是正道.
2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);
这点和13楼说的是一样的.
{
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"]);
}
}