PEgar o diretorio de uma class library

14/01/2013

5

Bom dia,

Estou co um projeto onde há uma class library responsavel pelo acesso ao banco (SQLite) e é o ponto comum entre 2 projetos que precisam compartilhar o mesmo arquivo de configuração (SQLite).

Portanto eu queria deixar o arquivo sqlite dentro da pasta bin\debug dessa class library.

String programa = Assembly.GetExecutingAssembly().Location;
      String pastaSistema = programa.Substring(0, programa.LastIndexOf('\\'));
      conn = new SQLiteConnection(@"data source="+ pastaSistema + @"\BancoConfiguracao.s3db");


Porem quando eu faço isso ele pega a pasta Debug da aplicação e não da class library...
Qualquer ajuda é bem vinda, obrigado
Responder

Posts

14/01/2013

Robson Alves

Gustavo!
Fiz algumas pesquisas, todos elas traz o endereço da aplicação onde o sistema estará compilado!

Pensando no processo de como tudo funciona, é o mais correto!

Imagina que o path da pasta Bin/Debug exista apenas para a aplicação em desenvolvimento.
No release, é gerado uma DLL e ela ficará na pasta do Sistema (Web/WinForm)...
Então coloque o SQLLite dentro da Bin/Debug do projeto e não do ClassLibrary!

Deve existir uma forma de trazer o que vc precisa (não estou limitando seu problema).
Mas vejo que isso será conceitualmente errado.
Responder
Robson,

O problema de ir na pasta bin da aplicação é que são 2 projetos, cada um irá acessar dentro da pasta bin dele, se eu colocar o banco dentro da bin da aplicação de um projeto o outro não irá achar o arquivo, por isso pensei em colocar dentro da class library que é o unico ponto comum entre ambos.
É um windows service que acessa o banco com as configurações, uma aplicação onde se pode manipular essas configurações, e uma class library que faz o acesso de ambas aplicações. Se você tiver alguma sugestão pra me dar de onde colocar o banco em algum ponto onde todos terão acesso e que fique independente de onde esta o projeto, ou alguma sugestão de mudança, faço facu mas trabalhar com programação mesmo comecei por esses dias ;x
Responder

15/01/2013

Robson Alves

Legal Gustavo, seja bem vindo a área :D

Bem cara, o que eu fiz aqui e acredito que resolva seu problema.

Primeiro criei uma pasta BD na classLibrary.
depois fiz o seguinte código:


 if (Directory.Exists("BD"))
            {
                foreach (var fileDirectory in Directory.GetFiles("BD", "*.db"))
                {
                    SqlConnection con = new SqlConnection(string.Format("Data Source=;Version=3;Password=myPassword;", new FileInfo(fileDirectory).DirectoryName + fileDirectory));
                    try
                    {
                        con.Open();
                    }
                    catch (Exception)
                    {

                        throw;
                    }
                    finally
                    {
                        con.Close();
                    }
                }
            }



Ele verifica se encontrou a pasta BD, depois ele pega os arquivos dessa pasta, filtrando todos com a extensão .BD (sabemos que é só um, e isso pode ser refeito). Depois eu pego pelo arquivo o caminho físico dele e o endereço "Virtual" dele.

Assim o Programa é capaz de abrir a conexão!

Fiz aqui e deu certo (utilizei SQL Server Local) não utilizei o SQlite, mas é a mesma coisa!

Happy Coding.
Responder
Robson,

Entendi a idéia, mas modifiquei aqui de acordo com o SQLite, mas mesmo assim não deu, realizei um debug, e ele ta passando direto pelo if

if (Directory.Exists("BD"))

Ele procura a partir de onde essa pasta BD? Isso não entendi muito bem, geralmente se passa algum caminho desde a raiz.

Coloquei depois de todo código que você me passou os seguintes comandos:

 comando = new SQLiteCommand();
       comando.Connection = conn;
       pasta = conn.ConnectionString.ToString();


