这儿有一段代码,你参考一下:
private void btnLoad_Click(object sender, System.EventArgs e)
{
try
{
// 创建一个新数据集来保存对主数据集所做的更改。
WindowsApplication1.DataSte1 objDataSetChanges = new WindowsApplication1.DataSte1();
// 停止当前的任何编辑。
this.BindingContext[objDataSet1,"表名"].EndCurrentEdit();
// 获取对主数据集所做的更改。
objDataSetChanges = ((WindowsApplication1.DataSte1)(objDataSte1.GetChanges()));
// 检查是否做了任何更改。
if ((objDataSetChanges != null))
{
try
{
// 需要做一些更改,所以尝试通过调用 update 方法
// 和传递数据集以及任何参数来更新数据源。
this.UpdateDataSource(objDataSetChanges);
objDataSte1.Merge(objDataSetChanges);
objDataSte1.AcceptChanges();
}
catch (System.Exception eUpdate)
{
// 在此处添加错误处理代码。
throw eUpdate;
}
// 添加代码以检查返回的数据集中是否有任何可能已被
// 推入到行对象错误中的错误。
}
}
catch (System.Exception eLoad)
{
// 在此处添加错误处理代码。
// 显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eLoad.Message);
}}
private void btnLoad_Click(object sender, System.EventArgs e)
{
try
{
// 创建一个新数据集来保存对主数据集所做的更改。
WindowsApplication1.DataSte1 objDataSetChanges = new WindowsApplication1.DataSte1();
// 停止当前的任何编辑。
this.BindingContext[objDataSet1,"表名"].EndCurrentEdit();
// 获取对主数据集所做的更改。
objDataSetChanges = ((WindowsApplication1.DataSte1)(objDataSte1.GetChanges()));
// 检查是否做了任何更改。
if ((objDataSetChanges != null))
{
try
{
// 需要做一些更改,所以尝试通过调用 update 方法
// 和传递数据集以及任何参数来更新数据源。
this.UpdateDataSource(objDataSetChanges);
objDataSte1.Merge(objDataSetChanges);
objDataSte1.AcceptChanges();
}
catch (System.Exception eUpdate)
{
// 在此处添加错误处理代码。
throw eUpdate;
}
// 添加代码以检查返回的数据集中是否有任何可能已被
// 推入到行对象错误中的错误。
}
}
catch (System.Exception eLoad)
{
// 在此处添加错误处理代码。
// 显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eLoad.Message);
}}
解决方案 »
- 不同的App里connectionString相同,是否这些App共享一个连接池?
- Winform中窗体在引用用户控件中BindingNavigator控件的BindSource怎么得来的?
- 求助
- 急急急啊。该怎么办呢?aspx.高手请进
- [求助]如何在重载==操作符的函数中做是否为null的判断?
- 從Access讀出二進制時出錯(在線等......................急死人啦)分不夠可以加
- comboBox数据绑定显示问题~在线等~!
- 用.net写的Dll文件怎么可以让VB等程序引用啊
- 如何使屏幕捕捉的显示速度加快,内附代码??
- combobox的问题
- 我的困惑
- 怎样才能在程序运行期间删除一个使用过的DLL文件
{
DialogResult r = MessageBox.Show ( "是否删除当前记录!" , "删除当前记录!" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;
int ss = ( int ) r ;
if ( ss == 6 ) // 按动"确定"按钮
{
try
{
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = test.mdb " ;
//OleDbConnection myConn = new OleDbConnection ( strCon ) ;
// myConn.Open ( ) ;
string strDele = "DELETE FROM 123 WHERE id= " + dataGrid1[myBind.Position,0].ToString() ;
// OleDbCommand myCommand = new OleDbCommand(strDele,myConn) ;
try
{
OleDbConnection myCon = new OleDbConnection(strCon);
OleDbCommand myCmd = new OleDbCommand(strDele, myCon);
myCmd.Connection.Open();
myCmd.ExecuteNonQuery();
myCon.Close(); }
catch(Exception exc)
{
MessageBox.Show(strDele);
MessageBox.Show(exc.ToString());
}
//从数据库中删除指定记录
//从DataSet中删除指定记录
myDataSet.Tables [ "123" ] . Rows [ myBind.Position ] . Delete ( ) ;
myDataSet.Tables [ "123" ] . AcceptChanges ( ) ;
myAccessConn.Close ( ) ;
}
catch ( Exception ed )
{
MessageBox.Show ( "删除记录错误信息: " + ed.ToString ( ) , "错误!" ) ;
}
}
}
if (dataset.HasChanges())
{
String sSQL ="select * from testtable " ;
OleDbCommand cm=new OleDbCommand(sSQL, adoconn.cn);
OleDbDataAdapter reader = new OleDbDataAdapter(cm);
reader.Update (dataset,"testtable"); //这句出现了"当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand。"
MessageBox.Show ("更新完毕");
}
是否可以再具体些介绍一下。
另外,也许不是我一个人遇到这个问题,但查阅了所有CSDN,C#和VB.net的论坛都没有人在这个问题上有清楚的回答!哎,难道真的没有高人~还是我水平太低!!!!,读不懂!
大部分代码是照数据窗体向导生成的代码写的,只是把数据控件用手写代码代替,关键有几点。
我用的是SQL。
在生成数据表的时候,要用SqlCommandBuilder生成更新语句。
在表中设定主键。
另外我在填充dataset的时候,我用别的数据表名都出错,只有用“table”这个名好使,不知为什么。
下面是源码。将数据绑定在datagrid上: strCon="Initial Catalog=test;Data Source=localhost;User ID=sa;Password=;Integrated Security=SSPI";
myConn=new SqlConnection(strCon);
myConn.Open();
strsql="select * from aaa";
//创建一个 DataSet
mydataset=new DataSet();
//用 sqlDataAdapter 得到一个数据集
myCommand = new SqlCommand(strsql ,myConn) ;
myDataAdapter=new SqlDataAdapter(myCommand);
SqlCommandBuilder custCB = new SqlCommandBuilder(myDataAdapter);
//把Dataset绑定table数据表
myDataAdapter.Fill(mydataset,"Table");
mydataset.Tables[0].PrimaryKey=new DataColumn[] {mydataset.Tables[0].Columns[mk]};
//关闭此OleDbConnection
dataGrid1.DataSource=mydataset.Tables[0];
myCommand.Dispose();
myConn.Close();更新部分代码: private void button1_Click(object sender, System.EventArgs e)
{
try
{
// 尝试更新数据源。
this.UpdateDataSet();
}
catch (System.Exception eUpdate)
{
// 在此处添加错误处理代码。
// 显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eUpdate.Message);
} }
public void UpdateDataSet()
{
// 创建一个新数据集来保存对主数据集所做的更改。
DataSet objDataSetChanges = new DataSet();
// 停止当前的任何编辑。
this.BindingContext[mydataset,"Table"].EndCurrentEdit();
// 获取对主数据集所做的更改。
objDataSetChanges = ((DataSet)(mydataset.GetChanges()));
// 检查是否做了任何更改。
if ((objDataSetChanges != null))
{
try
{
// 需要做一些更改,所以尝试通过调用 update 方法
// 和传递数据集以及任何参数来更新数据源。
this.UpdateDataSource(objDataSetChanges);
mydataset.Merge(objDataSetChanges);
mydataset.AcceptChanges();
}
catch (System.Exception eUpdate)
{
// 在此处添加错误处理代码。
throw eUpdate;
}
// 添加代码以检查返回的数据集中是否有任何可能已被
// 推入到行对象错误中的错误。
} } public void UpdateDataSource(DataSet ChangedRows)
{
try
{
// 在有挂起的更改时,只需要更新数据源即可。
if ((ChangedRows != null))
{
// 打开连接。
this.myConn.Open();
// 尝试更新数据源。
myDataAdapter.Update(ChangedRows);
}
}
catch (System.Exception updateException)
{
// 在此处添加错误处理代码。
throw updateException;
}
finally
{
// 无论是否引发了异常都关闭连接。
this.myConn.Close();
}
}
{
String sSQL ="select * from testtable " ;
OleDbCommand cm=new OleDbCommand(sSQL, adoconn.cn);
OleDbDataAdapter reader = new OleDbDataAdapter(cm);
OleDbCommandBuilder cb = new OleDbCommandBuilder(reader); //关键一句(终于查清楚,还要这么一句,不知是为什么呢,先能更新再说!!值得再讨论一下!!)
reader.Update (dataset,"客户表");
MessageBox.Show ("更新完毕");
}
下面提供一个简单的示例程序,供您参考:
private OleDbCommandBuilder FriendsCmdBuilder; //用于自动生成SQL指令
private DataSet FriendsDataSet= new DataSet();
private OleDbDataAdapter FriendsAdapter;
……
// 通过GridBind,将数据表Friends绑定到DataGrid1
private void GridBind()
{
String ConnStr="Provider=SQLOLEDB;server=SHA-RICKIE-01;uid=user;pwd=user;database=test";
OleDbConnection myConnection= new OleDbConnection(ConnStr);
FriendsAdapter = new OleDbDataAdapter("select * from friends",myConnection);
/// 实例化OleDbCommandBuilder
FriendsCmdBuilder = new OleDbCommandBuilder(FriendsAdapter);
///fill the dataset
FriendsAdapter.Fill(FriendsDataSet, "Friends");
///set the dataset as a datasource for windows datagrid
dataGrid1.SetDataBinding(FriendsDataSet,"Friends");
} private void btnSave_Click(object sender, System.EventArgs e)
{
try
{
///执行inserts,updates,deletes指令
/// Without the OleDbCommandBuilder, this line would fail.
FriendsAdapter.Update(FriendsDataSet,"Friends");
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}关于OleDbCommandBuilder的更详细信息,请参考MSDN:
ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemDataOleDbOleDbCommandBuilderClassTopic.htm — 微软全球技术中心 VB支持中心本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。