none
Verificar existencia e criar BD via código. RRS feed

  • Pergunta

  •  

    Pessoal,

     

    Estou tentando verificar a existencia do banco de dados no dispositivo, e, caso não exista criar o mesmo:

     

    Code Snippet

     

    Imports System.Data.SqlServerCe

     

     

    Public Function CreateDataBase() As Boolean

    If Not IO.File.Exists(DBPath) Then

    Try

    'Cria o DB fisico

    Dim MyEngine As New SqlServerCe.SqlCeEngine("DATASOURCE=\Program Files\CRED\BaseDP.sdf")

    MyEngine.CreateDatabase()

    MyEngine.Dispose()

    OpenConnection()

    Return True

    Catch ex As Exception

    MsgBox(ex.Message)

    Return False

    End Try

    Else

    OpenConnection()

    Return False

    End If

    End Function

     

     

    Meu problema é que só retorna o erro de "Path is not valid. Check the diretory for the database [ Path = \Program Files\CRED\BaseDP.sdf] "

     

    A pasta CRED exite no diretório Program files.

    Tô usando VS 2008.

     

    Alguém pode me ajudar?

    terça-feira, 4 de novembro de 2008 23:32

Todas as Respostas

  • Nelson,

     

    Você escreveu data source junto, tenta assim:

     

    Code Snippet
    Dim MyEngine As New SqlServerCe.SqlCeEngine("data source=\Program Files\CRED\BaseDP.sdf")

     

     

     

    []s,

    quarta-feira, 5 de novembro de 2008 10:16
  • Carlos,

     

    Obrigado pela resposta mas ainda não é isso.

    O erro continua.

     

    quarta-feira, 5 de novembro de 2008 11:53
  • Nelson,

     

    Eu montei um exemplo baseado no seú código:

     

     

    Code Snippet

    Dim MyEngine As New SqlServerCe.SqlCeEngine("DATA SOURCE=\Program Files\CRED\BaseDP.sdf")

     

    MyEngine.CreateDatabase()

    MyEngine.Dispose()

     

    Dim Conexao As New SqlServerCe.SqlCeConnection("DATA SOURCE=\Program Files\CRED\BaseDP.sdf")

    Conexao.Open()

    MessageBox.Show("conexao aberta")
    Conexao.Close()

     

     

    Aqui funcionou prefeitamente, só tive que criar o diretório CRED dentro da pasta \Program Files

     

    []s,

     

    quarta-feira, 5 de novembro de 2008 12:11
  • Acho que tô esquecendo alguma coisa.

    Para fazer um teste aki eu criei em meu PC a pasta "C:\CRED\ " e mudei o path da conexão para lá.

    O banco foi criado nessa pasta, ou seja, o sistema está tentando criar o BD no meu desktop ao invés de fazê-lo no dispositivo.

    No dispositivo eu tenho a pasta "\Program Files\CRED\" mas, como deverei informar o path para que o banco seja criado lá?

    quarta-feira, 5 de novembro de 2008 12:15
  • Nelson,

     

    Aqui vo obtem o path da sua aplicação:

     

    String appStartPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
     
    Basta vc inserir o sdf no mesmo diretório.
     
    Ai vc concatena appStartPath + nome do arquivo sdf .
     
    Qqr coisa hurbem@hotmail.com
     
    abraço
     
     
    quarta-feira, 5 de novembro de 2008 12:42
  • Nelson,

     

    Você está executando a aplicação dentro do emulador ?

     

    []s,

    quarta-feira, 5 de novembro de 2008 13:01
  • Pessoal,

     

    As vezes a gente se esquece que os outros não conhecem o sistema em que trabalhamos.

    Peço desculpas por isso, vou dar mais explicações sobre o que pretendo, ok?

     

    Minha aplicação está rodando no Desktop com um BD SQL SERVER e suas tabelas, ok?

    Eu pretendo verificar NO DISPOSITIVO a existência de uma outra base de dados que, se não existir, aí sim criá-la. As tabelas que serão criadas no dispositivo conterão dados resgatados da base que se encontra no Desktop.

     

    Vou dar um exemplo prático:

    Determinado vendedor vem à empresa e sai com o veículo carregado de mercadorias. Num formulário que construí na aplicação do Desktop eu selecionaria o vendedor, e, ao clicar num botão, seriam resgatados da base no desktop todos os dados referentes às mercadorias que estão dentro do veículo. Uma vez resgatados esses dados, eu gostaria de colocá-los dentro do dispositivo. Se a base do dispositivo não existir criá-la, se existir apenas atualizar os dados.

     

    A aplicação que funciona no dispositivo eu fiz em outro projeto separado.

     

    MInha dor de cabeça está em criar e ou manter os dados da base do dispositivo na aplicação Desktop. Acho que agora dá pra vcs terem uma idéia do que pretendo....rsrsrs

    Dá forma que está, eu consegui criar o BD do dispositivo no Desktop, e, o usuário terá que enviá-la manualmente para a pasta destino no dispositivo. Eu gostaria de automatizar isso.

     

    quarta-feira, 5 de novembro de 2008 13:10
  • Nelson,

     

    Você pode fazer isto usando a RAPI, veja o link:

    http://www.pinvoke.net/default.aspx/rapi.CeCopyFile

     

    Basicamente você copia o arquivo do desktop para o pocket.

     

    E só complementando o link, para usar o comando CeCopyFile() ou qualquer outro da RAPI, você precisa executar:

     

    Code Snippet

    CeRapiInit(); // inicia a RAPI

    // comandos

    CeRapiUninit(); // finaliza a RAPI

     

     

    []s,

     

    quarta-feira, 5 de novembro de 2008 13:27
  • Tenho que referenciar alguma biblioteca?

     

    quarta-feira, 5 de novembro de 2008 13:42
  • Nelson,

     

    Olhe o exemplo do site:

     

    Code Snippet
    [DllImport("rapi.dll", CharSet=CharSet.Unicode)]
    public static extern int CeCopyFile(
        string lpFromPathName,
        string lpToPathName,
        bool bFailIfExists);

     

     

    Você precisa referenciar somente o System.Runtime.InteropServices, onde está o DLLImport. Esta API usa a DLL RAPI.DLL que fica no seu windows.

     

    []s,

     

    quarta-feira, 5 de novembro de 2008 13:53
  •  

    Dei  uma olhada no link que v me passou, vou gastar um tempinho estudando por lá.

     

    rsrsrs...o problema é que tô "penando" com o VB...o C# ainda não dá pra mim não...vai demorar um pouco.

     

    De qualquer forma obrigado a todos que responderam.

    quarta-feira, 5 de novembro de 2008 15:58
  • Fiz mais uma tentativa:

     

    Code Snippet

    Public Declare Function CeRapiInit Lib "C:\WINDOWS\system32\rapi.dll" () As Boolean

     

    Public Declare Function CeCopyFile Lib "C:\WINDOWS\system32\rapi.dll" (ByVal strOrg As String, ByVal strDest As String, ByVal boint As Boolean) As Integer

     

     

    Public Function CreateDataBase() As Boolean

    If Not IO.File.Exists(DBPath) Then

    Try

    'Cria o DB fisico

    Dim MyEngine As New SqlServerCe.SqlCeEngine("DATA SOURCE=" & DBPath)

    MyEngine.CreateDatabase()

    MyEngine.Dispose()

     

    'chamei a CeRapiInit na abertura do form, e, tentei copiar aqui

    'Não dá erro, mas também não copia

    CeCopyFile(DBPath, DBDest, False)

     

    OpenConnection()

    MsgBox("Banco de dados criado com sucesso.", , strSistema)

    Return True

    Catch ex As Exception

    MsgBox(ex.Message)

    Return False

    End Try

    Else

    OpenConnection()

    Return False

    End If

    End Function

     

     

    Não dá erro, mas também não acontece nada. Só cria o BD na origem, não copia para o dispositivo.

     

    quarta-feira, 5 de novembro de 2008 18:42