2014-03-31 25 views
1

我有2個dataGridViews綁定到主/明細關係。 當我嘗試添加第二行到主dataGridView我得到以下錯誤。將多行添加到主/細節數據集時出現約束錯誤

system.data.constraintexception列「Project Customer UBF Id」被限制爲唯一。值''已經存在數據關係。

我可以添加多行到子DataGridView,如果我刪除表之間的DataRelation我可以添加多行到主。 另外,如果我手動輸入主鍵的主鍵與下一個自動增量值我可以添加多行,以及添加細節再次這些行。

這些表是使用SQL服務器中的自動增量主鍵設置的。

克服這個錯誤任何幫助,將不勝感激

private void getData() 
{ 
    try 
    { 
     conn = new SqlConnection(connstr); 
     conn.Open(); 

     // Create a DataSet. 
     data = new DataSet(); 
     data.Locale = System.Globalization.CultureInfo.InvariantCulture; 

     string sqlStr = "SELECT [Project Customer UBF].* FROM [Project Customer UBF]; ";      

     // Add data from the Customers table to the DataSet. 
     masterDataAdapter = new 
      SqlDataAdapter(sqlStr, conn); 

     masterDataAdapter.Fill(data, "Customers"); 

     // Add data from the Orders table to the DataSet. 
     detailsDataAdapter = new 
      SqlDataAdapter("SELECT [Project Customer Discount].* FROM [Project Customer Discount]", conn); 
     detailsDataAdapter.Fill(data, "Discounts"); 

     // Establish a relationship between the two tables. 
     DataRelation relation = new DataRelation("CustDist", 
      data.Tables["Customers"].Columns["Project Customer UBF Id"], 
      data.Tables["Discounts"].Columns["Project Customer UBF Id"]); 
     data.Relations.Add(relation); 


     // Bind the master data connector to the Customers table. 
     masterBindingSource.DataSource = data; 
     masterBindingSource.DataMember = "Customers"; 
     masterBindingSource.Filter = "[Project Id] =" + _projectID; 

     // Bind the details data connector to the master data connector, 
     // using the DataRelation name to filter the information in the 
     // details table based on the current row in the master table. 
     detailsBindingSource.DataSource = masterBindingSource; 
     detailsBindingSource.DataMember = "CustDist"; 
     conn.Close();    
    } 
    catch (SqlException) 
    { 
     MessageBox.Show("To run this example, replace the value of the " + 
      "connectionString variable with a connection string that is " + 
      "valid for your system."); 
    } 
} 

private void ProjectEdit_Load(object sender, EventArgs e) 
{ 
    dataGridView1.DataSource = masterBindingSource; 
    dataGridView2.DataSource = detailsBindingSource; 
    getData(); 
} 

回答

0

通過生成自己的更新解決了,刪除和添加commannds了主/父數據表和細節/子數據表:

private void GenerateCommands() { 

    masterDataAdapter.InsertCommand = new SqlCommand(); 
    masterDataAdapter.InsertCommand.CommandText = "INSERT INTO [Project Customer UBF]([Project Id], [Customer Id]," + 
     "[Host Support], Warehoused,[List Price per Case]) " 
    + " VALUES (@ProjID, @CustID, 1, @Ware, 4); " 
    + " SELECT [Project Customer UBF Id],[Project Id], [Customer Id]," + 
     "[Host Support], Warehoused,[List Price per Case]" 
    + " FROM [Project Customer UBF] WHERE ([Project Customer UBF Id]= SCOPE_IDENTITY())"; 
    masterDataAdapter.InsertCommand.Connection = conn; 

    masterDataAdapter.InsertCommand.Parameters.Add("@ProjID", SqlDbType.Int,4,"Project Id"); 
    masterDataAdapter.InsertCommand.Parameters.Add("@CustID", SqlDbType.Int,4,"Customer Id"); 
    masterDataAdapter.InsertCommand.Parameters.Add("@Host", SqlDbType.Bit,1,"Host Support"); 
    masterDataAdapter.InsertCommand.Parameters.Add("@Ware", SqlDbType.Bit,1,"Warehoused"); 
    masterDataAdapter.InsertCommand.Parameters.Add("@List", SqlDbType.Float,8,"List Price per Case"); 


    masterDataAdapter.UpdateCommand = new SqlCommand(); 
    masterDataAdapter.UpdateCommand.CommandText = "UPDATE [Project Customer UBF] SET [Project Id] = @ProjID, " 
    + " [Customer Id] = @CustID, [Host Support] = @Host, Warehoused = @Ware, [List Price per Case] = @List " 
     + "WHERE ([Project Customer UBF Id] = @PCID); "; 

    masterDataAdapter.UpdateCommand.Connection = conn; 

    masterDataAdapter.UpdateCommand.Parameters.Add("@ProjID", SqlDbType.Int,4,"Project Id"); 
    masterDataAdapter.UpdateCommand.Parameters.Add("@CustID", SqlDbType.Int,4,"Customer Id"); 
    masterDataAdapter.UpdateCommand.Parameters.Add("@Host", SqlDbType.Bit,1,"Host Support"); 
    masterDataAdapter.UpdateCommand.Parameters.Add("@Ware", SqlDbType.Bit,1,"Warehoused"); 
    masterDataAdapter.UpdateCommand.Parameters.Add("@List", SqlDbType.Float,8,"List Price per Case"); 
    masterDataAdapter.UpdateCommand.Parameters.Add("@PCID", SqlDbType.Int,4,"Project Customer UBF Id"); 

    masterDataAdapter.DeleteCommand = new SqlCommand(); 
    masterDataAdapter.DeleteCommand.CommandText = "DELETE FROM [Project Customer UBF] " 
     + " WHERE ([Project Customer UBF Id] = @PCID);"; 

    masterDataAdapter.DeleteCommand.Connection = conn; 
    masterDataAdapter.DeleteCommand.Parameters.Add("@PCID", SqlDbType.Int,4,"Project Customer UBF Id"); 

    detailsDataAdapter.InsertCommand = new SqlCommand(); 
    detailsDataAdapter.InsertCommand.CommandText = "INSERT INTO [Project Customer Discount]([Project Customer UBF Id], " 
+ " [Discount Type], [Discount Amt], [Discount UOM]) " 
     + " VALUES (@PCID, @Type, @Amt, @UOM); " 
     + " SELECT [Discount Id],[Project Customer UBF Id], " 
+ " [Discount Type], [Discount Amt], [Discount UOM] " 
     + " FROM [Project Customer Discount] WHERE ([Discount Id] = SCOPE_IDENTITY())"; 
    detailsDataAdapter.InsertCommand.Connection = conn; 

    detailsDataAdapter.InsertCommand.Parameters.Add("@PCID", System.Data.SqlDbType.Int,4, "Project Customer UBF Id"); 
    detailsDataAdapter.InsertCommand.Parameters.Add("@Type", SqlDbType.Int,4,"Discount Type"); 
    detailsDataAdapter.InsertCommand.Parameters.Add("@Amt", SqlDbType.Float,8,"Discount Amt"); 
    detailsDataAdapter.InsertCommand.Parameters.Add("@UOM", SqlDbType.NVarChar,2,"Discount UOM"); 

    detailsDataAdapter.UpdateCommand = new SqlCommand(); 
    detailsDataAdapter.UpdateCommand.CommandText = "UPDATE [Project Customer Discount] SET [Project Customer UBF Id] = @PCID, " 
    + " [Discount Type] = @Type, [Discount Amt] = @Amt, [Discount UOM] = @UOM " 
     + "WHERE ([Discount Id] = @DID); "; 
    detailsDataAdapter.UpdateCommand.Connection = conn; 

    detailsDataAdapter.UpdateCommand.Parameters.Add("@PCID", System.Data.SqlDbType.Int, 4, "Project Customer UBF Id"); 
    detailsDataAdapter.UpdateCommand.Parameters.Add("@Type", SqlDbType.Int, 4, "Discount Type"); 
    detailsDataAdapter.UpdateCommand.Parameters.Add("@Amt", SqlDbType.Float, 8, "Discount Amt"); 
    detailsDataAdapter.UpdateCommand.Parameters.Add("@UOM", SqlDbType.NVarChar, 2, "Discount UOM"); 
    detailsDataAdapter.InsertCommand.Parameters.Add("@DID", System.Data.SqlDbType.Int, 4, "Discount Id"); 

    detailsDataAdapter.DeleteCommand = new SqlCommand(); 
    detailsDataAdapter.DeleteCommand.CommandText = "DELETE FROM [Project Customer Discount] " 
     + " WHERE ([Discount Id] = @DID);"; 
    detailsDataAdapter.DeleteCommand.Connection = conn; 

    detailsDataAdapter.DeleteCommand.Parameters.Add("@DID", System.Data.SqlDbType.Int, 4, "Discount Id"); 
} 

併爲父/主數據表主鍵創建一個autoIncrement。自動增量從-1開始,然後增加-1以保持唯一。

private void CreateRelations() { 
    DataRelation relation = new DataRelation("CustDist", 
     data.Tables["Customers"].Columns["Project Customer UBF Id"], 
     data.Tables["Discounts"].Columns["Project Customer UBF Id"]); 
    data.Relations.Add(relation); 

    data.Tables["Customers"].Columns["Project Customer UBF Id"].AutoIncrement = true; 
    data.Tables["Customers"].Columns["Project Customer UBF Id"].AutoIncrementSeed = -1; 
    data.Tables["Customers"].Columns["Project Customer UBF Id"].AutoIncrementStep = -1; 
} 