pasta é uma string publica que só serve pra mim ver qual era a string de conexão que retornava para saber se estava tudo ok, mas quando ele vai atribuir a conexão ao comando, ele da um erro dizendo que a conexão é nula, justamente por pular todo o bloco do if..
Enfim, hoje na empresa iremos testar aqui, por enquanto deixar o BD em algum caminho constante mesmo, mas vou sempre que tiver um tempo dar uma fuçada nisso, se caso eu descobrir a resposta eu postarei ela aqui.
Obrigado pela ajuda Robson, qualquer novidade coloque ai por favor que estarei sempre de olho no tópico!
Responder

15/01/2013

Robson Alves

Como BD é uma pasta dentro da ClassLibrary, ele teoricamente está no mesmo diretório do que está procurando.. portanto não preciso definir onde ele está (caminho total), ele vai ser encontrado!

O código que eu te passei é pra ser incluído dentro da class library!
pois essa camada é quem chamará o BD!

Vc colocou esse código nessa camada?

Estranho.. !
Responder
Robson,

Fiz assim [url]http://pastebin.com/XdPypNM7[/url] (Aqui o código é melhor pra analisar)

Tem todo o código da classe, deve ter uns códigos repetidos ae, mas isso é falta de experiência um pouco, rs.
Criei a pasta BD dentro do \bin\debug da class library, e coloquei o banco sqlite dentro dela, e mesmo assim não esta indo.
Responder

15/01/2013

Robson Alves

Ok, o problema é justamente onde vc está criando a pasta.

Crie a pasta dentro do projeto da ClassLibrary, não na pasta Bin/Debug.

Então toda vez que forem utilizar o classlibrary o mesmo irá acessar a base dados única!
Responder

15/01/2013

Robson Alves

Infelizmente minha empresa bloqueia um monte de links ... o postebin é um deles
Responder
public DAO()
        {
            if (Directory.Exists("BD"))
            {
                foreach (var fileDirectory in Directory.GetFiles("BD", "*.s3db"))
                {
                    conn = new SQLiteConnection(string.Format("Data Source=;", new FileInfo(fileDirectory).DirectoryName + fileDirectory));
                    try
                    {
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            pasta = conn.ConnectionString;
            comando = new SQLiteCommand();
            comando.Connection = conn;
}


To utilizando no Construtor o código, criei a pasta BD na mesma pasta do projeto, onde fica a bin, obj e properties..
E mesmo assim não foi. ;/
Tentar depois do almoço mostrar pra turma que manja aqui, ve se alguem tem uma solução
Responder

15/01/2013

Robson Alves

Ok, o problema é justamente onde vc está criando a pasta.

Crie a pasta dentro do projeto da ClassLibrary, não na pasta Bin/Debug.

Então toda vez que forem utilizar o classlibrary o mesmo irá acessar a base dados única!


Você viu essa minha citação?
Não crie a pasta BD dentro de Bin, crie no próprio projeto da ClassLibrary!
Responder
Botão direito no projeto add new folder...
Nada tambem ;x
Responder

15/01/2013

Robson Alves

Não creio :/ Ele diz que pasta não existe certo?

No Debug, tenta jogar outros endereços até que ele encontre o BD ... o Caminho é esse!

Responder
DirectoryNotFound...

Could not find a part of the path 'C:\Documents and Settings\gustavo.henrique\Meus documentos\ProjetoSVNBKP\Interface_SVNBackup\Interface_SVNBackup\bin\Debug\Banco\'.

Ta dando esse erro, por isso anteriormente tentei colocar na pasta Debug, mas sem sucesso tbm!
To tentando, qualquer novidade eu posto!
Obrigado
Responder

15/01/2013

Robson Alves

Sim, ele pega a pasta Bin,mas ele vai encontrar a pasta dentro do projeto !

So falta um detalhe no caminho que é o nome do arquivo.

Ve se a variavel FileDirectory está capturando algum valor!
Responder
Ele esta com o valor null
Ah e eu alterei o nome de BD pra Banco.
Isso ai já me retorna a pasta que eu criei no projeto? ou tem algum outro jeito de acessar essa pasta criada?
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar