L
Lewis Edward Moten III
Upon further investigation, it appears that the datatype for all
columns within my untyped dataset are Strings - even though i specify
that they are to be different types such as booleans, int32, and
DateTimes.
columns within my untyped dataset are Strings - even though i specify
that they are to be different types such as booleans, int32, and
DateTimes.
Erick Gonzales said:this is from Shane in microsoft.public.dotnet.distributed apps
--> ... before you call the merge function, you need to rename untyped
datatables...
untypedDS.Tables(0).<same as typed dataset table>
I spent about a week looking into this very issue and
here's what I was able to come up with in all my research.
1. What the Microsoft representative mentioned. i.e.
modification will be required.
2. Return an untyped dataset (or datatable if you
quickly copy all of the dataset methods and change all of
the dataset references in them to datatable types) then
merge the results into the typed dataset.
For number 2, I was using a Data access layer (DAL)
anyway but wanted to use the DAAB template for the helper
class functionality. So when I called the DAL method,
passing it a typed dataset, it would in turn call the
appropriate untyped dataset (or datatable) method to get
the results that I wanted, via a Stored proc, SQL
execute, etc. Here's the trick that I could not find
ANYWHERE! When using the merge method of the typed
dataset " TypedDS.Merge(untypedDS) ", it will NOT
populate the TypedDS as you probably want. Instead it
will ADD a new table to your typed dataset as a
normal 'un'typed table without all of the typed dataset
features. In my case, I wanted an existing data table in
the typed dataset to get populated with the data in the
typed dataset. If execute the data above by calling a
DAAB method as provided by MS, the returned dataset table
name is "Table1". Your typed dataset table the you want
filled is probably the exact table name in the database,
or at any rate it's not going to be "Table1". So, what
you need to do BEFORE you call the merge function, is
rename:
untypedDS.Tables(0).<same as typed dataset table>
for instance, here's a sample DAL function I have:
Public Function DALGetInformation() As CharacterData
Dim TypedDS As New MyTypedDataSet()
Dim MyData As DataTable
MyData = SqlHelper.ExecuteDataTable(ConnectionString,
CommandType.StoredProcedure, "usp StoredProc")
MyData.TableName = TypedDS.Table.TableName
TypedDS.Merge(MyData)
DALGetInformation = TypedDS
End Function
One burning question I have that is any overhead and/or
performance the merge command will incur for a large
dataset size. I like the layer of abstraction it
provides. I am (so far) able to keep the data helper
class, the DAAB in this case, completely decoupled within
the data access layer objects. I will say that I haven't
yet explored using the DAAB for running updates or
deletes, but I could see that the same merge technique
could be useful, except in the other direction.
Hope this helps,
Shane
Kevin Sun said:Hi,
I am attempting to perform research based on the information you provided.
Sincerely,
Kevin
Microsoft Support
This posting is provided "AS IS" with no warranties, and confers no rights.
Get Secure! - www.microsoft.com/security
--------------------
| From: (e-mail address removed) (Lewis Edward Moten III)
| Newsgroups: microsoft.public.dotnet.framework.adonet
| Subject: Merging untyped dataset into a typed dataset (GUID problems)
| Date: 17 Jun 2003 09:48:46 -0700
| Organization: http://groups.google.com/
| Lines: 499
| Message-ID: <[email protected]>
| NNTP-Posting-Host: 68.49.117.228
| Content-Type: text/plain; charset=ISO-8859-1
| Content-Transfer-Encoding: 8bit
| X-Trace: posting.google.com 1055868526 9815 127.0.0.1 (17 Jun 2003 16:48:46 GMT)
| X-Complaints-To: (e-mail address removed)
| NNTP-Posting-Date: 17 Jun 2003 16:48:46 GMT
| Path:
cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!newsfeed00.sul.t-online.de!t-online.de!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!sn-xit-03!sn-xit-01!sn-
xit-09!supernews.com!postnews1.google.com!not-for-mail
| Xref: cpmsftngxa06.phx.gbl microsoft.public.dotnet.framework.adonet:53710
| X-Tomcat-NG: microsoft.public.dotnet.framework.adonet
|
| I receive an untyped dataset with a schema defined within it. Next, I
| try to merge the dataset into a typed dataset. this is where the
| problem comes in.
|
| TypedDataSet.Merge(UntypedDataSet)
|
| I get the following errors:
|
| tDataSet.Merge(DataSet, True, MissingSchemaAction.Error)
| Target table Role missing definition for column Role_Id.
|
| tDataSet.Merge(DataSet)
| Mismatch columns in the PrimaryKey : <target>.RoleId versus
| <source>.Role_Id.
|
| tDataSet.Merge(DataSet, True, MissingSchemaAction.Add)
| Mismatch columns in the PrimaryKey : <target>.RoleId versus
| <source>.Role_Id.
|
| tDataSet.Merge(DataSet, True, MissingSchemaAction.AddWithKey)
| Mismatch columns in the PrimaryKey : <target>.RoleId versus
| <source>.Role_Id.
|
| tDataSet.Merge(DataSet, True, MissingSchemaAction.Ignore)
| System.FormatException: String was not recognized as a valid Boolean.
| at System.Boolean.Parse(String value) at
| System.String.System.IConvertible.ToBoolean(IFormatProvider provider)
| at System.Convert.ToBoolean(Object value) at
| System.Data.Common.BooleanStorage.Set(Int32 record, Object value) at
| System.Data.DataColumn.set_Item(Int32 record, Boolean fConvertNull,
| Object value)Couldn't store <1> in CommunityAccess Column. Expected
| type is Boolean.
|
| The interesting thing is that neither of these datasets have a column
| called "Role_Id". As if the dataset invented the name on its own.
| They are both called "RoleId". The same goes for the database, and
| all schemas involved. RoleId is a GUID column. I changed it to be a
| string column because it was causing errors as a GUID.
|
| Does anyone have any suggestions? I have included the necessary
| source code for anyone to browse over. My guess is that for some
| reason, the two columns do not actually appear as a string datatype in
| each dataset - so somehow, it tries to add a new column to match?
| then the question would be - how do I define the datatype, and in
| which file would i do it with?
|
| The interesting part is, I can use my data adapter to fill either an
| untyped, or typed dataset without any problems - so that tells me that
| the xml diffgram schema is ok and should be compatable between the two
| untyped and typed dataset schemas.
|
| So ... the ultimate question is: How do you use a column with a GUID
| data type when merging an untyped dataset with a typed dataset?
|
| ----------------------------------------------------------
| Role.aspx.vb
| ----------------------------------------------------------
| Imports Microsoft.Data.SqlXml
| Imports System.Text.ASCIIEncoding
|
| Public Class Role1
| Inherits System.Web.UI.Page
|
| #Region " Web Form Designer Generated Code "
|
| 'This call is required by the Web Form Designer.| <System.Diagnostics.DebuggerStepThrough()> Private Sub
| InitializeComponent()
|
| End Sub
|
| Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
| System.EventArgs) Handles MyBase.Init
| 'CODEGEN: This method call is required by the Web Form Designer
| 'Do not modify it using the code editor.
| InitializeComponent()
| End Sub
|
| #End Region
|
| Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
| System.EventArgs) Handles MyBase.Load
|
| Dim ConnectionString As String = ""
| ConnectionString &= "Provider=SQLOLEDB;"
| ConnectionString &= "Server=(local);"
| ConnectionString &= "database=MyDatabase;"
| ConnectionString &= "user id=MyUserID;"
| ConnectionString &= "password=MyPassword"
|
| Dim Command As New SqlXmlCommand(ConnectionString)
| Dim Adapter As New SqlXmlAdapter(Command)
| Dim DataSet As New Data.DataSet()
| Dim tDataSet As New Role()
| Command.SchemaPath = Server.MapPath("Role.xml")
| Command.RootTag = "ROOT"
| Command.CommandText =
| "/Role[RoleId='00000000-0000-0000-0000-000000000000']"
| Command.CommandType = SqlXmlCommandType.XPath
| Try
| Adapter.Fill(DataSet)
| Catch ex As SqlXmlException
|
| Dim Memory As IO.MemoryStream
| Memory = ex.ErrorStream
| Dim ErrorXML As String = ASCII.GetString(Memory.ToArray)
|
| If ErrorXML = "" Then
| Response.Write(ex.Message)
| Else
| Response.Write(ErrorXML)
| End If
| Response.End()
| End Try
|
| tDataSet.Merge(DataSet, True, MissingSchemaAction.Error)
|
| Response.Write("<?xml version=""1.0"" encoding=""utf-8"" ?>")
| Response.Write(tDataSet.GetXml)
| Response.End()
|
| End Sub
|
| End Class
| ----------------------------------------------------------
| Role.xml (diffgram schema for SQL Server)
| ----------------------------------------------------------
| <?xml version="1.0" encoding="utf-8" ?>
| <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
| xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
| <xs:element name="Role" sql:relation="TAB_Role">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="RoleId" type="xs:string" />
| <xs:element name="Name" type="xs:string" />
| <xs:element name="Details" type="xs:string" />
| <xs:element name="Status" type="xs:string" />
| <xs:element name="CreatedId" type="xs:string" />
| <xs:element name="ModifiedId" type="xs:string" />
| <xs:element name="OwnerId" type="xs:string" />
| <xs:element name="History" sql:relation="TAB_RoleHistory"
| sql:relationship="Role_History_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="Parent" type="xs:string" />
| <xs:element name="UserId" type="xs:string" minOccurs="0" />
| <xs:element name="DateTime" type="xs:dateTime" />
| <xs:element name="Description" type="xs:string" />
| <xs:element name="OrgName" type="xs:string" />
| <xs:element name="UserRank" type="xs:string" />
| <xs:element name="UserFirstName" type="xs:string" />
| <xs:element name="UserMiddleName" type="xs:string" />
| <xs:element name="UserLastName" type="xs:string" />
| <xs:element name="UserSponsor" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="Creator" sql:relation="TAB_RoleHistory"
| sql:relationship="Role_Creator_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="Parent" type="xs:string" />
| <xs:element name="UserId" type="xs:string" minOccurs="0" />
| <xs:element name="DateTime" type="xs:dateTime" />
| <xs:element name="Description" type="xs:string" />
| <xs:element name="OrgName" type="xs:string" />
| <xs:element name="UserRank" type="xs:string" />
| <xs:element name="UserFirstName" type="xs:string" />
| <xs:element name="UserMiddleName" type="xs:string" />
| <xs:element name="UserLastName" type="xs:string" />
| <xs:element name="UserSponsor" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="Modifier" sql:relation="TAB_RoleHistory"
| sql:relationship="Role_Modifier_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="Parent" type="xs:string" />
| <xs:element name="UserId" type="xs:string" minOccurs="0" />
| <xs:element name="DateTime" type="xs:dateTime" />
| <xs:element name="Description" type="xs:string" />
| <xs:element name="OrgName" type="xs:string" />
| <xs:element name="UserRank" type="xs:string" />
| <xs:element name="UserFirstName" type="xs:string" />
| <xs:element name="UserMiddleName" type="xs:string" />
| <xs:element name="UserLastName" type="xs:string" />
| <xs:element name="UserSponsor" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="Owner" sql:relation="TAB_Users"
| sql:relationship="Role_Owner_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="FirstName" type="xs:string" />
| <xs:element name="MiddleName" type="xs:string" />
| <xs:element name="LastName" type="xs:string" />
| <xs:element name="Rank" type="xs:string" />
| <xs:element name="Status" type="xs:string" />
| <xs:element name="Email1" type="xs:string" />
| <xs:element name="Email2" type="xs:string" />
| <xs:element name="Phone" type="xs:string" />
| <xs:element name="Sponsor" type="xs:string" />
| <xs:element name="CommunityAccess" type="xs:boolean" />
| <xs:element name="FiltersOn" type="xs:boolean" />
| <xs:element name="OwnerId" type="xs:string" />
| <xs:element name="CreatedId" type="xs:string" minOccurs="0" />
| <xs:element name="ModifiedId" type="xs:string" minOccurs="0"
| />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="AssignedPrivileges"
| sql:relation="TAB_AssignedPrivilege"
| sql:relationship="Role_AssignedPrivledges_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="RoleId" type="xs:string" />
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="AssignedApplications"
| sql:relation="TAB_Application"
| sql:relationship="AssignedPrivledges_AssignedApplications_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="AssignedPermissions"
| sql:relation="TAB_Permission"
| sql:relationship="AssignedPrivledges_AssignedPermissions_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="Position" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="AllowablePrivileges"
| sql:relation="TAB_AllowablePrivilege"> <!--
| sql:relationship="Role_AllowablePrivileges_Relationship">-->
| <xs:complexType>
| <xs:sequence>
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="AllowableApplications"
| sql:relation="TAB_Application"
| sql:relationship="AllowablePrivileges_AllowableApplications_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="AllowablePermissions"
| sql:relation="TAB_Permission"
| sql:relationship="AllowablePrivileges_AllowablePermissions_Relationship">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="Position" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:annotation>
| <xs:appinfo>
| <sql:relationship name="Role_History_Relationship"
| parent="TAB_Role" parent-key="RoleId" child="TAB_RoleHistory"
| child-key="Parent" />
| <sql:relationship name="Role_Creator_Relationship"
| parent="TAB_Role" parent-key="CreatedId" child="TAB_RoleHistory"
| child-key="Id" />
| <sql:relationship name="Role_Modifier_Relationship"
| parent="TAB_Role" parent-key="ModifiedId" child="TAB_RoleHistory"
| child-key="Id" />
| <sql:relationship name="Role_AssignedPrivledges_Relationship"
| parent="TAB_Role" parent-key="RoleId" child="TAB_AssignedPrivilege"
| child-key="RoleId" />
| <sql:relationship
| name="AssignedPrivledges_AssignedApplications_Relationship"
| parent="TAB_AssignedPrivilege" parent-key="ApplicationId"
| child="TAB_Application" child-key="ApplicationId" />
| <sql:relationship
| name="AssignedPrivledges_AssignedPermissions_Relationship"
| parent="TAB_AssignedPrivilege" parent-key="PermissionId"
| child="TAB_Permission" child-key="PermissionId" />
| <sql:relationship name="Role_Owner_Relationship" parent="TAB_Role"
| parent-key="OwnerId" child="TAB_Users"
| child-key="Id"></sql:relationship>
| <sql:relationship
| name="AllowablePrivileges_AllowableApplications_Relationship"
| parent="TAB_AllowablePrivilege" parent-key="ApplicationId"
| child="TAB_Application" child-key="ApplicationId" />
| <sql:relationship
| name="AllowablePrivileges_AllowablePermissions_Relationship"
| parent="TAB_AllowablePrivilege" parent-key="PermissionId"
| child="TAB_Permission" child-key="PermissionId" />
| </xs:appinfo>
| </xs:annotation>
| </xs:schema>
| ----------------------------------------------------------
| Role.xsd
| ----------------------------------------------------------
| <?xml version="1.0" encoding="utf-8" ?>
| <xs:schema id="Role" elementFormDefault="qualified"
| attributeFormDefault="qualified" xmlns="http://tempuri.org/Role.xsd"
| xmlns:mstns="http://tempuri.org/Role.xsd"
| xmlns:xs="http://www.w3.org/2001/XMLSchema"
| xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
| <xs:element name="Role" msdata:IsDataSet="true">
| <xs:complexType>
| <xs:choice maxOccurs="unbounded">
| <xs:element name="AllowablePrivileges">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="AllowableApplications">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="AllowablePermissions">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="Position" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="Role">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="RoleId" type="xs:string" />
| <xs:element name="Name" type="xs:string" />
| <xs:element name="Details" type="xs:string" />
| <xs:element name="Status" type="xs:string" />
| <xs:element name="CreatedId" type="xs:string" />
| <xs:element name="ModifiedId" type="xs:string" />
| <xs:element name="OwnerId" type="xs:string" />
| <xs:element name="History">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="Parent" type="xs:string" />
| <xs:element name="UserId" type="xs:string" minOccurs="0" />
| <xs:element name="DateTime" type="xs:dateTime" />
| <xs:element name="Description" type="xs:string" />
| <xs:element name="OrgName" type="xs:string" />
| <xs:element name="UserRank" type="xs:string" />
| <xs:element name="UserFirstName" type="xs:string" />
| <xs:element name="UserMiddleName" type="xs:string" />
| <xs:element name="UserLastName" type="xs:string" />
| <xs:element name="UserSponsor" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="Creator">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="Parent" type="xs:string" />
| <xs:element name="UserId" type="xs:string" minOccurs="0" />
| <xs:element name="DateTime" type="xs:dateTime" />
| <xs:element name="Description" type="xs:string" />
| <xs:element name="OrgName" type="xs:string" />
| <xs:element name="UserRank" type="xs:string" />
| <xs:element name="UserFirstName" type="xs:string" />
| <xs:element name="UserMiddleName" type="xs:string" />
| <xs:element name="UserLastName" type="xs:string" />
| <xs:element name="UserSponsor" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="Modifier">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="Parent" type="xs:string" />
| <xs:element name="UserId" type="xs:string" minOccurs="0" />
| <xs:element name="DateTime" type="xs:dateTime" />
| <xs:element name="Description" type="xs:string" />
| <xs:element name="OrgName" type="xs:string" />
| <xs:element name="UserRank" type="xs:string" />
| <xs:element name="UserFirstName" type="xs:string" />
| <xs:element name="UserMiddleName" type="xs:string" />
| <xs:element name="UserLastName" type="xs:string" />
| <xs:element name="UserSponsor" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="AssignedPrivileges">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="RoleId" type="xs:string" />
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="AssignedApplications">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="ApplicationId" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="AssignedPermissions">
| <xs:complexType>
| <xs:sequence>
| <xs:element name="PermissionId" type="xs:int" />
| <xs:element name="Position" type="xs:int" />
| <xs:element name="Name" type="xs:string" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| <xs:element name="Owner">| <xs:complexType>
| <xs:sequence>
| <xs:element name="Id" type="xs:string" />
| <xs:element name="FirstName" type="xs:string" />
| <xs:element name="MiddleName" type="xs:string" />
| <xs:element name="LastName" type="xs:string" />
| <xs:element name="Rank" type="xs:string" />
| <xs:element name="Status" type="xs:string" />
| <xs:element name="Email1" type="xs:string" />
| <xs:element name="Email2" type="xs:string" />
| <xs:element name="Phone" type="xs:string" />
| <xs:element name="Sponsor" type="xs:string" />
| <xs:element name="CommunityAccess" type="xs:boolean" />
| <xs:element name="FiltersOn" type="xs:boolean" />
| <xs:element name="OwnerId" type="xs:string" />
| <xs:element name="CreatedId" type="xs:string" minOccurs="0"
| />
| <xs:element name="ModifiedId" type="xs:string"
| minOccurs="0" />
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| </xs:sequence>
| </xs:complexType>
| </xs:element>
| </xs:choice>
| </xs:complexType>
| <xs:unique name="RoleKey1" msdatarimaryKey="true">
| <xs:selector xpath=".//Role" />
| <xs:field xpath="mstns:RoleId" />
| </xs:unique>
| <xs:unique name="RoleKey2" msdatarimaryKey="true">
| <xs:selector xpath=".//History" />
| <xs:field xpath="mstns:Id" />
| </xs:unique>
| <xs:unique name="RoleKey3" msdatarimaryKey="true">
| <xs:selector xpath=".//Creator" />
| <xs:field xpath="mstns:Id" />
| </xs:unique>
| <xs:unique name="RoleKey4" msdatarimaryKey="true">
| <xs:selector xpath=".//Modifier" />
| <xs:field xpath="mstns:Id" />
| </xs:unique>
| <xs:unique name="RoleKey5" msdatarimaryKey="true">
| <xs:selector xpath=".//AssignedPrivileges" />
| <xs:field xpath="mstns:RoleId" />
| <xs:field xpath="mstns:ApplicationId" />
| <xs:field xpath="mstnsermissionId" />
| </xs:unique>
| <xs:unique name="RoleKey6" msdatarimaryKey="true">
| <xs:selector xpath=".//mstns:TAB_Users" />
| <xs:field xpath="mstns:Id" />
| </xs:unique>
| </xs:element>
| </xs:schema>
|