问题一:目的是我不知道怎么用C#事务处理机制更新主表与明细表。前提:
数据集,数据适配器是我用拖控件的方式加进程序里面的,不是用DataSet dataSet1 = new DataSet()这样代码的方式。
然后我监控两张表。
cmOrders = (CurrencyManager)BindingContext[dataSet11, 表1];
cmOrders2 = (CurrencyManager)BindingContext[dataSet11, 表2];
接着我加数据
cmOrders.AddNew();
cmOrders2.AddNew();
最后我更新
表1Adapter.Update(dataSet11);
表2Adapter.Update(dataSet11);这两张是主表与明细表,主表的ID在明细里面是外键,而且主明细都在sql server里面设置了ID自增1,所以AddNew();数据的时候不对ID进行添置。现在我就很郁闷了,对我这种情况怎么进行事务处理????//////////////////////////////////////////////////////////////////////////////////////////////////////////////
问题二:
for (int i = 0; i < stockTableTableAdapter1.GetData(strmaterielName).Rows.Count; i++)
{
//灰色
if (stockTableTableAdapter1.GetData(strmaterielName).Rows[i].ItemArray[6].ToString().Trim() == "A")
{
//我想取得某个栏位的值等于A以后把datagridView的i行设置为红色,请问怎么做????
}
}
数据集,数据适配器是我用拖控件的方式加进程序里面的,不是用DataSet dataSet1 = new DataSet()这样代码的方式。
然后我监控两张表。
cmOrders = (CurrencyManager)BindingContext[dataSet11, 表1];
cmOrders2 = (CurrencyManager)BindingContext[dataSet11, 表2];
接着我加数据
cmOrders.AddNew();
cmOrders2.AddNew();
最后我更新
表1Adapter.Update(dataSet11);
表2Adapter.Update(dataSet11);这两张是主表与明细表,主表的ID在明细里面是外键,而且主明细都在sql server里面设置了ID自增1,所以AddNew();数据的时候不对ID进行添置。现在我就很郁闷了,对我这种情况怎么进行事务处理????//////////////////////////////////////////////////////////////////////////////////////////////////////////////
问题二:
for (int i = 0; i < stockTableTableAdapter1.GetData(strmaterielName).Rows.Count; i++)
{
//灰色
if (stockTableTableAdapter1.GetData(strmaterielName).Rows[i].ItemArray[6].ToString().Trim() == "A")
{
//我想取得某个栏位的值等于A以后把datagridView的i行设置为红色,请问怎么做????
}
}
事务处理
using(TransactionScope scope = new TransactionScope())
{}
public void SqlTransactioin(string[] sqls)
{
using(SqlConnection con = new SqlConnection(""))
{
conn.Open();
SqlCommand comm = conn.CreateCommand();
SqlTransaction trans = conn.BeginTransaction();
comm.Transaction = trans;
try
{
foreach (string sql in sqls)
{
comm.CommandText = sql;
comm.ExecuteNonQuery();
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
}
}
conn.Close();
}
{
//灰色
if (stockTableTableAdapter1.GetData(strmaterielName).Rows[i].ItemArray[6].ToString().Trim() == "A")
{
//我想取得某个栏位的值等于A以后把datagridView的i行设置为红色,请问怎么做????
}
}问题2:
datagridview1.rows[i].backcolor = color.red
{
if (e.RowIndex == -1)
return; DataGridViewRow dgr = dataGridView1.Rows[e.RowIndex];
try
{
if(e.ColumnIndex==0)
{
if (dgr.Cells["ID"].Value.ToString() == "1002" )
{
e.CellStyle.BackColor = Color.Red;
}
}
(CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight,
ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry)
VALUES (@CustomerID,@EmployeeID,@OrderDate,@RequiredDate,@ShippedDate,@ShipVia,@Freight,@ShipName,@ShipAddress,@ShipCity,@ShipRegion,@ShipPostalCode,@ShipCountry)
INSERT INTO [Order Details]
(OrderID, ProductID, UnitPrice, Quantity, Discount)
VALUES (@OrderID,@ProductID,@UnitPrice,@Quantity,@Discount)先不说事务处理,就是你说的“4,先由主表适配器Update(dataSet),执行完闭后,dataSet中会自动更新主表和从表的OrderID的值,再由从表适配器Update(dataSet).”这条就不能满足,因为我“更新”数据的时候代码出错,显示明细表的OrderID为空。
即使我在数据适配器里面"加入查询",得到与你类似的代码INSERT INTO [dbo].[Orders] ([CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry]) VALUES (@CustomerID, @EmployeeID, @OrderDate, @RequiredDate, @ShippedDate, @ShipVia, @Freight, @ShipName, @ShipAddress, @ShipCity, @ShipRegion, @ShipPostalCode, @ShipCountry);
SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry FROM Orders WHERE (OrderID = SCOPE_IDENTITY())这样当主表更新,明细的关联ID还是没更新(明细表也有做新的插入方法).
不明白为什么
/////////////////////////////////////////////
后来我用事务处理tableAdapterManager1.Connection.BeginTransaction();发觉只有begintransaction,没有commit与rollback,更不解,请教了我根据的思路,做的北风数据库两张表的测试程序在
http://download.csdn.net/source/2680558
这里可以下载。
麻烦各位帮忙看下,很重要,谢谢各位前辈
最近在忙很多事情,白天上班也不能耽误,所以回复有点迟,对不住。
你的图我看了,也设置了,不行我根据的思路,做的北风数据库两张表的测试程序在
http://download.csdn.net/source/2680558
这里可以下载。这个是我的程式源码,根据你说的弄的,下载不要分的,麻烦你看下,具体分析一下,这样我好死的明白一点,我这种主从关系到底哪里更新有问题??谢谢了,非常感谢
1,修改数据集:见下图
2,修改DataGridView的DataMember:见下图
3修改Form1代码,如下:
public partial class Form1 : Form
{
private CurrencyManager cmOrders;
private CurrencyManager cmOrders2; public Form1()
{
InitializeComponent(); cmOrders = (CurrencyManager)BindingContext[dataSet11, "Orders"];
cmOrders2 = (CurrencyManager)BindingContext[dataSet11, "Orders.FK_Order Details_Orders"];
cmOrders.AddNew();
cmOrders.EndCurrentEdit();
} private void button1_Click(object sender, EventArgs e)
{ this.order_DetailsTableAdapter1.Connection = (SqlConnection)tableAdapterManager1.Connection;
this.ordersTableAdapter1.Connection = (SqlConnection)tableAdapterManager1.Connection;
tableAdapterManager1.Connection.Open();
System.Data.SqlClient.SqlTransaction action = (SqlTransaction)tableAdapterManager1.Connection.BeginTransaction();
try
{
order_DetailsTableAdapter1.Transaction = action;
ordersTableAdapter1.Transaction = action; ordersTableAdapter1.Update(dataSet11);
order_DetailsTableAdapter1.Update(dataSet11); action.Commit();
}
catch (System.Exception eUpdate)
{
action.Rollback();
MessageBox.Show(eUpdate.Message);
}
finally
{
if (tableAdapterManager1.Connection.State != ConnectionState.Closed)
tableAdapterManager1.Connection.Close();
}
}
}
System.Data.InvalidConstrainException:ForeignKeyConstraint FK_Order_Details_Orders requires the child key values to exist in the parent table.似乎Order Details在更新主表的OrderID不行啊,崩溃了