DataGridInvoice???是控件吗??可以说一下吗
如果在DataGrid中是可以直接对DataSet 更新的
try
{
sqlDataAdapter1.Update(dsOrders1);//dsOrders1是绑定的数据集
MessageBox.Show("更新成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
catch(Exception err)
{
MessageBox.Show("更新出错:"+err.ToString());
}
如果在DataGrid中是可以直接对DataSet 更新的
try
{
sqlDataAdapter1.Update(dsOrders1);//dsOrders1是绑定的数据集
MessageBox.Show("更新成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
catch(Exception err)
{
MessageBox.Show("更新出错:"+err.ToString());
}
解决方案 »
- 能否限制只有mstsc /admin连接时才能启动程序
- 发布我写的12306订票外挂——【妈!我回来了】V2.6,自动识别验证码
- C#基础急求
- 判断音乐文件播放完?
- 关于Scrollbar作用范围的问题!!爱好者请进
- 2005C# WinForm 一个奇怪的问题 ------在线
- ItemDataBound事件的循环次数在那里设定?
- 帮我解决以下数据库操作的问题
- 请MS-VIP看看Adapter.update的Delete的BUG是否是微软的BUG?
- 配置文件appsetting中只能有key和value属性么?
- 为什么.net里没有视图/文档模式?在.net下如何写传统的Windows程序?
- 怎么模仿MSN右下角滚出的小窗口!
string Invoice="SELECT 购货单位,日期,货名及规格,单位,数量,单价,金额,图片位置,备注 FROM invoice";
OleDbConnection conn=new OleDbConnection(Src);
da=new OleDbDataAdapter(Invoice,conn);OleDbCommandBuilder custCB = new OleDbCommandBuilder (da);//加上这一句看看;ds=new DataSet();
da.Fill(ds,"invoice");
dataGridInvoice.SetDataBinding(ds,"invoice");
OleDbCommandBuilder custCB = new OleDbCommandBuilder (da);这一句不管是加到buttonShowAll里面还是buttonUpdate里面都不管用,你想啊,只加这么一句后面根本没用上custCB这个OleDbCommandBuilder类的实例,你能不能写详细一点啊。alexlimingjun:
你肯定没看明白我的意思,我说得是当我修改了一个网格的数据之后,注意,这个网格可以在任一行的任一列,当我更新的时候,所有行的内容和我修改的网格所在行的内容都一样了,但列与列之间的内容还是不一样的,就是下面这样
a b c d e
a b c d e
a b c d e
a b c d e我查询那部分没问题的,显示出来的和数据库内容完全一致,只是更新有问题,是你们没看明白我的问题还是怎么回事,怎么我问得问题很难吗,是不是高手都回家过年了。
using System.Drawing;
using System.Data;
using System.Data.OleDb;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;namespace Invoice
{
/// <summary>
/// InvoiceUpdate 的摘要说明。
/// </summary>
public class InvoiceUpdate : System.Windows.Forms.Form
{
private System.Windows.Forms.DataGrid dataGridInvoice;
private System.Windows.Forms.Label labelTitle;
private System.Windows.Forms.Button buttonShowAll;
private System.Windows.Forms.Button buttonUpdate;
int i=0;
int[] Cell=new int[9];//创建一个数组,用于存储用户曾经点击过的单元格对应的列的列号,且无重复
DataSet ds;
OleDbDataAdapter da;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null; public InvoiceUpdate()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent(); //
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
} /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
} #region Windows Form Designer generated code
//这部分已被我略去
#endregion
private void buttonShowAll_Click(object sender, System.EventArgs e)//显示数据库所有内容到dataGridInvoice,这部分肯定没问题
{
string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
string Invoice="SELECT 购货单位,日期,货名及规格,单位,数量,单价,金额,图片位置,备注 FROM invoice";
OleDbConnection conn=new OleDbConnection(Src);
da=new OleDbDataAdapter(Invoice,conn);
ds=new DataSet();
da.Fill(ds,"invoice");
dataGridInvoice.SetDataBinding(ds,"invoice");
} private void buttonUpdate_Click(object sender, System.EventArgs e)//这部分语法没问题,逻辑问题严重
{
labelTitle.Text=Cell[i].ToString();////经显示,一切正常,Cell[i]的当前值就是用户最后一次点击的以前没有点击过的网格的列号
string Upt="";
string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
switch(Cell[i])//这里本来需要将数组Cell[i]的值依次读出进行判断的,现在只是测试看最后一次点击的网格的列号与下列值如果匹配的话能不能更新
{
case 0:Upt="UPDATE invoice SET 购货单位=@购货单位 WHERE 日期=@日期 AND 货名及规格=@货名及规格 AND 单位=@单位 AND 数量=@数量 AND 单价=@单价 AND 金额=@金额 AND 图片位置=@图片位置 AND 备注=@备注";break;
case 1:Upt="UPDATE invoice SET 日期=@日期 WHERE 购货单位=@购货单位 AND 货名及规格=@货名及规格 AND 单位=@单位 AND 数量=@数量 AND 单价=@单价 AND 金额=@金额 AND 图片位置=@图片位置 AND 备注=@备注";break;
case 2:Upt="UPDATE invoice SET 货名及规格=@货名及规格 WHERE 购货单位=@购货单位 AND 日期=@日期 AND 单位=@单位 AND 数量=@数量 AND 单价=@单价 AND 金额=@金额 AND 图片位置=@图片位置 AND 备注=@备注";break;
}
OleDbConnection conn=new OleDbConnection(Src);
da.UpdateCommand=new OleDbCommand(Upt,conn);
OleDbParameter Para;
Para=da.UpdateCommand.Parameters.Add("@购货单位",OleDbType.Char);
Para.SourceColumn="购货单位";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@日期",OleDbType.Char);
Para.SourceColumn="日期";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@货名及规格",OleDbType.Char);
Para.SourceColumn="货名及规格";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@单位",OleDbType.Char);
Para.SourceColumn="单位";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@数量",OleDbType.Char);
Para.SourceColumn="数量";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@单价",OleDbType.Char);
Para.SourceColumn="单价";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@金额",OleDbType.Char);
Para.SourceColumn="金额";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@图片位置",OleDbType.Char);
Para.SourceColumn="图片位置";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@备注",OleDbType.Char);
Para.SourceColumn="备注";
Para.SourceVersion=DataRowVersion.Current;
da.Update(ds,"invoice");
} private void dataGridInvoice_CurrentCellChanged(object sender, System.EventArgs e)
{
int CurrentNumber=dataGridInvoice.CurrentCell.ColumnNumber;//获取当前网格的列号
bool ExistNumber=false;
for(int j=0;j<=i;j++)//判断数组Cell[i]的前面所有项中有没有当前网格的列号,如果有就不再重复添加了
{
if(Cell[j]==CurrentNumber)
{
ExistNumber=true;
}
}
if(ExistNumber==false)//否则,将当前网格的列号添加到Cell[]数组中
{
i++;
Cell[i]=dataGridInvoice.CurrentCell.ColumnNumber;
}
labelTitle.Text=Cell[i].ToString();//经显示,一切正常,Cell[i]的当前值就是用户最后一次点击的以前没有点击过的网格的列号
}
}
}
虽然这段程序即使如果能成功的话,当用户点击某一个网格即使不修改也有可能使Cell[i]包含该列,但问题不大。
这段程序运行的时候,第一列总能成功更新,而且可以批量更新该列的所有行,所以我只是获取了修改过的数据对应的列号,因为只要知道了列号而且使列号不重复,就是说当你点击了第一列然后第二列然后再第一列的话Cell[i]里面不会再有0这个值,最终不管你点击了那一行的那一列都会更新,多么美好的愿望可惜问题很多,主要是:更新第一列的所有行都没有问题,成功无误,注意,如果只点击了第一列,Cell[0]=0,对应case 0:,但只要点击过第二列,此时显示Cell[i]为1,对应Case 1:,但更新不成功,提示错误:“并发冲突:UpdateCommand影响0个记录”,说明更新不成功,不知道为什么,高手请指点,我保证谁帮我解决了datagrid的更新问题给200分我都乐意。
////
还有你用列来改变时,第一例改变时正确,第二次点时,因为第一次已改变,并且好象可能改变某个主键列,主键列是不可改变,你的问题我以前也出现过。
我的程序思路是获取更改过的网格所对应的列,不是行,我的确是要更新所有行,之所以不获取网格的行是因为随着数据库的增大,行数会越来越多,而列数毕竟有限而且不会很多,所以当我获取了修改过的网格对应的列号以后,更新该列的所有行,而且现在还不考虑性能优化,程序还没实现呢。huan_jinwu你的解答很不错,不过这句我不懂,“还有你用列来改变时,第一例改变时正确,第二次点时,因为第一次已改变,并且好象可能改变某个主键列,主键列是不可改变,你的问题我以前也出现过。”问题好象不是你说的这样,我的数据库里的确没有主键,当列改变时,Cell[i]获取的是当前网格的列号,所以我还需要一个循环依次提取Cell[i]数组里的内容,他们是获取的列号的集合,然后依次更新每列的所有行,我觉得思路好象还可以,只是实现不了。我会考虑添加一个主键ID,那样的话好象必须得获取行号而不是列号了,因为只有行号和主键ID才能对应的上,这样我就得要限制一次可修改的行数了,不过大批量修改的可能性也不大,主要是修改出错的内容,然后把主键ID加到WHERE里面作为条件,不知道这个思路对不对,请huan_jinwu指点,另外,你做过的那段程序能不能给我看看,我只要那一段,发到或者贴在这里如果不涉及商业秘密的话,不胜感激。2002pine我更新的程序里面有where了,只是好象不对。
OleDbConnection conn;
DataSet ds;
OleDbDataAdapter da;
private void buttonShowAll_Click(object sender, System.EventArgs e)
{
string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
string Invoice="SELECT * FROM invoice";
conn=new OleDbConnection(Src);
da=new OleDbDataAdapter(Invoice,conn);
ds=new DataSet();
da.Fill(ds,"invoice");
dataGridInvoice.SetDataBinding(ds,"invoice");
}
private void buttonUpdate_Click(object sender, System.EventArgs e)
{
string Upt="UPDATE invoice SET 购货单位=@购货单位,日期=@日期,货名及规格=@货名及规格,单位=@单位,数量=@数量,单价=@单价,金额=@金额,图片位置=@图片位置,备注=@备注,旋转=@旋转 WHERE 编号=@编号";
da.UpdateCommand=new OleDbCommand(Upt,conn);
OleDbParameter Para;
Para=da.UpdateCommand.Parameters.Add("@编号",OleDbType.BigInt);
Para.SourceColumn="编号";
Para.SourceVersion=DataRowVersion.Original;
Para=da.UpdateCommand.Parameters.Add("@购货单位",OleDbType.VarChar);
Para.SourceColumn="购货单位";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@日期",OleDbType.VarChar);
Para.SourceColumn="日期";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@货名及规格",OleDbType.VarChar);
Para.SourceColumn="货名及规格";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@单位",OleDbType.VarChar);
Para.SourceColumn="单位";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@数量",OleDbType.VarChar);
Para.SourceColumn="数量";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@单价",OleDbType.VarChar);
Para.SourceColumn="单价";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@金额",OleDbType.VarChar);
Para.SourceColumn="金额";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@图片位置",OleDbType.VarChar);
Para.SourceColumn="图片位置";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@备注",OleDbType.VarChar);
Para.SourceColumn="备注";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@旋转",OleDbType.VarChar);
Para.SourceColumn="旋转";
Para.SourceVersion=DataRowVersion.Current;
da.Update(ds,"invoice");
}可是还有运行错误,提示是:"标准表达式中数据类型不匹配",我的Invoice.mdb文件中只有“编号“字段是“自动编号”,类型是“长整型”,其他全为文本,不知道怎么就类型不匹配,把所有的OleDbType.VarChar改为OleDbType.Char提示不变。另外,“编号”字段不能设成主键,否则,提示错误:“并发冲突:UpdateCommand影响0个记录”,什么问题,我真的不知道为什么了。