none
Configurar Merge Replication - IMPOSSÍVEL!!! RRS feed

  • Pergunta

  • Bom, já desenvolvo sites ASP.NET em C# a cerca de um ano. Não me considero um desenvolvedor novato.
    O caso é o seguinte:
    Certa empresa me chamou para desenvolver um sistema de vendas com ppcs. Pensei: Beleza! O PPC usa SQL. Vai ser baba. Estava sendo mesmo. O desenvolvimento no PPC estava maravilhoso. Até que eu me deparei com a parte de Replicação dos dados. O famigerado Merge Replication. Até os livros que eu peguei admitem que o negócio é chato. Bom, segui esse tutorial do help do Visual Studio:

    http://rapidshare.com/files/7154316/ms-help___MS.VSCC.v80_MS.MSDN.v80_MS.MOBEMBDEV.v10.pdf.html

    Passei para C# E NÃO FUNCIONOU!!!!
    Segue a mensagem do erro:
    ====================
    System.Data.SqlServerCe.SqlCeException was unhandled
      Message="Header information is either corrupted or missing."
      HResult=-2147012746
      NativeError=28035
      Source="Microsoft SQL Server 2005 Mobile Edition"
      StackTrace:
        em System.Data.SqlServerCe.NativeMethods.CheckHRESULT()
        em System.Data.SqlServerCe.SqlCeReplication.Synchronize()
        em TesteReplication.ProductsForm.ReplicateData()
        em TesteReplication.ProductsForm.CreateButton_Click()
        em System.Windows.Forms.Control.OnClick()
        em System.Windows.Forms.Button.OnClick()
        em System.Windows.Forms.ButtonBase.WnProc()
        em System.Windows.Forms.Control._InternalWnProc()
        em Microsoft.AGL.Forms.EVL.EnterMainLoop()
        em System.Windows.Forms.Application.Run()
        em TesteReplication.Program.Main()
    ===================================
    A mensagem: Header information is either corrupted or missing.

    Rodei o mesmo sistema em VB.NET e o erro continua o mesmo.
    Uso Windows XP Professional com Service Pack 2, Visual Studio 2005, SQL Server 2000 com Service Pack 3 mais o SQL Server CE Components. Meu PPC é um Dell Axim X30 com wifi. Eu consigo acessar o Sql Server Agent pelo Internet Explorer do PPC. Uso wifi para isso.
    Bom, quem puder ajudar, agradeço. Estou quase desistindo do trabalho. Sem a replicação de dados, o sistema é inútil.


    terça-feira, 12 de dezembro de 2006 11:54

