Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / System / data / design / TableAdapterManagerMethodGenerator.cs / 6 / TableAdapterManagerMethodGenerator.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All Rights Reserved.
// Information Contained Herein is Proprietary and Confidential.
//
//-----------------------------------------------------------------------------
namespace System.Data.Design {
using System;
using System.CodeDom;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Design;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using TAMNameHandler = TableAdapterManagerNameHandler;
internal sealed class TableAdapterManagerMethodGenerator {
private TypedDataSourceCodeGenerator codeGenerator;
private DesignDataSource dataSource;
private CodeTypeDeclaration dataSourceType;
private TableAdapterManagerNameHandler nameHandler;
// This is the editor attribute for the TableAdapter property in the TableAdapterManager
private const string adapterPropertyEditor = "Microsoft.VSDesigner.DataSource.Design.TableAdapterManagerPropertyEditor";
internal TableAdapterManagerMethodGenerator(TypedDataSourceCodeGenerator codeGenerator, DesignDataSource dataSource, CodeTypeDeclaration dataSourceType) {
Debug.Assert(codeGenerator != null);
Debug.Assert(dataSource != null);
Debug.Assert(dataSourceType != null);
this.codeGenerator = codeGenerator;
this.dataSource = dataSource;
this.dataSourceType = dataSourceType;
this.nameHandler = new TableAdapterManagerNameHandler(codeGenerator.CodeProvider);
}
internal void AddEverything(CodeTypeDeclaration dataComponentClass) {
if (dataComponentClass == null) {
throw new InternalException("dataComponent CodeTypeDeclaration should not be null.");
}
AddUpdateOrderMembers(dataComponentClass);
AddAdapterMembers(dataComponentClass);
// AddBackupDataSetMembers(dataComponentClass);
this.AddVariableAndProperty(dataComponentClass,
MemberAttributes.Public | MemberAttributes.Final,
CodeGenHelper.GlobalType(typeof(bool)),
TAMNameHandler.BackupDataSetBeforeUpdateProperty,
TAMNameHandler.BackupDataSetBeforeUpdateVar,
false);
AddConnectionMembers(dataComponentClass);
AddTableAdapterCountMembers(dataComponentClass);
AddUpdateAll(dataComponentClass);
AddSortSelfRefRows(dataComponentClass);
AddSelfRefComparer(dataComponentClass);
AddMatchTableAdapterConnection(dataComponentClass);
}
///
///Public Enum UpdateOrderOption
/// InsertUpdateDelete = 1
/// UpdateInsertDelete = 2
///End Enum
///
///
private void AddUpdateOrderMembers(CodeTypeDeclaration dataComponentClass) {
CodeTypeDeclaration updateOrderEnum = CodeGenHelper.Class(
TAMNameHandler.UpdateOrderOptionEnum, false, TypeAttributes.NestedPublic
);
updateOrderEnum.IsEnum = true;
updateOrderEnum.Comments.Add(CodeGenHelper.Comment("Update Order Option", true));
CodeMemberField insertUpdateDeleteEnum = CodeGenHelper.FieldDecl(CodeGenHelper.Type(typeof(int)), TAMNameHandler.UpdateOrderOptionEnumIUD, CodeGenHelper.Primitive(0));
updateOrderEnum.Members.Add(insertUpdateDeleteEnum);
CodeMemberField updateInsertDeleteEnum = CodeGenHelper.FieldDecl(CodeGenHelper.Type(typeof(int)), TAMNameHandler.UpdateOrderOptionEnumUID, CodeGenHelper.Primitive(1));
updateOrderEnum.Members.Add(updateInsertDeleteEnum);
dataComponentClass.Members.Add(updateOrderEnum);
// undone throw excpetion for invalid argument
this.AddVariableAndProperty(dataComponentClass, MemberAttributes.Public | MemberAttributes.Final,
CodeGenHelper.Type(TAMNameHandler.UpdateOrderOptionEnum),
TAMNameHandler.UpdateOrderOptionProperty,
TAMNameHandler.UpdateOrderOptionVar,
false);
}
///
/// Add TableAdapter properties
/// Example:
/// private CustomersTableAdapter _customersAdapter;
/// [System.Diagnostics.DebuggerNonUserCodeAttribute()]
/// public CustomersTableAdapter CustomersAdapter {
/// get {
/// return _customersAdapter;
/// }
/// set {
/// _customersAdapter = value;
/// }
/// }
///
///
private void AddAdapterMembers(CodeTypeDeclaration dataComponentClass) {
foreach (DesignTable table in dataSource.DesignTables) {
if (!this.CanAddTableAdapter(table)) {
continue;
}
// Variable
table.PropertyCache.TAMAdapterPropName = nameHandler.GetTableAdapterPropName(table.GeneratorDataComponentClassName);
table.PropertyCache.TAMAdapterVarName = nameHandler.GetTableAdapterVarName(table.PropertyCache.TAMAdapterPropName);
string adapterVariableName = table.PropertyCache.TAMAdapterVarName;
CodeMemberField adapterVariable = CodeGenHelper.FieldDecl(CodeGenHelper.Type(table.GeneratorDataComponentClassName), adapterVariableName);
dataComponentClass.Members.Add(adapterVariable);
// Property
CodeMemberProperty adapterProperty = CodeGenHelper.PropertyDecl(CodeGenHelper.Type(table.GeneratorDataComponentClassName), table.PropertyCache.TAMAdapterPropName, MemberAttributes.Public | MemberAttributes.Final);
//EditorAttribute
adapterProperty.CustomAttributes.Add(
CodeGenHelper.AttributeDecl(
"System.ComponentModel.EditorAttribute",
CodeGenHelper.Str(adapterPropertyEditor + ", " + AssemblyRef.MicrosoftVSDesigner),
CodeGenHelper.Str("System.Drawing.Design.UITypeEditor")
)
);
adapterProperty.GetStatements.Add(
CodeGenHelper.Return(
CodeGenHelper.ThisField(adapterVariableName)
)
);
// If TAM has only one adapter and it is one we are going to set,
// there is no connection conflict issue.
//
//\\ if (this.TableAdapterInstanceCount == 1 && this._customerTA != null){
//\\ Set ...
//\\ return
//\\ }
adapterProperty.SetStatements.Add(
CodeGenHelper.If(
CodeGenHelper.And(
CodeGenHelper.IdIsNotNull(CodeGenHelper.ThisField(adapterVariableName)),
CodeGenHelper.EQ(
CodeGenHelper.ThisProperty(TAMNameHandler.TableAdapterInstanceCountProperty),
CodeGenHelper.Primitive(1)
)
),
new CodeStatement[]{
CodeGenHelper.Assign(CodeGenHelper.ThisField(adapterVariableName),
CodeGenHelper.Argument("value")
),
CodeGenHelper.Return()
}
)
);
//\\ If value != null && !MatchConnection(value.Connection)
//\\ throw argument exception
//"The connection of " + table.GeneratorDataComponentClassName + " does not match that of the TableAdapterManager";
//string errorMsg = SR.GetString(SR.DD_E_TableAdapterConnectionInvalid, table.GeneratorDataComponentClassName);
// Note, we decided not to add a new resource string here but just throw an argument exception
adapterProperty.SetStatements.Add(
CodeGenHelper.If(
CodeGenHelper.And(
CodeGenHelper.IdIsNotNull(CodeGenHelper.Variable("value")),
CodeGenHelper.EQ(
CodeGenHelper.MethodCall(CodeGenHelper.This(), TAMNameHandler.MatchTAConnectionMethod, CodeGenHelper.Property(CodeGenHelper.Variable("value"), "Connection")),
CodeGenHelper.Primitive(false)
)
),
new CodeStatement[]{
new CodeThrowExceptionStatement(CodeGenHelper.New(CodeGenHelper.GlobalType(typeof(ArgumentException)), new CodeExpression[] {CodeGenHelper.Str(SR.GetString(SR.CG_TableAdapterManagerNeedsSameConnString))}))
}
)
);
/// this.TA = value
adapterProperty.SetStatements.Add(
CodeGenHelper.Assign(CodeGenHelper.ThisField(adapterVariableName),
CodeGenHelper.Argument("value")
)
);
dataComponentClass.Members.Add(adapterProperty);
}
}
///
/// Connection member Example:
/// Private _connection As IDbConnection
/// Friend Property Connection() As IDbConnection
/// Get
/// If (_connection IsNot Nothing) Then
/// Return _connection
/// End If
/// If (Me._customersTableAdapter IsNot Nothing AndAlso Me._customersTableAdapter.Connection IsNot Nothing) Then
/// Return Me._customersTableAdapter.Connection
/// End If
/// If (Me._ordersTableAdapter IsNot Nothing AndAlso Me._ordersTableAdapter.Connection IsNot Nothing) Then
/// Return Me._ordersTableAdapter.Connection
/// End If
/// Return Nothing
/// End Get
/// Set(ByVal value As IDbConnection)
/// _connection = value
/// End Set
/// End Property
///
private void AddConnectionMembers(CodeTypeDeclaration dataComponentClass) {
string connectionVariableName = TAMNameHandler.ConnectionVar;
CodeMemberField connectionVariable = CodeGenHelper.FieldDecl(CodeGenHelper.GlobalType(typeof(IDbConnection)), connectionVariableName);
dataComponentClass.Members.Add(connectionVariable);
// Property
CodeMemberProperty property = CodeGenHelper.PropertyDecl(CodeGenHelper.GlobalType(typeof(IDbConnection)), TAMNameHandler.ConnectionProperty, MemberAttributes.Public | MemberAttributes.Final);
property.CustomAttributes.Add(
CodeGenHelper.AttributeDecl("System.ComponentModel.Browsable", CodeGenHelper.Primitive(false))
);
//\\ If (_connection IsNot Nothing) Then
//\\ Return _connection
//\\ End If
property.GetStatements.Add(
CodeGenHelper.If(CodeGenHelper.IdIsNotNull(CodeGenHelper.ThisField(connectionVariableName)),
CodeGenHelper.Return(CodeGenHelper.ThisField(connectionVariableName))
)
);
foreach (DesignTable table in dataSource.DesignTables) {
if (!this.CanAddTableAdapter(table)) {
continue;
}
//\\ If (Me._customersTableAdapter IsNot Nothing AndAlso Me._customersTableAdapter.Connection IsNot Nothing) Then
//\\ Return Me._customersTableAdapter.Connection
//\\ End If
string adapterVariableName = table.PropertyCache.TAMAdapterVarName;
property.GetStatements.Add(
CodeGenHelper.If(
CodeGenHelper.And(
CodeGenHelper.IdIsNotNull(CodeGenHelper.ThisField(adapterVariableName)),
CodeGenHelper.IdIsNotNull(CodeGenHelper.Property(CodeGenHelper.ThisField(adapterVariableName), "Connection"))
),
CodeGenHelper.Return(
CodeGenHelper.Property(CodeGenHelper.ThisField(adapterVariableName), "Connection")
)
)
);
}
//\\ Return null
property.GetStatements.Add(
CodeGenHelper.Return(CodeGenHelper.Primitive(null))
);
//\\ Set(ByVal value As IDbConnection)
//\\ _connection = value
//\\ End Set
property.SetStatements.Add(
CodeGenHelper.Assign(CodeGenHelper.ThisField(connectionVariableName),
CodeGenHelper.Argument("value")
)
);
dataComponentClass.Members.Add(property);
}
///
/// Create a TableAdapterInstanceCount property
/// Example:
/// Public Property TableAdapterInstanceCount() As integer
/// Get
/// count = 0;
/// If (Me._customersTableAdapter IsNot Nothing ) Then
/// count += 1
/// End If
/// If (Me._ordersTableAdapter IsNot Nothing) Then
/// count += 1
/// End If
/// Return count
/// End Get
/// End Property
///
private void AddTableAdapterCountMembers(CodeTypeDeclaration dataComponentClass) {
string countVariableName = "count";
CodeExpression countVariable = CodeGenHelper.Variable(countVariableName);
CodeMemberProperty property = CodeGenHelper.PropertyDecl(CodeGenHelper.GlobalType(typeof(int)), TAMNameHandler.TableAdapterInstanceCountProperty, MemberAttributes.Public | MemberAttributes.Final);
property.CustomAttributes.Add(
CodeGenHelper.AttributeDecl("System.ComponentModel.Browsable", CodeGenHelper.Primitive(false))
);
//\\ count = 0;
property.GetStatements.Add(
CodeGenHelper.VariableDecl(CodeGenHelper.GlobalType(typeof(int)), countVariableName, CodeGenHelper.Primitive(0))
);
foreach (DesignTable table in dataSource.DesignTables) {
if (!this.CanAddTableAdapter(table)) {
continue;
}
//\\If (Me._customersTableAdapter IsNot Nothing ) Then
//\\ count += 1
//\\End If
string adapterVariableName = table.PropertyCache.TAMAdapterVarName;
property.GetStatements.Add(
CodeGenHelper.If(
CodeGenHelper.IdIsNotNull(CodeGenHelper.ThisField(adapterVariableName))
,
CodeGenHelper.Assign(countVariable, CodeGenHelper.BinOperator(countVariable, CodeBinaryOperatorType.Add, CodeGenHelper.Primitive(1)))
)
);
}
//\\ Return count
property.GetStatements.Add(
CodeGenHelper.Return(countVariable)
);
dataComponentClass.Members.Add(property);
}
///
/// Add SortSelfRefRows methods. Code Example:
/// protected virtual void SortSelfReferencedRows(System.Data.DataRow[] rows, DataRelation relation, bool childFirst) {
/// System.Array.Sort(rows, new SelfReferenceComparer(relation, childFirst));
/// }
///
///
private void AddSortSelfRefRows(CodeTypeDeclaration dataComponentClass) {
string rowsStr = "rows";
string relationStr = "relation";
string childFirstStr = "childFirst";
CodeMemberMethod method =
CodeGenHelper.MethodDecl(CodeGenHelper.GlobalType(typeof(void)),
TAMNameHandler.SortSelfRefRowsMethod,
MemberAttributes.Family
);
method.Parameters.AddRange(
new CodeParameterDeclarationExpression[]{
CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(DataRow), 1), rowsStr),
CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(DataRelation)), relationStr),
CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(bool)), childFirstStr)
}
);
CodeMethodReferenceExpression sortMethodRef = new CodeMethodReferenceExpression(CodeGenHelper.GlobalTypeExpr("System.Array"), "Sort", CodeGenHelper.GlobalType(typeof(DataRow)));
CodeMethodInvokeExpression sortMethodExpr =
new CodeMethodInvokeExpression(
sortMethodRef,
new CodeExpression[]{
CodeGenHelper.Argument(rowsStr),
CodeGenHelper.New(
CodeGenHelper.Type(TAMNameHandler.SelfRefComparerClass),
new CodeExpression[]{
CodeGenHelper.Argument(relationStr),
CodeGenHelper.Argument(childFirstStr)
}
)
}
);
//\\ System.Array.Sort(rows, new SelfReferenceComparer(relation, childFirst));
method.Statements.Add(CodeGenHelper.Stm(sortMethodExpr));
dataComponentClass.Members.Add(method);
}
///
/// Add SelfReferenceComparer class. Code Example:
/// private class SelfReferenceComparer : System.Collections.Generic.IComparer {
/// private readonly DataRelation m_relation;
/// private readonly int m_childFirst;
/// internal SelfReferenceComparer(DataRelation relation, bool childFirst) {
/// this.m_relation = relation;
/// this.m_childFirst = childFirst ? -1 : 1;
/// }
/// // return (0 if row1 == row2), (-1 if row1 < row2) or (1 if row1 > row2)
/// int System.Collections.Generic.IComparer.Compare(DataRow row1, DataRow row2) {
/// if (object.ReferenceEquals(row1, row2)) {
/// return 0; // either row1 && row2 are same instance or null
/// }
/// if (null == row1) {
/// return -1; // null row1 is < non-null row2
/// }
/// if (null == row2) {
/// return 1; // non-null row1 > null row2
/// }
/// // Is row1 the child or grandchild of row2
/// if (this.IsChildAndParent(row1, row2)) {
/// return this._childFirst;
/// }
/// // Is row2 the child or grandchild of row1
/// if (this.IsChildAndParent(row2, row1)) {
/// return (-1 * this._childFirst);
/// }
/// return 0;
/// }
///
///
private void AddSelfRefComparer(CodeTypeDeclaration dataComponentClass) {
string relationVarStr = "_relation";
string childFirstVarStr = "_childFirst";
//\\private class SelfReferenceComparer : System.Collections.Generic.IComparer {
CodeTypeDeclaration codeType = CodeGenHelper.Class(
TAMNameHandler.SelfRefComparerClass, false, TypeAttributes.NestedPrivate
);
CodeTypeReference icomparerInterface = CodeGenHelper.GlobalGenericType(
"System.Collections.Generic.IComparer", typeof(DataRow)
);
// To generate a class in Visual Basic that does not inherit from a base type,
// but that does implement one or more interfaces, you must include Object as the first item in
// the BaseTypes collection. from
codeType.BaseTypes.Add(CodeGenHelper.GlobalType(typeof(object)));
codeType.BaseTypes.Add(icomparerInterface);
codeType.Comments.Add(CodeGenHelper.Comment("Used to sort self-referenced table's rows", true));
dataComponentClass.Members.Add(codeType);
//\\ private DataRelation m_relation;
//\\ private int m_childFirst;
codeType.Members.Add(CodeGenHelper.FieldDecl(CodeGenHelper.GlobalType(typeof(DataRelation)), relationVarStr));
codeType.Members.Add(CodeGenHelper.FieldDecl(CodeGenHelper.GlobalType(typeof(int)), childFirstVarStr));
//\\ internal SelfReferenceComparer(DataRelation relation, bool childFirst) {
//\\ this.m_relation = relation;
//\\ this.m_childFirst = childFirst ? -1 : 1;
//\\ }
CodeConstructor constructor = CodeGenHelper.Constructor(MemberAttributes.Assembly);
constructor.Parameters.Add(CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(DataRelation)), "relation"));
constructor.Parameters.Add(CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(bool)), "childFirst"));
constructor.Statements.Add(CodeGenHelper.Assign(CodeGenHelper.ThisField(relationVarStr), CodeGenHelper.Argument("relation")));
constructor.Statements.Add(CodeGenHelper.If(
CodeGenHelper.Argument("childFirst"),
CodeGenHelper.Assign(CodeGenHelper.ThisField(childFirstVarStr), CodeGenHelper.Primitive(-1)),
CodeGenHelper.Assign(CodeGenHelper.ThisField(childFirstVarStr), CodeGenHelper.Primitive(1))
));
codeType.Members.Add(constructor);
// ---- isChildAndParentMethod -------------
//\\private bool IsChildAndParent(global::System.Data.DataRow child, global::System.Data.DataRow parent){
//\\ System.Data.DataRow newParent = child.GetParentRow(this._relation);
//\\ while (newParent != null && newParent != child && newParent != parent){
//\\ newParent = newParent.GetParentRow(this._relation);
//\\ }
//\\ if (newParent == null){
//\\ newParent = child.GetParentRow(this._relation, System.Data.DataRowVersion.Original );
//\\ while (newParent != null && newParent != child && newParent != parent){
//\\ newParent = newParent.GetParentRow(this._relation, System.Data.DataRowVersion.Original );
//\\ }
//\\ }
//\\ if (object.ReferenceEquals(newParent, parent)){
//\\ return true;
//\\ }
//\\ return false;
//\\}
string childStr = "child";
string parentStr = "parent";
string newParentStr = "newParent";
string isChildAndParentStr = "IsChildAndParent";
CodeMemberMethod isChildAndParentMethod = CodeGenHelper.MethodDecl(
CodeGenHelper.GlobalType(typeof(bool)),
isChildAndParentStr,
MemberAttributes.Private
);
isChildAndParentMethod.Parameters.Add(CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(DataRow)), childStr));
isChildAndParentMethod.Parameters.Add(CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(DataRow)), parentStr));
isChildAndParentMethod.Statements.Add(
CodeGenHelper.MethodCallStm(
CodeGenHelper.GlobalTypeExpr(typeof(System.Diagnostics.Debug)),
"Assert",
CodeGenHelper.IdIsNotNull(CodeGenHelper.Argument(childStr))
)
);
isChildAndParentMethod.Statements.Add(
CodeGenHelper.MethodCallStm(
CodeGenHelper.GlobalTypeExpr(typeof(System.Diagnostics.Debug)),
"Assert",
CodeGenHelper.IdIsNotNull(CodeGenHelper.Argument(parentStr))
)
);
//\\System.Data.DataRow newParent = child.GetParentRow(this._relation);
isChildAndParentMethod.Statements.Add(
CodeGenHelper.VariableDecl(
CodeGenHelper.GlobalType(typeof(DataRow)),
newParentStr,
CodeGenHelper.MethodCall(
CodeGenHelper.Argument(childStr),
"GetParentRow",
new CodeExpression[] {
CodeGenHelper.ThisField(relationVarStr),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(DataRowVersion)),"Default")
}
)
)
);
//\\ while (newParent != null && newParent != child && newParent != parent){
//\\ newParent = newParent.GetParentRow(this._relation);
//\\ }
CodeIterationStatement whileStatement = new CodeIterationStatement();
whileStatement.TestExpression = CodeGenHelper.And(
CodeGenHelper.IdIsNotNull(CodeGenHelper.Variable(newParentStr)),
CodeGenHelper.And(
CodeGenHelper.ReferenceNotEquals(CodeGenHelper.Variable(newParentStr), CodeGenHelper.Argument(childStr)),
CodeGenHelper.ReferenceNotEquals(CodeGenHelper.Variable(newParentStr), CodeGenHelper.Argument(parentStr))
)
);
whileStatement.InitStatement = new CodeSnippetStatement();
whileStatement.IncrementStatement = new CodeSnippetStatement();
whileStatement.Statements.Add(
CodeGenHelper.Assign(
CodeGenHelper.Variable(newParentStr),
CodeGenHelper.MethodCall(
CodeGenHelper.Variable(newParentStr),
"GetParentRow",
new CodeExpression[] {
CodeGenHelper.ThisField(relationVarStr),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(DataRowVersion)),"Default")
}
)
)
);
isChildAndParentMethod.Statements.Add(whileStatement);
//\\ if (newParent == null){
//\\ newParent = child.GetParentRow(this._relation, System.Data.DataRowVersion.Original );
//\\ while (newParent != null && newParent != child && newParent != parent){
//\\ newParent = newParent.GetParentRow(this._relation, System.Data.DataRowVersion.Original );
//\\ }
//\\ }
whileStatement = new CodeIterationStatement();
whileStatement.TestExpression = CodeGenHelper.And(
CodeGenHelper.IdIsNotNull(CodeGenHelper.Variable(newParentStr)),
CodeGenHelper.And(
CodeGenHelper.ReferenceNotEquals(CodeGenHelper.Variable(newParentStr), CodeGenHelper.Argument(childStr)),
CodeGenHelper.ReferenceNotEquals(CodeGenHelper.Variable(newParentStr), CodeGenHelper.Argument(parentStr))
)
);
whileStatement.InitStatement = CodeGenHelper.Assign(
CodeGenHelper.Variable(newParentStr),
CodeGenHelper.MethodCall(
CodeGenHelper.Argument(childStr),
"GetParentRow",
new CodeExpression[] {
CodeGenHelper.ThisField(relationVarStr),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(DataRowVersion)),"Original")
}
)
);
whileStatement.IncrementStatement = new CodeSnippetStatement();
whileStatement.Statements.Add(CodeGenHelper.Assign(
CodeGenHelper.Variable(newParentStr),
CodeGenHelper.MethodCall(
CodeGenHelper.Argument(newParentStr),
"GetParentRow",
new CodeExpression[] {
CodeGenHelper.ThisField(relationVarStr),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(DataRowVersion)),"Original")
}
)
));
isChildAndParentMethod.Statements.Add(CodeGenHelper.If(
CodeGenHelper.IdIsNull(CodeGenHelper.Variable(newParentStr)),
whileStatement
));
//\\ if (object.ReferenceEquals(newParent, parent)){
//\\ return true;
//\\ }
//\\ return false;
isChildAndParentMethod.Statements.Add(CodeGenHelper.If(
CodeGenHelper.ReferenceEquals(CodeGenHelper.Variable(newParentStr), CodeGenHelper.Argument(parentStr)),
CodeGenHelper.Return(CodeGenHelper.Primitive(true))
));
isChildAndParentMethod.Statements.Add(CodeGenHelper.Return(CodeGenHelper.Primitive(false)));
codeType.Members.Add(isChildAndParentMethod);
//--------compareMethod-----------------
//\\ // return (0 if row1 == row2), (-1 if row1 < row2) or (1 if row1 > row2)
//\\ int System.Collections.Generic.IComparer.Compare(DataRow row1, DataRow row2) {
string row1Str = "row1";
string row2Str = "row2";
CodeMemberMethod compareMethod = CodeGenHelper.MethodDecl(
CodeGenHelper.GlobalType(typeof(int)),
"Compare",
MemberAttributes.Public | MemberAttributes.Final
);
compareMethod.Parameters.Add(CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(DataRow)), row1Str));
compareMethod.Parameters.Add(CodeGenHelper.ParameterDecl(CodeGenHelper.GlobalType(typeof(DataRow)), row2Str));
compareMethod.ImplementationTypes.Add(icomparerInterface);
codeType.Members.Add(compareMethod);
//\\ if (object.ReferenceEquals(row1, row2)) {
//\\ return 0; // either row1 && row2 are same instance or null
//\\ }
compareMethod.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.ReferenceEquals(CodeGenHelper.Argument(row1Str), CodeGenHelper.Argument(row2Str)),
CodeGenHelper.Return(CodeGenHelper.Primitive(0))
)
);
//\\ if (null == row1) {
//\\ return -1; // null row1 is < non-null row2
//\\ }
//\\ if (null == row2) {
//\\ return 1; // non-null row1 > null row2
//\\ }
compareMethod.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.IdIsNull(CodeGenHelper.Argument(row1Str)),
CodeGenHelper.Return(CodeGenHelper.Primitive(-1))
)
);
compareMethod.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.IdIsNull(CodeGenHelper.Argument(row2Str)),
CodeGenHelper.Return(CodeGenHelper.Primitive(1))
)
);
//\\ // is row1 the child of row2
compareMethod.Statements.Add(
new CodeSnippetStatement() // empty line
);
compareMethod.Statements.Add(
new CodeCommentStatement("Is row1 the child or grandchild of row2")
);
//\\if (this.IsChildAndParent(row1, row2)) {
//\\ return this._childFirst;
//\\}
compareMethod.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.MethodCall(
CodeGenHelper.This(),
isChildAndParentStr,
new CodeExpression[]{
CodeGenHelper.Argument(row1Str),
CodeGenHelper.Argument(row2Str)
}
),
CodeGenHelper.Return(CodeGenHelper.ThisField(childFirstVarStr))
)
);
//\\ // is row2 the child of row1
compareMethod.Statements.Add(
new CodeSnippetStatement() // empty line
);
compareMethod.Statements.Add(
new CodeCommentStatement("Is row2 the child or grandchild of row1")
);
//\\ if (row2.GetParentRow(m_relation) == row1) {
//\\ -return this.m_childFirst;
//\\ }
compareMethod.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.MethodCall(
CodeGenHelper.This(),
isChildAndParentStr,
new CodeExpression[]{
CodeGenHelper.Argument(row2Str),
CodeGenHelper.Argument(row1Str)
}
),
CodeGenHelper.Return(CodeGenHelper.BinOperator(CodeGenHelper.Primitive(-1), CodeBinaryOperatorType.Multiply, CodeGenHelper.ThisField(childFirstVarStr)))
)
);
//\\ return 0;
compareMethod.Statements.Add(
CodeGenHelper.Return(CodeGenHelper.Primitive(0))
);
}
///
/// Add MatchTableAdapterConnection method. Code Example:
/// virtual protected MatchTableAdapterConnection(IDbConnection inputConnection) {
/// if (this._conection != null){
/// return true;
/// }
/// if (this.Connection == null || inputConnection == null)
/// return true
/// }
/// }
///
///
private void AddMatchTableAdapterConnection(CodeTypeDeclaration dataComponentClass) {
string inputConnStr = "inputConnection";
CodeMemberMethod method =
CodeGenHelper.MethodDecl(CodeGenHelper.GlobalType(typeof(bool)),
TAMNameHandler.MatchTAConnectionMethod,
MemberAttributes.Family
);
CodeTypeReference connTypeRef = CodeGenHelper.GlobalType(typeof(IDbConnection));
CodeParameterDeclarationExpression dataSetPara = CodeGenHelper.ParameterDecl(connTypeRef, inputConnStr);
method.Parameters.Add(dataSetPara);
//\\if (this._connection != null)
//\\ return true
method.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.IdIsNotNull(CodeGenHelper.ThisField(TAMNameHandler.ConnectionVar)),
CodeGenHelper.Return(CodeGenHelper.Primitive(true))
)
);
//\\if (this.Connection == null || inputConnection == null)
//\\ return true
method.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.Or(
CodeGenHelper.IdIsNull(CodeGenHelper.ThisProperty(TAMNameHandler.ConnectionProperty)),
CodeGenHelper.IdIsNull(CodeGenHelper.Argument(inputConnStr))
),
CodeGenHelper.Return(CodeGenHelper.Primitive(true))
)
);
//\\ if (string.Equals(a, b, StringComparison.Ordinal)
method.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.MethodCall(
CodeGenHelper.GlobalTypeExpr(typeof(string)),
"Equals",
new CodeExpression[]{
CodeGenHelper.Property(
CodeGenHelper.ThisProperty(TAMNameHandler.ConnectionProperty),
"ConnectionString"
),
CodeGenHelper.Property(CodeGenHelper.Argument(inputConnStr),"ConnectionString"),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(System.StringComparison)), "Ordinal")
}
),
CodeGenHelper.Return(CodeGenHelper.Primitive(true))
)
);
method.Statements.Add(
CodeGenHelper.Return(CodeGenHelper.Primitive(false))
);
dataComponentClass.Members.Add(method);
}
///
/// The UpdateAll method
///
///
private void AddUpdateAll(CodeTypeDeclaration dataComponentClass) {
string dataSetStr = "dataSet";
string backupDataSetStr = "backupDataSet";
string deletedRowsStr = "deletedRows";
string addedRowsStr = "addedRows";
string updatedRowsStr = "updatedRows";
string resultStr = "result";
string workConnStr = "workConnection";
string workTransStr = "workTransaction";
string workConnOpenedStr = "workConnOpened";
string allChangedRowsStr = "allChangedRows";
string allAddedRowsStr = "allAddedRows";
string adaptersWithACDUStr = "adaptersWithAcceptChangesDuringUpdate";
string revertConnectionsVar = "revertConnections";
CodeExpression resultExp = CodeGenHelper.Variable(resultStr);
CodeMemberMethod method =
CodeGenHelper.MethodDecl(CodeGenHelper.GlobalType(typeof(int)),
TAMNameHandler.UpdateAllMethod,
MemberAttributes.Public
);
string dataSourceTypeRefName = this.dataSourceType.Name;
// DDBugs 126914: Use fully-qualified names for datasets
if (this.codeGenerator.DataSetNamespace != null) {
dataSourceTypeRefName = CodeGenHelper.GetTypeName(this.codeGenerator.CodeProvider, this.codeGenerator.DataSetNamespace, dataSourceTypeRefName);
}
CodeTypeReference dataSourceTypeRef = CodeGenHelper.Type(dataSourceTypeRefName);
CodeParameterDeclarationExpression dataSetPara = CodeGenHelper.ParameterDecl(dataSourceTypeRef, dataSetStr);
method.Parameters.Add(dataSetPara);
method.Comments.Add(CodeGenHelper.Comment("Update all changes to the dataset.", true));
//-----------------------------------------------------------------------------
//\\If (dataSet Is Nothing) Then
//\\ Throw New System.ArgumentNullException("dataSet")
//\\End If
method.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.IdIsNull(CodeGenHelper.Argument(dataSetStr)),
CodeGenHelper.Throw(CodeGenHelper.GlobalType(typeof(ArgumentNullException)), dataSetStr)
)
);
//-----------------------------------------------------------------------------
//\\if (dataSet.HasChanges() == fase)
//\\ return 0
method.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.EQ(
CodeGenHelper.MethodCall(CodeGenHelper.Argument(dataSetStr), "HasChanges"),
CodeGenHelper.Primitive(false)
),
CodeGenHelper.Return(CodeGenHelper.Primitive(0))
)
);
//----------------------------------------------------------------------------
//\\Dim workConnection As IDbConnection = Me.Connection
method.Statements.Add(
CodeGenHelper.VariableDecl(
CodeGenHelper.GlobalType(typeof(IDbConnection)), workConnStr, CodeGenHelper.ThisProperty("Connection")
)
);
//\\If workConnection Is Nothing Then
//\\ throw new ApplicationException(No connection)
//\\End If
method.Statements.Add(
CodeGenHelper.If(CodeGenHelper.IdIsNull(CodeGenHelper.Variable(workConnStr)),
CodeGenHelper.Throw(
CodeGenHelper.GlobalType(typeof(ApplicationException)),
SR.GetString(SR.CG_TableAdapterManagerHasNoConnection))
)
);
//\\Dim workConnOpened As Boolean = False
method.Statements.Add(
CodeGenHelper.VariableDecl(
CodeGenHelper.GlobalType(typeof(bool)), workConnOpenedStr, CodeGenHelper.Primitive(false)
)
);
//\\If ((workConnection.State And Global.System.Data.ConnectionState.Closed) _
//\\ = Global.System.Data.ConnectionState.Closed) Then
//\\ workCnnection.Open()
//\\ workConnOpened = True
//\\End If
method.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.EQ(
CodeGenHelper.BitwiseAnd(
CodeGenHelper.Property(CodeGenHelper.Variable(workConnStr), "State"),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(System.Data.ConnectionState)), "Closed")
),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(System.Data.ConnectionState)), "Closed")
),
new CodeStatement[]{
CodeGenHelper.MethodCallStm(CodeGenHelper.Variable(workConnStr),"Open"),
CodeGenHelper.Assign(CodeGenHelper.Variable(workConnOpenedStr), CodeGenHelper.Primitive(true))
}
)
);
//\\Dim workTransaction As IDbTransaction = workConnection.BeginTransaction()
method.Statements.Add(
CodeGenHelper.VariableDecl(
CodeGenHelper.GlobalType(typeof(IDbTransaction)),
workTransStr,
CodeGenHelper.MethodCall(CodeGenHelper.Variable(workConnStr), "BeginTransaction")
)
);
//\\ if (workTransaction == null){Throw}
method.Statements.Add(
CodeGenHelper.If(CodeGenHelper.IdIsNull(CodeGenHelper.Variable(workTransStr)),
CodeGenHelper.Throw(
CodeGenHelper.GlobalType(typeof(ApplicationException)),
SR.GetString(SR.CG_TableAdapterManagerNotSupportTransaction))
)
);
//\\Dim allChangedRows As New System.Collections.Generic.List(Of System.Data.DataRow)()
CodeTypeReference typeRef = CodeGenHelper.GlobalGenericType("System.Collections.Generic.List", typeof(DataRow));
method.Statements.Add(
CodeGenHelper.VariableDecl(typeRef, allChangedRowsStr, CodeGenHelper.New(typeRef, new CodeExpression[] { }))
);
//\\Dim allAddedRows As New System.Collections.Generic.List(Of System.Data.DataRow)()
method.Statements.Add(
CodeGenHelper.VariableDecl(typeRef, allAddedRowsStr, CodeGenHelper.New(typeRef, new CodeExpression[] { }))
);
//\\Dim adaptersWithACDU As New System.Collections.Generic.List(Of System.Data.Common.DataAdapter)()
typeRef = CodeGenHelper.GlobalGenericType("System.Collections.Generic.List", typeof(System.Data.Common.DataAdapter));
method.Statements.Add(
CodeGenHelper.VariableDecl(typeRef, adaptersWithACDUStr, CodeGenHelper.New(typeRef, new CodeExpression[] { }))
);
//-----------------------------------------------------------------------------
//\\System.Collections.Generic.IDictionary
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- WizardSideBarListControlItemEventArgs.cs
- StringComparer.cs
- URLIdentityPermission.cs
- PartialToken.cs
- OdbcUtils.cs
- ScriptHandlerFactory.cs
- BindingGroup.cs
- SafeRightsManagementPubHandle.cs
- EntityDataSourceDataSelectionPanel.cs
- EntityDescriptor.cs
- DecoratedNameAttribute.cs
- TimelineGroup.cs
- AssemblyAssociatedContentFileAttribute.cs
- BamlLocalizer.cs
- PtsPage.cs
- ProfilePropertySettings.cs
- sqlnorm.cs
- CodeTryCatchFinallyStatement.cs
- FusionWrap.cs
- CompilerLocalReference.cs
- safemediahandle.cs
- SspiHelper.cs
- ThreadExceptionEvent.cs
- DataGridCell.cs
- AsymmetricSecurityBindingElement.cs
- TextRangeEdit.cs
- XmlEntityReference.cs
- CreateUserWizard.cs
- HandlerBase.cs
- AssemblyUtil.cs
- Adorner.cs
- RelationshipEndMember.cs
- OpenTypeLayout.cs
- SelectingProviderEventArgs.cs
- AndCondition.cs
- SurrogateChar.cs
- SelectingProviderEventArgs.cs
- DrawingVisual.cs
- SQLDouble.cs
- MouseEventArgs.cs
- Group.cs
- Switch.cs
- FunctionDetailsReader.cs
- Thumb.cs
- FtpWebRequest.cs
- EmptyEnumerable.cs
- BitmapEffectInput.cs
- EmptyControlCollection.cs
- SearchForVirtualItemEventArgs.cs
- XmlSerializableWriter.cs
- AttributeEmitter.cs
- TextPointerBase.cs
- MatcherBuilder.cs
- AutomationPatternInfo.cs
- DocumentGridContextMenu.cs
- DataKey.cs
- CssStyleCollection.cs
- ToolStripScrollButton.cs
- InsufficientExecutionStackException.cs
- ConfigurationStrings.cs
- SplashScreen.cs
- SafeFileMappingHandle.cs
- Thread.cs
- FormViewUpdatedEventArgs.cs
- _AcceptOverlappedAsyncResult.cs
- ValueQuery.cs
- CodeNamespaceImport.cs
- X509ThumbprintKeyIdentifierClause.cs
- UserMapPath.cs
- VirtualPath.cs
- MaskInputRejectedEventArgs.cs
- AssociationSet.cs
- HttpWriter.cs
- DataListAutoFormat.cs
- ImageClickEventArgs.cs
- CodeThrowExceptionStatement.cs
- ListMarkerSourceInfo.cs
- TcpWorkerProcess.cs
- IDispatchConstantAttribute.cs
- QueueProcessor.cs
- SignatureResourceHelper.cs
- UnsafeNativeMethodsMilCoreApi.cs
- UnsafeNativeMethods.cs
- LineSegment.cs
- securitycriticaldataClass.cs
- Int32CollectionValueSerializer.cs
- UserControlCodeDomTreeGenerator.cs
- Image.cs
- LinkConverter.cs
- ConditionalBranch.cs
- FusionWrap.cs
- DispatchWrapper.cs
- HtmlFormParameterReader.cs
- PauseStoryboard.cs
- ExpressionEditorAttribute.cs
- PLINQETWProvider.cs
- HttpSessionStateBase.cs
- XLinq.cs
- OdbcCommand.cs
- HtmlMeta.cs