PEgar o diretorio de uma class library
14/01/2013
0
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
Gustavo Henrique
Posts
14/01/2013
Robson Alves
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.
15/01/2013
Gustavo Henrique
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
15/01/2013
Robson Alves
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.
15/01/2013
Gustavo Henrique
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!
15/01/2013
Robson Alves
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.. !
15/01/2013
Gustavo Henrique
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.
15/01/2013
Robson Alves
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!
15/01/2013
Robson Alves
15/01/2013
Gustavo Henrique
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
15/01/2013
Robson Alves
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!
15/01/2013
Gustavo Henrique
Nada tambem ;x
15/01/2013
Robson Alves
No Debug, tenta jogar outros endereços até que ele encontre o BD ... o Caminho é esse!
15/01/2013
Gustavo Henrique
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
15/01/2013
Robson Alves
So falta um detalhe no caminho que é o nome do arquivo.
Ve se a variavel FileDirectory está capturando algum valor!
15/01/2013
Gustavo Henrique
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?
Clique aqui para fazer login e interagir na Comunidade :)