Todas as Respostas

  • Segue o código utilizado para criar o banco de dados.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlServerCe;
    using System.Net;
    using System.IO;

    namespace TesteReplication
    {
        public partial class ProductsForm : Form
        {
            public ProductsForm()
            {
                InitializeComponent();
            }


            private const string INTERNETURL = "http://192.168.0.1/Northwind/sscesa20.dll";
            private const string PUBLISHERSERVER = "DESKPEAR";
            private const string PUBLISHERDATABASE = "Northwind";
            private const SecurityType PUBLISHERSECURITYMODE = SecurityType.NTAuthentication;
            private const string PUBLICATION = "NorthwindProducts";
            private  string SUBSCRIBER = Dns.GetHostName();
            private const string LOCALDATABASE = @"\My Documents\products.sdf";
            private const string CONNECTIONSTRING = "data source=" + LOCALDATABASE;


            private void ReplicateData()
            {
                SqlCeReplication replicator = new SqlCeReplication();
                replicator.InternetUrl = INTERNETURL;
                replicator.Publisher = PUBLISHERSERVER;
                replicator.PublisherDatabase = PUBLISHERDATABASE;
                replicator.PublisherSecurityMode = PUBLISHERSECURITYMODE;
                replicator.Publication = PUBLICATION;
                replicator.Subscriber = SUBSCRIBER;
                replicator.SubscriberConnectionString = CONNECTIONSTRING;
                replicator.Synchronize();
            }//end public void  ReplicateData()



            private void CreateButton_Click(object sender, EventArgs e)
            {
                Cursor.Current = Cursors.WaitCursor;
                try
                {
                    SqlCeEngine engine = new SqlCeEngine(CONNECTIONSTRING);

                    if (File.Exists(LOCALDATABASE))
                    {
                        File.Delete(LOCALDATABASE);
                    }//end if  
                    engine.CreateDatabase();
                    ReplicateData();
                    Cursor.Current = Cursors.Default;
                    MessageBox.Show("Replica Database created", "Replicated", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);



                }//end try
                catch (SqlCeException ex)
                {
                    Cursor.Current = Cursors.Default;
                    foreach (SqlCeError errSQL in ex.Errors)
                    {
                        MessageBox.Show(errSQL.Message);
                    }//end foreach

                }//end catch
            }//end  CreateButton_Click
        }
    }

    O código eu acho que está certo.
    Mensagem de erro no ppc:  Header information is either corrupted or missing.
    Ou seja: Uma informação do cabeçalho está corrompida ou faltando. Esse código cria o banco no ppc mas quando chega nesta linha:
    replicator.Synchronize(), dá pau!!!!
    Agradeço a ajuda de todos!!!!

    terça-feira, 12 de dezembro de 2006 14:13
  • Caro edmaronline

     

               Eu utilizei o codigo gerado pelo próprio Sql Server e n tive problemas.
                      Dê uma olhada:

                 SqlCeReplication repl = new SqlCeReplication();
                 repl.InternetUrl = @http://minhamaquina/sql_sync/sqlcesa30.dll;
                 repl.Publisher = @"IRON-SERVER\SQL2000";
                 repl.PublisherDatabase = @"SemanaTech";
                 repl.PublisherSecurityMode = SecurityType.NTAuthentication;
                 repl.Publication = @"SemanaTech";
                 repl.Subscriber = @"SemanaTech";
                 repl.SubscriberConnectionString = @"Data Source=""\Program Files\SemanaTech.sdf"";Max Database Size=128;Default Lock Escalation =100;";

                 try
                
    {
                            repl.Synchronize();
                            MessageBox.Show("Banco de dados sincronizado");
                 }

                catch (SqlCeException ex)
                {
                            MessageBox.Show(ex.ToString());
                }

                Você configurou o usuário do IIS?

    quarta-feira, 13 de dezembro de 2006 01:38
  • Sim Arilson,
    Vou descrever o que eu fiz:
    Primeiro criei um Publication no SQL Server 2000. chamei o publication de MyTest. Nas propriedades do Publication adicionei o usuário IUSR_mycomputername. E setei ele para ter acesso total a tabela. Bom, por aí eu acho que eu já acabei meu trabalho no SQL Server. No wizard do SQL Server Ce, criei a pasta para o Sql Agent e atribui uma permissão anônima para o usuário IUSR_mycomputername. Lembrando que esse usuário é o login anônimo.Ajustei as permissões ainda no wizard para Full. Também acho que por aqui meu trabalho acabou.
    Daí, criei o código acima e recebo sempre essa bendita mensagem de erro. Que no caso é o erro 28035: Header information is either corrupted or missing. - SSCE_M_FAILUREQUERYINGHEADER. O SQL Server CE Books Online diz que esse erro é da classe Replication Transport Error. Só que não diz como resolver o problema. Bom é isso. Quem puder ajudar, agradeço.
    quarta-feira, 13 de dezembro de 2006 13:16
  • Só não entendi por que você usou @ em alguns parâmetros. Eu sei que o @ deve ser utilizado, por exemplo, no data source, senão o c# vai pensar que você está utilizando caracteres de escape. Ou seja, você usa o @ para não ter que usar dois \\. Mas usar isso no InternetURL? e no nome da @"SemanaTech"? Me desculpe mas qual a utilidade desse @ nesses casos?
    quarta-feira, 13 de dezembro de 2006 13:43
  • Eu consigo "pingar" normal com o notebook via wifi e através do Internet Explorer do PPC eu consigo acessar a pasta virtual do Sql Ce Server com esse endereço:

    http://192.168.0.1/meudbmr/sscesa20.dll

    No meu código eu coloquei o replicator com a seguinte config:

    replicator.InternetLogin = "edmar";
    replicator.InternetPassword = "passwordrede";

    Agora o que eu devo setar para o sql server? Seria a propriedade .DistributorLogin? Se eu setei o sql server para windows authentication o que eu devo usar? E se eu usar um login anônimo? Alguém poderia mostrar as propriedades devidas com as respectivas formas de login? Tipo, se eu usar Windows Authentication no IIS eu devo setar tal propriedade, se no IIS eu setar anônimo, tal propriedade com tal valor. E a mesma coisa para o SQL Server.
    Vi que você tem que passar pela segurança do IIS (isso eu consegui fazer) e pela segurança do SQL Server.
    Só para ficar claro:
    IIS ===> Informar cada tipo de login e como setar o objeto replicator em cada situação.
    SQL Server ==> Informar cada tipo de login e como setar o objeto replicator.

    Bom, acho que é isso.
    Grato a todos.
    quinta-feira, 14 de dezembro de 2006 13:54