1

我有以下情况:分发作为分发数据库,​​production1 作为发布数据库,production2 作为订阅者。当我尝试通过 C# RMO 创建发布时,会出现以下错误:

无法将值 NULL 插入列“pubid”、表“production1.dbo.IHpublications”;列不允许空值。INSERT 失败。\r\n无法创建发布。\r\n已将数据库上下文更改为“production1”。\r\n语句已终止。

代码附在下面 - 取自 MSDN:

        // Set the Publisher, publication database, and publication names.
        string publicationName = "productionTran";
        string publicationDbName = "production1";
        string publisherName = "OSKAR-KOMPUTER";

        ReplicationDatabase publicationDb;
        TransPublication publication;

        // Create a connection to the Publisher using Windows Authentication.
        ServerConnection conn;
        conn = new ServerConnection(publisherName);


        try
        {
            // Connect to the Publisher.
            conn.Connect();

            // Enable the AdventureWorks database for transactional publishing.
            publicationDb = new ReplicationDatabase(publicationDbName, conn);

            // If the database exists and is not already enabled, 
            // enable it for transactional publishing.
            if (publicationDb.LoadProperties())
            {
                if (!publicationDb.EnabledTransPublishing)
                {
                    publicationDb.EnabledTransPublishing = true;
                }

                // If the Log Reader Agent does not exist, create it.
                if (!publicationDb.LogReaderAgentExists)
                {
                    // Specify the Windows account under which the agent job runs.
                    // This account will be used for the local connection to the 
                    // Distributor and all agent connections that use Windows Authentication.
                    //publicationDb.LogReaderAgentProcessSecurity.Login = winLogin;
                    //publicationDb.LogReaderAgentProcessSecurity.Password = winPassword;

                    // Explicitly set authentication mode for the Publisher connection
                    // to the default value of Windows Authentication.
                    publicationDb.LogReaderAgentPublisherSecurity.WindowsAuthentication = true;

                    // Create the Log Reader Agent job.
                    publicationDb.CreateLogReaderAgent();
                }
            }
            else
            {
                throw new ApplicationException(String.Format(
                    "The {0} database does not exist at {1}.",
                    publicationDb, publisherName));
            }

            // Set the required properties for the transactional publication.
            publication = new TransPublication();
            publication.ConnectionContext = conn;
            publication.Name = publicationName;
            publication.DatabaseName = publicationDbName;

            // Specify a transactional publication (the default).
            publication.Type = PublicationType.Transactional;

            // Activate the publication so that we can add subscriptions.
            publication.Status = State.Active;

            // Enable push and pull subscriptions and independent Distribition Agents.
            publication.Attributes |= PublicationAttributes.AllowPull;
            publication.Attributes |= PublicationAttributes.AllowPush;
            publication.Attributes |= PublicationAttributes.IndependentAgent;

            // Specify the Windows account under which the Snapshot Agent job runs.
            // This account will be used for the local connection to the 
            // Distributor and all agent connections that use Windows Authentication.
           // publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
          //  publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;

            // Explicitly set the security mode for the Publisher connection
            // Windows Authentication (the default).
            publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;

            if (!publication.IsExistingObject)
            {
                // Create the transactional publication.
                publication.Create();

                // Create a Snapshot Agent job for the publication.
                publication.CreateSnapshotAgent();
            }
            else
            {
                throw new ApplicationException(String.Format(
                    "The {0} publication already exists.", publicationName));
            }
        }

        catch (Exception ex)
        {
            // Implement custom application error handling here.
            throw new ApplicationException(String.Format(
                "The publication {0} could not be created.", publicationName), ex);
        }
        finally
        {
            conn.Disconnect();
        }

我可以告诉更多的是,已安装发行商和发行商。有任何想法吗?提前致谢。

4

1 回答 1

-1

我遇到过同样的问题。在我想发布的数据库上运行以下内容对我有用。

DROP TABLE dbo.iharticles;
DROP TABLE dbo.ihcolumns;
DROP TABLE dbo.ihconstrainttypes;
DROP TABLE dbo.ihindextypes;
DROP TABLE dbo.ihpublications;
DROP TABLE dbo.ihpublishercolumnconstraints;
DROP TABLE dbo.ihpublishercolumnindexes;
DROP TABLE dbo.ihpublishercolumns;
DROP TABLE dbo.ihpublisherconstraints;
DROP TABLE dbo.ihpublisherindexes;
DROP TABLE dbo.ihpublishers;
DROP TABLE dbo.ihpublishertables;
DROP TABLE dbo.ihsubscriptions;
DROP TABLE dbo.syssubscriptions
DROP VIEW dbo.syspublications;
DROP VIEW dbo.sysarticlecolumns;
DROP VIEW dbo.syssubscriptions;
DROP VIEW dbo.sysextendedarticlesview;
DROP VIEW dbo.ihextendedarticleview;
DROP VIEW dbo.ihextendedsubscriptionview;

然后,我使用向导禁用发布,然后使用向导重新启用它并能够创建发布。

于 2019-04-03T21:05:05.723 回答