Jump to content

[Problema] C# Inner join em modo desconectado.


Balian
 Share

Recommended Posts

Boas tardes.

Estou a desenvolver uma aplicação no modelo desconectado em C#. Tenho um problema ao ter de efectuar uma operação de inner join para juntar 3 tabelas. Ora bem, eu tenho uma tabela com referencias(códigos) e códigos de projectos, a qual tenho de juntar o nome que está noutra tabela, assim como com o nome dos projectos. O objectivo é listar o material que é utilizado em cada projecto.

De referir também que estou a carregar o modelo relacional para o dataset logo no formulário1, que é o container.

Tenho o código para o inner join arrumado desta maneira:

    public partial class ProjMatListar : Form
    {
        DataSet _ds = null;
        DataTable jt = null;

        public ProjMatListar(DataSet d, DataTable dt)
        {
            InitializeComponent();
            this._ds = d;
            this.jt = dt;
        }

private DataTable JoinTables(DataTable a, DataTable b)
        {
            DataTable jt = new DataTable("JoinedTable");

            jt.Columns.Add("codProj", typeof(Int32));

            jt.Columns.Add("nomeProj", typeof(String));

            jt.Columns.Add("tipoProj", typeof(String));

            jt.Columns.Add("moradaProj", typeof(String));

            jt.Columns.Add("valor", typeof(Double));

            jt.Columns.Add("dataInicio", typeof(DateTime));

            jt.Columns.Add("dataFinal", typeof(DateTime));

            jt.Columns.Add("cliente", typeof(Int32));

            jt.Columns.Add("ref", typeof(String));

          

            //adicionar a datatable ao dataset
            //_ds.Tables.Add(jt);
            foreach (DataRow d in a.Rows)
            {
                foreach (DataRow t in b.Rows)
                {
                    if ((int)d["codProj"] == (int)t["codProj"])
                    {
                        DataRow dr = jt.NewRow();
                        dr["codProj"] = d["codProj"];
                        dr["nomeProj"] = d["nomeProj"];
                        dr["tipoProj"] = d["tipoProj"];
                        dr["moradaProj"] = d["moradaProj"];
                        dr["valor"] = d["valor"];
                        dr["dataInicio"] = d["dataInicio"];
                        dr["dataFinal"] = d["dataFinal"];
                        dr["cliente"] = d["cliente"];
                        dr["ref"] = t["ref"];

                        jt.Rows.Add(dr);
                    }

                }
            }
            return jt;
            
        }

        private void ProjMatListar_Load(object sender, EventArgs e)
        {
            //criar nova datatable

            DataTable jt = JoinTables(_ds.Tables["Projecto"], _ds.Tables["Proj_Mat"]);
            _ds.Tables.Add(jt);

            dataGridView1.DataMember = "JoinedTable";
            dataGridView1.DataSource = _ds;

        }

o problema encontra-se no load, nesta linha de código "_ds.Tables.Add(jt);", ao abrir a primeira vez, corre tudo bem, mas caso o utilizador abra a segunda,acontece um erro. que passo a citar:

A DataTable named 'JoinedTable' already belongs to this DataSet.

caso alguém saiba resolver o problema e possa partilhar o conhecimento comigo, agradeço.

Cumprimentos!

Link to comment
Share on other sites

O que queres dizer com "modo descontectado"?

O erro é bastante claro: já tens a tabela presente nesse data set.

Limpa as tabelas do dataset quando as mesmas já não são necessárias.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

O que queres dizer com "modo descontectado"?

O erro é bastante claro: já tens a tabela presente nesse data set.

Limpa as tabelas do dataset quando as mesmas já não são necessárias.

Boas.

quando digo modo desconectado quero dizer que com este modo, não preciso de trabalhar directamente com a base de dados. carrego tudo para a memoria, faço as operações sobre a memoria e quando desligo a aplicação ele actualiza para a base de dados.

como é que posso fazer para limpar as tabelas? eu já tentei por essa parte do codigo no formulário main, mas continua a dar problemas igualmente...

Cumprimentos.

edit: tentei usar o método _ds.clear(); mas limpa-me completamente as tabelas, fico sem nada para mostrar, o que não pode acontecer...

Link to comment
Share on other sites

Hum...

Se necessitas de trabalhar offline, o melhor é teres uma cópia da BD local e depois sincronizares com a BD central quando estiveres online?

É que se tentares guardar tudo em memória vais ter de implementar mecanismos de sincronização, recuperação ePOS tolerancia a falhas, clashing de chaves, etc.. Ou seja, vais ter de implementar um conjunto de mecanismos que já fazem parte do motor da BD.

PS: o .cear() é o método certo que tens de usar. Se não o quiseres usar, vais ter de implementar o teu próprio clear() para fazer a limpeza dos dados que tens em memória. De novo, parece-me que faz todo o sentido usares uma BD local que despois sincroniza com a DB central.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

o problema persiste. mas já arranjei uma outra solução sem ter de recorrer ao inner join.

Obrigado pela disponibilidade.

Hum...

Se necessitas de trabalhar offline, o melhor é teres uma cópia da BD local e depois sincronizares com a BD central quando estiveres online?

É que se tentares guardar tudo em memória vais ter de implementar mecanismos de sincronização, recuperação ePOS tolerancia a falhas, clashing de chaves, etc.. Ou seja, vais ter de implementar um conjunto de mecanismos que já fazem parte do motor da BD.

PS: o .cear() é o método certo que tens de usar. Se não o quiseres usar, vais ter de implementar o teu próprio clear() para fazer a limpeza dos dados que tens em memória. De novo, parece-me que faz todo o sentido usares uma BD local que despois sincroniza com a DB central.

não respondi directamente porque não estava em casa. passo agora a explicar-te o motivo de não utilizar uma BDLocal. isto é um projecto em que não faz sentido estar sempre a trabalhar directamente com a BD. eu passo tudo do modelo relacional para a memoria e trabalho a partir dai. não há a necessidade de estar sempre a fazer a ligação já que quando o projecto fecha actualiza tudo. é a primeira vez que estou a utilizar este método, logo só no fim posso tirar ilações sobre se foi o mais correcto ou não a fazer...

Cumprimentos uma vez mais.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.