2011-08-09 1 views
2

다음과 같은 작업을 수행 한 다음 상위 테이블의 기본 키 값이 아닌 외래 키 값을 가진 행을 추가하면 오류가 발생하지 않습니다. 제가하고 싶은 것은 다음과 같습니다 :외국 관계를 위반하는 데이터 집합 행 찾기?

1) 대외 관계를 설정하십시오. 2) 일부 데이터를 데이터 집합으로 병합하지만 외부 관계를 위반하는 행은 병합하지 않습니다. 3) 오류가있는 행을 쉼표로 구분 된 파일, Excel 파일, DataSet 또는 기타 항목에 씁니다.

DataColumn pkColumn = 
    AllData.Tables["ParentTable"].Columns["PrimaryKeyColumn"]; 
DataColumn fkColumn = 
    AllData.Tables["ChildTable"].Columns["ForeignKeyColumn"]; 

DataRelation testRelations = 
    new DataRelation("RelationName", pkColumn, fkColumn); 
AllData.Relations.Add(testRelations); 

어떻게하면됩니까? 행 단위로 DataSet 행에 삽입해야하는 경우에도 하드 코딩 된 검사를 수행하지 않는 한 괜찮습니다.

종류의 안부 복어

답변

0

당신이 하나의 삽입을 수행하는 경우, 삽입시 나쁜 친척을 확인할 수 있습니다. 잘못된 데이터를 새 테이블로 복사 할 수 있습니다.

이 예제에서는 "PrimaryKeyColumn"열에 "ParentTable"이라는 테이블이 들어있는 "dsBadRowTest"라는 형식화 된 데이터 집합을 정의했습니다. "ForeignKeyColumn"에 "ChildTable"이라는 다른 테이블의 부모 테이블입니다. 관계형 데이터 세트를 정의한 다음 유효하지 않은 자식을 추가하려고 시도합니다. 유효하지 않은 각 하위에 대해 별도의 테이블 변수에 열 정보를 저장합니다.

//Our relational dataset... 
dsBadRowTest dsRelated = new dsBadRowTest(); 

//The error table will be a non-relational version 
dsBadRowTest.ChildTableDataTable dtErrors = new dsBadRowTest.ChildTableDataTable(); 

//Add an extra column the error table for extra info 
dtErrors.Columns.Add("ErrorMessage"); 

//Fill our parent table 
for (Int32 i = 1; i <= 5; i++) { 
    dsRelated.ParentTable.AddParentTableRow(i); 
} 

//attempt to fill our child table, with invalid children 
for (Int32 i = 1; i <= 10; i++) { 
    dsBadRowTest.ChildTableRow drNewChild = dsRelated.ChildTable.NewChildTableRow; 
    drNewChild.ForeignKeyColumn = i; 

    try { 
     dsRelated.ChildTable.AddChildTableRow(drNewChild); 
    } catch (Data.InvalidConstraintException ex) { 
     //Problem adding...Copy the row for the error table  
     dsBadRowTest.ChildTableRow drError = dtErrors.NewChildTableRow; 
     foreach (System.Data.DataColumn dc in drNewChild.Table.Columns) { 
      drError(dc.ColumnName) = drNewChild(dc); 
     } 

     //Our non-typed extra column will contain the error message 
     drError("ErrorMessage") = ex.Message; 

     dtErrors.AddChildTableRow(drError); 
    } 
} 

if (dtErrors.Rows.Count > 0) { 
    //Uh oh, we had some bad inserts 

    //...do something with the list of errors... 
} 

관계를 그대로 유지하고 특정 예외가 있는지 확인할 수 있습니다.

