不用CODE,我两张表都直接绑定到DataGrid的,只有一个按钮,内容如下:try
{
daProdList.Update( dsMyData.ProdList );
daCardList.Update( dsMyData.CardList );
}
catch( OleDbException ex )
{
MessageBox.Show( ex.ToString() );
}
{
daProdList.Update( dsMyData.ProdList );
daCardList.Update( dsMyData.CardList );
}
catch( OleDbException ex )
{
MessageBox.Show( ex.ToString() );
}
ms-help://MS.NETFrameworkSDKv1.1.CHS/cpguidenf/html/cpconaddingconstraintstodataset.htmForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
custDS.Tables["CustTable"].Columns["CustomerID"],
custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);
数据库里有ProdList和CardList两张表,关系是一对多。那我说得再详细一点吧!我的程序是为了要把EXCEL数据追加进ACCESS数据库而编写的。采用的方法是先把ACCESS数据加载进数据集,然后把EXCEL数据追加进数据集里,再用数据集的内容更新数据库。
数据库里有ProdList和CardList两张表,关系是一对多。/// <summary>
/// 追加品番数据
/// </summary>
/// <param name="strFileName">追加文件名</param>
private void AppendProd( string strFileName )
{
dsData.ProdListRow drNew;
OleDbTransaction trnNew; //
// 数据库连接
//
string strConn = string.Format(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", strFileName );
OleDbConnection cn = new OleDbConnection( strConn ); cn.Open();
trnNew = cn.BeginTransaction();
//
// 数据命令
//
string strSelect = string.Format(
"SELECT DISTINCT MMPROD, MMSFIX FROM [{0}$] WHERE MMPROD <> '' AND MMSFIX <> ''",
Path.GetFileNameWithoutExtension(strFileName) );
OleDbCommand cmdSelect = new OleDbCommand( strSelect, cn, trnNew );
//
// 读取EXCEL文件中的切断场所
//
OleDbDataReader rdrNew = cmdSelect.ExecuteReader();
try
{
string prod = "";
string sfix = "";
while( rdrNew.Read() )
{
prod = rdrNew["MMPROD"].ToString().Trim();
sfix = rdrNew["MMSFIX"].ToString().Trim();
if( !IsProdExist( prod, sfix ) )
{
drNew = dsMyData.ProdList.NewProdListRow();
drNew["PF_PROD"] = prod;
drNew["PF_SFIX"] = sfix;
dsMyData.ProdList.AddProdListRow( drNew );
}
}
rdrNew.Close();
trnNew.Commit();
}
catch( OleDbException ex )
{
trnNew.Rollback();
MessageBox.Show( ex.ToString() );
}
finally
{
cn.Close();
}
}
/// <summary>
/// 追加卡片数据
/// </summary>
/// <param name="strFileName">追加文件名</param>
private void AppendCard( string strFileName )
{
dsData.CardListRow drNew;
OleDbTransaction trnNew;
//
// 数据库连接
//
string strConn = string.Format(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", strFileName );
OleDbConnection cn = new OleDbConnection( strConn ); cn.Open();
trnNew = cn.BeginTransaction();
//
// 数据命令
//
string strSelect = string.Format(
"SELECT * FROM [{0}$] " +
"WHERE MMCUTA <> '' AND MMPROD <> '' AND MMSFIX <> '' " +
"AND MMWKNN <> '' AND MMWSIN <> '' AND MMTER1 <> '' " +
"AND MMTER2 <> '' AND MATCD1 <> '' AND MATCD2 <> ''",
Path.GetFileNameWithoutExtension(strFileName) );
OleDbCommand cmdSelect = new OleDbCommand( strSelect, cn, trnNew );
//
// 读取EXCEL文件中的切断场所
//
OleDbDataReader rdrNew = cmdSelect.ExecuteReader();
try
{
while( rdrNew.Read() )
{
drNew = dsMyData.CardList.NewCardListRow(); // 这里调用自定义函数GetProdPK获取品番主键
drNew["PF_PK"] = GetProdPK( rdrNew["MMPROD"].ToString().Trim(),
rdrNew["MMSFIX"].ToString().Trim() ); //
// ...
//
dsMyData.CardList.AddCardListRow( drNew );
}
rdrNew.Close();
trnNew.Commit();
}
catch( OleDbException ex )
{
trnNew.Rollback();
MessageBox.Show( ex.ToString() );
}
finally
{
cn.Close();
}
}
/// <summary>
/// 获取品番主键
/// </summary>
/// <param name="prod">品番</param>
/// <param name="sfix">阶段</param>
/// <returns>品番主键</returns>
private int GetProdPK( string prod, string sfix )
{
foreach( DataRow row in dsMyData.ProdList.Rows )
{
if( row.RowState != DataRowState.Deleted &&
row["PF_PROD"].ToString() == prod &&
row["PF_SFIX"].ToString() == sfix )
{
return (int)row["PF_PK"];
}
} return -1;
}
急呀!
大家可以跟着我的做法试做一下,帮我解决这个问题。1、在设计时把表绑定到DataGrid,并创建两个按钮:一个是追加数据用的,一个是Update数据源用的;
2、程序启动时Fill数据表;
3、在追加数据的按钮里面调用自定义的AppendProd(),再试着通过DataGrid添加、修改、删除数据(多试几次);
4、更新数据(这时很有可能就会出错了)。
谁能帮我解决这问题的,我可以单独开帖送他一百分!!!
如果是一个ProdList对应于多个CartList的话。
ProdList的ID是不能随意改变的,一定要先改变CartList对于ID的引用。
举个例子:
删除ProdID为0001的产品,而没有删除CartList中的对应项。这样
的SQL语句是不能执行的。肯定会报错。要找出问题的所在首先要重复一下你的错误,先清空所有数据,然后
想办法重现错误,并作详细记录。我的猜测:
1.CartList中引用了ProdID作为外部关键字(或约束)
2.你修改的是CartList的ProdID的值
3.恰好该值在ProdID中没有对应,所以报错。如果只有一张表还会出错,事情就难办了。请写出详细报错。
daPartNumbers.Update( dsMyData, "PartNumbers" );
改为
daPartNumbers.Update( dsMyData, "PartNumbers" );
dsMyData.PartNumbers.Clear();
daPartNumbers.Fill( dsMyData, "PartNumbers" );再观察了一下,一开始读入的两条记录编号是1和2,执行完更新操作之后变成了78和79!!!难怪删除记录的时候会出错……现在问题暂时是解决了,可像那种笨办法总不能一用再用吧?我还是期待有个从道理上能说得通的解决方法。
if(dsMyData.GetChange() !=null)
{
daPartNumbers.Update( dsMyData, "PartNumbers" );
}
dsMyDate.AccepChanges();
daPartNumbers.Update( dsMyData.GetChange() , "PartNumbers" );这样会少提交点数据