NullReferenceException at CreateNewScopeForClient() - Multiple schemas
-
2011년 11월 18일 금요일 오후 5:44
Hi, i am trying to make sync work with a Database with two non-dbo schemas, but i am receiving the following error (Fiddler output):
<ServiceError xmlns="http://schemas.datacontract.org/2004/07/Microsoft.Synchronization.Services"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorDescription>
System.NullReferenceException
 Object reference not set to an instance of an object.
 at Microsoft.Synchronization.Services.SqlProvider.SqlSyncProviderService.CreateNewScopeForClient()
 at Microsoft.Synchronization.Services.SqlProvider.SqlSyncProviderService.GetChanges(Byte[] clientKnowledgeBlob)
 at Microsoft.Synchronization.Services.DownloadChangesRequestProcessor.ProcessRequest(Request incomingRequest)
 at Microsoft.Synchronization.Services.SyncService`1.ProcessRequestForMessage(Stream messageBody)
 
 
 </ErrorDescription>
</ServiceError>Here is my configuration file description:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SyncConfiguration"
type="Microsoft.Synchronization.ClientServices.Configuration.SyncConfigurationSection, SyncSvcUtil, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToApplication"
overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="true" /> </configSections> <SyncConfiguration> <SyncScopes> <SyncScope Name="Scope1" SchemaName="schema1" EnableBulkApplyProcedures="true" IsTemplateScope="true"> <SyncTables> <SyncTable Name="schema1.Persons" IncludeAllColumns="true" FilterClause="[side].Id = @Id" SchemaName="schema1"> <SyncColumns> <SyncColumn Name="Id" GlobalName="Id" SqlType="uniqueidentifier" IsPrimaryKey="true" IsNullable="false" /> <SyncColumn Name="Name" GlobalName="Name" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Surname" GlobalName="Surname" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="BirthDate" GlobalName="BirthDate" SqlType="date" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Gender" GlobalName="Gender" SqlType="char" IsPrimaryKey="false" IsNullable="true" /> </SyncColumns> <FilterColumns> <FilterColumn Name="Id" /> </FilterColumns> <FilterParameters> <FilterParameter Name="@Id" SqlType="uniqueidentifier" DataSize="0" /> </FilterParameters> </SyncTable> </SyncTables> </SyncScope> <SyncScope Name="Scope2" SchemaName="schema2" EnableBulkApplyProcedures="true" IsTemplateScope="true"> <SyncTables> <SyncTable Name="schema2.Persons" IncludeAllColumns="true" FilterClause="[side].Id = @Id" SchemaName="schema2"> <SyncColumns> <SyncColumn Name="Id" GlobalName="Id" SqlType="uniqueidentifier" IsPrimaryKey="true" IsNullable="false" /> <SyncColumn Name="Name" GlobalName="Name" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Surname" GlobalName="Surname" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="BirthDate" GlobalName="BirthDate" SqlType="date" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Gender" GlobalName="Gender" SqlType="char" IsPrimaryKey="false" IsNullable="true" /> </SyncColumns> <FilterColumns> <FilterColumn Name="Id" /> </FilterColumns> <FilterParameters> <FilterParameter Name="@Id" SqlType="uniqueidentifier" DataSize="0" /> </FilterParameters> </SyncTable> </SyncTables> </SyncScope> </SyncScopes> <Databases> <TargetDatabase Name="XXXXX" DbServer="XXXXXXX" DbName="XXXXX" UserName="XXXXX" Password="XXXXXX" /> </Databases> </SyncConfiguration> </configuration>I am working with an azure sql database, provisioned using SyncSvcUtil.exe.
The service diag page shows that provisioning fails, but i think it is a bug in the diagnostics page as mentioned here: http://social.msdn.microsoft.com/Forums/en-AU/synclab/thread/cf9466f7-2ea3-4418-8441-55cb71a222a1
My InitializeService code is the following:
public static void InitializeService(Microsoft.Synchronization.Services.ISyncServiceConfiguration config) { config.ServerConnectionString = "Server=XXXXX;Database=XXXXX;User ID=XXXXX;Password=XXXXX;Trusted_Connection=False;"; config.AddFilterParameterConfiguration("id", "schema1.Persons", "@Id", typeof(System.Guid)); // enable Diagnostic Dashboard feature for the service config.EnableDiagnosticPage = true; // enable verbose errors config.UseVerboseErrors = true; config.SetSyncObjectSchema("schema1"); }
I appreciate your help.
Thanks in advance,
Sebastián Rosales
- 편집됨 Sebastián Rosales - Vertex Ray 2011년 11월 18일 금요일 오후 5:47
모든 응답
-
2011년 11월 22일 화요일 오전 4:07중재자
for the tablenames, have you tried specifying the table name without the schema?
i.e., "Persons" instead of "schema1.Persons"
-
2011년 11월 22일 화요일 오전 11:21
for the tablenames, have you tried specifying the table name without the schema?
i.e., "Persons" instead of "schema1.Persons"
Hi, thanks for your help. I hadn't tried that because i was following this doc:
http://msdn.microsoft.com/en-us/library/gg299039%28v=sql.110%29.aspx
In SyncTable section it says:
-
Name – Table name in the database. If table is in non dbo schema, the schema name should be included. For non-dbo schemas, the schema name must be specified in quoted format. Ex: [NonDboSchema].[Customer].
However, i tried specifiying the table name without schema as you suggest but i get this error in SyncSvcUtil:
Reading specified config file... Generating DbSyncScopeDescription for scope Scope1... Microsoft.Synchronization.Data.DbSchemaException: Cannot obtain the schema for the following tables: Persons. Ensure that you can establish a connection to the database and that the tables exist. Check the inner exception for any store-specific errors. ---> System.Data.SqlClient.SqlException: Invalid object name 'Persons'. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillSchemaInternal(DataSet dataset, DataTable datatable, SchemaType schemaType, IDbCommand command, String srcTable, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillSchema(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillSchema(DataTable dataTable, SchemaType schemaType) at Microsoft.Synchronization.Data.DbSyncSchemaBuilder.FillSchema(IDbConnection connection, String tableName, IDbCommand schemaCmd, DataTable dataTable) at Microsoft.Synchronization.Data.DbSyncSchemaBuilder.GetSchemaFromDatabase(IDbConnection connection, Collection`1& missingTables, Exception& exp) --- End of inner exception stack trace --- at Microsoft.Synchronization.Data.DbSyncSchemaBuilder.GetSchema(IDbConnection connection) at Microsoft.Synchronization.Data.DbSyncTableDescriptionBuilder.FromCommand(String tableName, IDbCommand cmd) at Microsoft.Synchronization.Data.SqlServer.SqlSyncDescriptionBuilder.GetDescriptionForTable(String tableName, SqlCommand command) at Microsoft.Synchronization.Data.SqlServer.SqlSyncDescriptionBuilder.GetDescriptionForTable(String tableName, Collection`1 columnNames, SqlConnection connection) at Microsoft.Synchronization.Data.SqlServer.SqlSyncDescriptionBuilder.GetDescriptionForTable(String tableName, SqlConnection connection) at Microsoft.Synchronization.ClientServices.SyncSvcUtil.GetDbSyncScopeDescription(SelectedConfigSections selectedConfig) at Microsoft.Synchronization.ClientServices.SyncSvcUtil.ProcessConfigFile(ArgsParser parser) at Microsoft.Synchronization.ClientServices.SyncSvcUtil.Main(String[] args) SyncSvcUtil failed.
I also tried removing schema name inside InitializeService but it does not work (same error as first post)config.AddFilterParameterConfiguration("id", "Persons", "@Id", typeof(System.Guid));
I don't know what i'm doing wrong, i would appreciate any help. ¿Is it possible to sync tables with non dbo schemas or is it not supported?Thanks
Sebastián Rosales
- 편집됨 Sebastián Rosales - Vertex Ray 2011년 11월 22일 화요일 오전 11:21
-
-
2011년 11월 22일 화요일 오후 12:52중재자
Sync framework supports non-dbo schema.
have you tried provisioning directly using SyncSvcUtilHelper?
the xml file generated by the utility doesnt specify the schema directly on the SyncTable and looks like this:
<SyncTable Name="[schema1].[Table_1]" GlobalName="" SchemaName=""
so you might want to try to remove the SchemaName at the SyncTable
-
2011년 11월 22일 화요일 오후 2:57
Sync framework supports non-dbo schema.
have you tried provisioning directly using SyncSvcUtilHelper?
the xml file generated by the utility doesnt specify the schema directly on the SyncTable and looks like this:
<SyncTable Name="[schema1].[Table_1]" GlobalName="" SchemaName=""
so you might want to try to remove the SchemaName at the SyncTable
Thanks again for your help, i generated the config file using the UI utility and generated this:
<SyncScopes> <SyncScope Name="Scope1" SchemaName="schema1" IsTemplateScope="true" EnableBulkApplyProcedures="true"> <SyncTables> <SyncTable Name="[schema1].[Persons]" GlobalName="Persons" SchemaName="" IncludeAllColumns="true" FilterClause="[side].Id = @Id"> <SyncColumns> <SyncColumn Name="Id" GlobalName="Id" SqlType="uniqueidentifier" IsPrimaryKey="true" IsNullable="false" /> <SyncColumn Name="Name" GlobalName="Name" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Surname" GlobalName="Surname" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="BirthDate" GlobalName="BirthDate" SqlType="date" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Gender" GlobalName="Gender" SqlType="char" IsPrimaryKey="false" IsNullable="true" /> </SyncColumns> <FilterColumns> <FilterColumn Name="Id" /> </FilterColumns> <FilterParameters> <FilterParameter Name="@Id" SqlType="uniqueidentifier" DataSize="0" /> </FilterParameters> </SyncTable> </SyncTables> </SyncScope> <SyncScope Name="Scope2" SchemaName="schema2" IsTemplateScope="true" EnableBulkApplyProcedures="true"> <SyncTables> <SyncTable Name="[schema2].[Persons]" GlobalName="Persons" SchemaName="" IncludeAllColumns="true" FilterClause="[side].Id = @Id"> <SyncColumns> <SyncColumn Name="Id" GlobalName="Id" SqlType="uniqueidentifier" IsPrimaryKey="true" IsNullable="false" /> <SyncColumn Name="Name" GlobalName="Name" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Surname" GlobalName="Surname" SqlType="varchar" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="BirthDate" GlobalName="BirthDate" SqlType="date" IsPrimaryKey="false" IsNullable="true" /> <SyncColumn Name="Gender" GlobalName="Gender" SqlType="char" IsPrimaryKey="false" IsNullable="true" /> </SyncColumns> <FilterColumns> <FilterColumn Name="Id" /> </FilterColumns> <FilterParameters> <FilterParameter Name="@Id" SqlType="uniqueidentifier" DataSize="0" /> </FilterParameters> </SyncTable> </SyncTables> </SyncScope> </SyncScopes>
As the global name was generated as "Persons" i changed my InitializeService code to this:config.AddFilterParameterConfiguration("id", "Persons", "@Id", typeof(System.Guid));
Now i receive another error (Fiddler output):<ServiceError xmlns="http://schemas.datacontract.org/2004/07/Microsoft.Synchronization.Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <ErrorDescription>System.Data.SqlClient.SqlException
 Invalid object name 'scope_info'.
 at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
 at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
 at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
 at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
 at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
 at System.Data.SqlClient.SqlDataReader.get_MetaData()
 at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
 at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
 at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
 at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
 at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
 at System.Data.SqlClient.SqlCommand.ExecuteReader()
 at Microsoft.Synchronization.Data.SqlServer.SqlProviderFactory.ReadConfiguration(String scopeName, SyncSchemaInfo syncSchemaInfo)
 at Microsoft.Synchronization.Data.SqlServer.SqlSyncProvider.Configure()
 at Microsoft.Synchronization.Data.SqlServer.SqlSyncProvider.BeginSession(SyncProviderPosition position, SyncSessionContext syncSessionContext)
 at Microsoft.Synchronization.Services.SqlProvider.SqlSyncProviderService.GetChanges(Byte[] clientKnowledgeBlob)
 at Microsoft.Synchronization.Services.DownloadChangesRequestProcessor.ProcessRequest(Request incomingRequest)
 at Microsoft.Synchronization.Services.SyncService`1.ProcessRequestForMessage(Stream messageBody)
 
 
 </ErrorDescription> </ServiceError>
I think that the error i'm getting now is related to this issue:http://social.msdn.microsoft.com/Forums/en-HK/synclab/thread/5a870144-ec72-4ecd-bd6c-3c9f9302362d
If it is the same issue, apparently it is a bug and is going to be solved in the next release, but that response was about 1 year ago. If it is the same error, do you know if it was or will be solved? Or is it another error?
Thanks for your help!
Sebastián Rosales
-
2011년 11월 23일 수요일 오전 1:08중재자
can you confirm that the sync objects were actually provisioned?
if the objects were provisioned, under what schema was scope_info created?
btw, i noticed you're not setting which scope to use in the InitializeService. e.g., config.SetEnableScope("Scope1");
are you using the latest bits from the Sync Toolkit?- 편집됨 JuneTMVP, Moderator 2011년 11월 23일 수요일 오전 1:39
-
2011년 11월 23일 수요일 오전 10:45
can you confirm that the sync objects were actually provisioned?
if the objects were provisioned, under what schema was scope_info created?
Yes, the sync objects were provisioned under schema1 and schema2. These are my tables:
schema1.Persons_tracking
schema1.schema_info
schema1.scope_config
schema1.scope_info
schema1.scope_parameters
schema1.scope_templatesschema2.Persons_tracking
schema2.schema_info
schema2.scope_config
schema2.scope_info
schema2.scope_parameters
schema2.scope_templatesand these are the store procedures:
schema1.Persons_bulkdelete
schema1.Persons_bulkinsert
schema1.Persons_bulkupdate
schema1.Persons_delete
schema1.Persons_deletemetadata
schema1.Persons_insert
schema1.Persons_insertmetadata
schema1.Persons_selectchanges
schema1.Persons_selectrow
schema1.Persons_update
schema1.Persons_updatemetadata
schema2.Persons_bulkdelete
schema2.Persons_bulkinsert
schema2.Persons_bulkupdate
schema2.Persons_delete
schema2.Persons_deletemetadata
schema2.Persons_insert
schema2.Persons_insertmetadata
schema2.Persons_selectchanges
schema2.Persons_selectrow
schema2.Persons_update
schema2.Persons_updatemetadatabtw, i noticed you're not setting which scope to use in the InitializeService. e.g., config.SetEnableScope("Scope1");
You are right about "config.SetEnableScope("Scope1")", i have that line in my code but i deleted by mistake on first post, i'm sorry. This is my last complete code:
public static void InitializeService(Microsoft.Synchronization.Services.ISyncServiceConfiguration config) { config.ServerConnectionString = "Server=XXXXXX;Database=XXXXXX;User ID=XXXXXX;Password=XXXXXX;Trusted_Connection=False;"; config.SetEnableScope("Scope1"); // configure filter parameters used by the service config.AddFilterParameterConfiguration("id", "Persons", "@Id", typeof(System.Guid)); // enable Diagnostic Dashboard feature for the service config.EnableDiagnosticPage = true; // enable verbose errors config.UseVerboseErrors = true; // Note: The scope has specified a non dbo schema for creating sync tables. Removing this line will cause requests from new clients to fail. config.SetSyncObjectSchema("schema1"); }
are you using the latest bits from the Sync Toolkit?
How can i check that? The version i'm working with was downloaded as explained here:
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=12012
Thanks again
Sebastián Rosales
-
2011년 11월 23일 수요일 오전 11:07중재자
that's the CTP copy.
the CTP has been released as the Sync Framework Toolkit. you can find the latest bits here: http://code.msdn.microsoft.com/Sync-Framework-Toolkit-4dc10f0e