PEgar o diretorio de uma class library
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.
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
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
Curtidas 0
Respostas
Robson Alves
14/01/2013
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.
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.
GOSTEI 0
Gustavo Henrique
14/01/2013
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
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
GOSTEI 0
Robson Alves
14/01/2013
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:
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.
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.
GOSTEI 0
Gustavo Henrique
14/01/2013
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
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:
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!
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!
GOSTEI 0
Robson Alves
14/01/2013
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.. !
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.. !
GOSTEI 0
Gustavo Henrique
14/01/2013
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.
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.
GOSTEI 0
Robson Alves
14/01/2013
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!
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!
GOSTEI 0
Robson Alves
14/01/2013
Infelizmente minha empresa bloqueia um monte de links ... o postebin é um deles
GOSTEI 0
Gustavo Henrique
14/01/2013
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
GOSTEI 0
Robson Alves
14/01/2013
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!
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!
GOSTEI 0
Gustavo Henrique
14/01/2013
Botão direito no projeto add new folder...
Nada tambem ;x
Nada tambem ;x
GOSTEI 0
Robson Alves
14/01/2013
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!
No Debug, tenta jogar outros endereços até que ele encontre o BD ... o Caminho é esse!
GOSTEI 0
Gustavo Henrique
14/01/2013
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
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
GOSTEI 0
Robson Alves
14/01/2013
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!
So falta um detalhe no caminho que é o nome do arquivo.
Ve se a variavel FileDirectory está capturando algum valor!
GOSTEI 0
Gustavo Henrique
14/01/2013
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?
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?
GOSTEI 0
Robson Alves
14/01/2013
Se alterou o nome da pasta tem que alterar no código!
essa é a extensão correta do arquivo de banco SQLite *.s3db ?
Enquanto o FileDirectory retornar null, quer dizer que não tem nenhum arquivo com essa extensão dentro da pasta!
Estamos quase lá.
Se não entrar no If, quer dizer q nem encontrou a pasta.
essa é a extensão correta do arquivo de banco SQLite *.s3db ?
Enquanto o FileDirectory retornar null, quer dizer que não tem nenhum arquivo com essa extensão dentro da pasta!
Estamos quase lá.
Se não entrar no If, quer dizer q nem encontrou a pasta.
GOSTEI 0
Gustavo Henrique
14/01/2013
Então ele nem entra no if.
Sim, o SQLite gera um arquivo com essa extensão
Amanhã cedo eu volto a tentar novamente, pegar o caminho de casa agora!
Obrigado pela ajuda Robson, qualquer novidade amanhã eu já posto!
if (Directory.Exists("Banco"))
Sim, o SQLite gera um arquivo com essa extensão
Amanhã cedo eu volto a tentar novamente, pegar o caminho de casa agora!
Obrigado pela ajuda Robson, qualquer novidade amanhã eu já posto!
GOSTEI 0
Robson Alves
14/01/2013
Opa! Boa viajem e descanso ;) (minha jornada ainda vai até mais tarde)
GOSTEI 0
Gustavo Henrique
14/01/2013
Robson,
Veja isso
Ele pega o endereço da DLL da class library, depois pega apenas o nome do diretorio onde esta a dll (ele vai até bin\debug)
depois eu coloquei o nome da pasta do banco e o banco! Vou testar aqui e posto o resultado, mas debugando foi de boa!!
=D
Veja isso
string file = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath; FileInfo fi = new FileInfo(file); string conexao = fi.DirectoryName; conexao += @"\Banco\BancoConfiguracao.s3db";
Ele pega o endereço da DLL da class library, depois pega apenas o nome do diretorio onde esta a dll (ele vai até bin\debug)
depois eu coloquei o nome da pasta do banco e o banco! Vou testar aqui e posto o resultado, mas debugando foi de boa!!
=D
GOSTEI 0
Gustavo Henrique
14/01/2013
Me enganei, ele ainda continua pegando a DLL que foi gerada na aplicação e não na dll da class library :/
Passei o dia todo fuçando isso e nada, estou quase desistindo!!!
Passei o dia todo fuçando isso e nada, estou quase desistindo!!!
GOSTEI 0
Robson Alves
14/01/2013
Puxa, não consigo entender como não está conseguindo, nos meus testes, ele lê os arquivos da pasta e em seguida cria a conexão com o banco de dados, sem problemas! :/
GOSTEI 0