代碼創建主/父細節/子集:

private void GetData() 
{ 
    try 
    { 

     conn = new SqlConnection(connstr); 
     conn.Open(); 

     // Create a DataSet. 
     data = new DataSet(); 
     data.Locale = System.Globalization.CultureInfo.InvariantCulture; 

     string sqlStr = "SELECT [Project Customer UBF].* FROM [Project Customer UBF]; "; //WHERE [Project Customer UBF].[Project Id] = " +_projectID;      

     // Add data from the Customers table to the DataSet. 
     masterDataAdapter = new 
      SqlDataAdapter(sqlStr, conn); 

     masterDataAdapter.Fill(data, "Customers"); 

     // Add data from the Orders table to the DataSet. 
     detailsDataAdapter = new 
      SqlDataAdapter("SELECT [Project Customer Discount].* FROM [Project Customer Discount]", conn); 
     detailsDataAdapter.Fill(data, "Discounts"); 

     detailsDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; 

     GenerateCommands(); 
     CreateRelations(); 

     // Bind the master data connector to the Customers table. 
     masterBindingSource.DataSource = data; 
     masterBindingSource.DataMember = "Customers"; 
     masterBindingSource.Filter = "[Project Id] =" + _projectID; 

     // Bind the details data connector to the master data connector, 
     // using the DataRelation name to filter the information in the 
     // details table based on the current row in the master table. 
     detailsBindingSource.DataSource = masterBindingSource; 
     detailsBindingSource.DataMember = "CustDist"; 
     conn.Close(); 

    } 
    catch (SqlException) 
    { 
     MessageBox.Show("To run this example, replace the value of the " + 
      "connectionString variable with a connection string that is " + 
      "valid for your system."); 
    } 
} 

將更改保存到數據庫:

if (data.Tables["Discounts"].GetChanges(System.Data.DataRowState.Deleted) != null) 
{ 
    detailsBindingSource.EndEdit(); 
    System.Data.DataTable DeletedChildRecords = 
     data.Tables["Discounts"].GetChanges(System.Data.DataRowState.Deleted); 

    try 
    { 
     if (DeletedChildRecords != null) 
     { 
      SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(detailsDataAdapter); 
      detailsDataAdapter.Update(data.Tables["Discounts"].Select(null, null, DataViewRowState.Deleted)); 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
    finally 
    { 
     if (DeletedChildRecords != null) 
     { 
      DeletedChildRecords.Dispose(); 
     } 
    } 
} 

if (data.Tables["Customers"].GetChanges(System.Data.DataRowState.Added) != null || data.Tables["Customers"].GetChanges(System.Data.DataRowState.Modified) != null || 
    data.Tables["Customers"].GetChanges(System.Data.DataRowState.Deleted) != null) 
{ 
    masterBindingSource.EndEdit(); 
    try 
    { 
     SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(masterDataAdapter); 
     masterDataAdapter.Update(data.Tables["Customers"].Select(null, null, DataViewRowState.Deleted)); 
     masterDataAdapter.Update(data.Tables["Customers"].Select(null, null, DataViewRowState.ModifiedCurrent)); 
     masterDataAdapter.Update(data.Tables["Customers"].Select(null, null, DataViewRowState.Added)); 

    } 
    catch (System.Exception err) 
    { 
     MessageBox.Show(err.ToString());       
    } 
} 

if (data.Tables["Discounts"].GetChanges(System.Data.DataRowState.Added) != null || data.Tables["Discounts"].GetChanges(System.Data.DataRowState.Modified) != null) 
{ 
    detailsBindingSource.EndEdit(); 
    System.Data.DataTable NewChildRecords = 
     data.Tables["Discounts"].GetChanges(System.Data.DataRowState.Added); 

    System.Data.DataTable ModifiedChildRecords = 
     data.Tables["Discounts"].GetChanges(System.Data.DataRowState.Modified); 

    try 
    { 
     if (ModifiedChildRecords != null) 
     { 
      SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(detailsDataAdapter); 
      detailsDataAdapter.Update(data.Tables["Discounts"].Select(null, null, DataViewRowState.ModifiedCurrent)); 
     } 

     if (NewChildRecords != null) 
     { 
      SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(detailsDataAdapter); 
      detailsDataAdapter.Update(data.Tables["Discounts"].Select(null, null, DataViewRowState.Added)); 
     } 

    } 

    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 

    finally 
    { 
     if (NewChildRecords != null) 
     { 
      NewChildRecords.Dispose(); 
     } 
     if (ModifiedChildRecords != null) 
     { 
      ModifiedChildRecords.Dispose(); 
     } 
    } 
} 

綁定的數據源dataGridViews:

dataGridView1.DataSource = masterBindingSource; 
dataGridView2.DataSource = detailsBindingSource; 
GetData(); 
相關問題