은 (여기에이 샘플에 사용되는 입력 된 데이터 세트 (dsBadRowTest.xsd) 나는이 당신을 도움이되기를 바랍니다

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="dsBadRowTest" targetNamespace="http://tempuri.org/dsBadRowTest.xsd" xmlns:mstns="http://tempuri.org/dsBadRowTest.xsd" xmlns="http://tempuri.org/dsBadRowTest.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop" attributeFormDefault="qualified" elementFormDefault="qualified"> 
    <xs:annotation> 
    <xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource"> 
     <DataSource DefaultConnectionIndex="0" FunctionsComponentName="QueriesTableAdapter" Modifier="AutoLayout, AnsiClass, Class, Public" SchemaSerializationMode="IncludeSchema" xmlns="urn:schemas-microsoft-com:xml-msdatasource"> 
     <Connections /> 
     <Tables /> 
     <Sources /> 
     </DataSource> 
    </xs:appinfo> 
    </xs:annotation> 
    <xs:element name="dsBadRowTest" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_DataSetName="dsBadRowTest" msprop:Generator_UserDSName="dsBadRowTest"> 
    <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element name="ParentTable" msprop:Generator_TableClassName="ParentTableDataTable" msprop:Generator_TableVarName="tableParentTable" msprop:Generator_TablePropName="ParentTable" msprop:Generator_RowDeletingName="ParentTableRowDeleting" msprop:Generator_UserTableName="ParentTable" msprop:Generator_RowChangingName="ParentTableRowChanging" msprop:Generator_RowEvHandlerName="ParentTableRowChangeEventHandler" msprop:Generator_RowDeletedName="ParentTableRowDeleted" msprop:Generator_RowEvArgName="ParentTableRowChangeEvent" msprop:Generator_RowChangedName="ParentTableRowChanged" msprop:Generator_RowClassName="ParentTableRow"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="PrimaryKeyColumn" msprop:Generator_ColumnVarNameInTable="columnPrimaryKeyColumn" msprop:Generator_ColumnPropNameInRow="PrimaryKeyColumn" msprop:Generator_ColumnPropNameInTable="PrimaryKeyColumnColumn" msprop:Generator_UserColumnName="PrimaryKeyColumn" type="xs:int" /> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="ChildTable" msprop:Generator_TableClassName="ChildTableDataTable" msprop:Generator_TableVarName="tableChildTable" msprop:Generator_TablePropName="ChildTable" msprop:Generator_RowDeletingName="ChildTableRowDeleting" msprop:Generator_UserTableName="ChildTable" msprop:Generator_RowChangingName="ChildTableRowChanging" msprop:Generator_RowEvHandlerName="ChildTableRowChangeEventHandler" msprop:Generator_RowDeletedName="ChildTableRowDeleted" msprop:Generator_RowEvArgName="ChildTableRowChangeEvent" msprop:Generator_RowChangedName="ChildTableRowChanged" msprop:Generator_RowClassName="ChildTableRow"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="ForeignKeyColumn" msprop:Generator_ColumnVarNameInTable="columnForeignKeyColumn" msprop:Generator_ColumnPropNameInRow="ForeignKeyColumn" msprop:Generator_ColumnPropNameInTable="ForeignKeyColumnColumn" msprop:Generator_UserColumnName="ForeignKeyColumn" type="xs:int" minOccurs="0" /> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:choice> 
    </xs:complexType> 
    <xs:unique name="Constraint1" msdata:PrimaryKey="true"> 
     <xs:selector xpath=".//mstns:ParentTable" /> 
     <xs:field xpath="mstns:PrimaryKeyColumn" /> 
    </xs:unique> 
    <xs:keyref name="FK_ParentTable_ChildTable" refer="Constraint1" msprop:rel_Generator_UserChildTable="ChildTable" msprop:rel_Generator_ChildPropName="GetChildTableRows" msprop:rel_Generator_UserParentTable="ParentTable" msprop:rel_Generator_UserRelationName="FK_ParentTable_ChildTable" msprop:rel_Generator_RelationVarName="relationFK_ParentTable_ChildTable" msprop:rel_Generator_ParentPropName="ParentTableRow" msdata:UpdateRule="None" msdata:DeleteRule="None"> 
     <xs:selector xpath=".//mstns:ChildTable" /> 
     <xs:field xpath="mstns:ForeignKeyColumn" /> 
    </xs:keyref> 
    </xs:element> 
</xs:schema> 

입니다.