Jump to content
bioshock

Aplicação com base de dados SQL

Recommended Posts

bioshock

Boas.

Nas aplicações que possuem bases de dados, nomeadamente SQL, como raio vocês "apanham" todos os utilizadores? Ou seja, há quem não possua o SQL instalado na máquina.

E a base de dados, vai na pasta da aplicação (como acontece com o Access) ou não?

:P

Share this post


Link to post
Share on other sites
M6

Há várias formas de aceder às bases de dados.

Por exemplo, se for uma aplicação J2EE a base de dados está registada no servidor aplicacional e a aplicação apenas tem de fazer referência ao identificador registado no servidor aplicacional para obter a ligação à base de dados.

Numa aplicação desktop a base de dados poderá estar local, e funcionar como parte da base da aplicação, como é o caso do Cloudscape/Debry para aplicação Java, como pode estar num servidor remoto ao qual a aplicação se liga, e essa credenciais tipicamente são guardadas num ficheiro de configuração da aplicação.


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."

 

Share this post


Link to post
Share on other sites
bioshock

Neste caso, tenho a base de dados registada no meu servidor SQL Express.

Dirijo-me à bd via:

Public SqlConnection As New SqlConnection("Server=pinho\SQLExpress;Database=BD;Trusted_Connection=True;")

Se colocar a BD na pasta bin\debug e mudar a string para se direccionar para a pasta, também funciona, mas apenas e só no meu pc (óbvio).

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    No código que mostras, parece-me que um dos problemas seja o attach da base de dados ao servidor SQL. A abordagem que eu uso nesta situação é criar um no directório da minha aplicação um directório chamado dados, e colocar lá os 2 ficheiros que compõem a base de dados SQL Server Express.

   

    No install da app defino que a app precisa de instalar o SQL Server Express, ou caso este esteja instalado segue. A questão do atach faço-a no codigo, como te deixo neste exemplo:

Server=.\SQLExpress;AttachDbFilename=%programfiles%\map\dados\minhabd.mdf;Database=minhabd; Trusted_Connection=Yes;

    A questão da connection string uma vez que lá contêm dados que variam de instalação para instalação do SQL Server, normalmente tenho-a num XML que pode ser editado para serem mudados os valores (Nome do servidor, etc...). Normalmente na própria aplicação coloco um Form que abre um componente editor para editar o app.config.xml de forma a que quem instala possa mudar o nome do servidor, a pass, e outros valores que sejam relevantes.

    (Esta solução pressupõe que se esteja a usar os providers de .net.)

    Esta é a minha abordagem habitual à questão. Não quer dizer que seja a melhor, nem que sirva para toda a gente e para todas as situações. Para já e nas situações mais comuns comigo tem servido. Cumpre o seu propósito.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
bioshock

O problema não é esse ou então estou a perceber mal. Eu até posso utilizar o seguinte código:

Server=.\SQLExpress;AttachDbFilename=|DataDirectory|BD.mdf; Database=BD;Trusted_Connection=Yes;

(O DataDirectory busca na pasta onde o projecto está instalado)

O problema é que se eu passar o projecto a outra pessoa, noutro computador, a aplicação não arranca, dá logo erro com a base de dados.

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Eu percebi a questão, provavelmente expliquei-me mal. My bad.

    A tua aplicação está ligada a um servidor Sql Server Express e a uma determinada base de dados. Quando instalas a aplicação no pc de outra pessoa, não chega ter o ficheiro da base de dados lá. Tens de fazer o attach antes ao SQL Server Express antes da aplicação poder ser utilizada.

    A isto acrescenta o facto de teres de criar um user no sqlserver da pessoa e uma password para poderes aceder à base de dados, e claro poder passar esses valores para a tua aplicação.

    Por partes, normalmente faço a aplicação e só me preocupo com o setup no fim. Não é propriamente correcto, mas é a minha maneira :P

    A app que o utilizador vai utilizar é uma app, quando ele instala instala também uma "mini-app" que vai no mesmo setup. A mini-appp não é mais do que uma simples app com dois forms. O form principal dela, e um form que usa um componente editor de texto para editar o app.config.xml (onde entre outras coisas estão guardados dados como nome do servidor SQL Server, Nome da BD, etc...) No menu principal ponho a opção "inicializar aplicação para ser utilizada" e no evento click coloco o código para o attach da bd. No configurar "o código que chama o form com o editor, e abre o ficheiro pronto para editar as variáveis (nome do servidor, base de dados, etc...). Quando instalo a minha aplicação, corro essa app para fazer o attach, editar o nome do servidor, etc...

    Normalmente uso sempre a mesma pass para aceder à base de dados, de forma a não ter de colocar a pass no app.config.xml. Adicionalmente a isto basta que crie um utilizador no servidor SQL Express da pessoa a quem vou fornecer a aplicação, e dou-lhe permissões para a base de dados que foi feito o attach na minha aplicação.

    Normalmente isto chega e sobra. Ganhei este "mau habito" com outras aplicações. Normalmente isto consta no manual de instruções de instalação da aplicação, para caso o utilizador tenha duvidas seja fácil "resolver o problema".

      Como disse anteriormente esta é a minha abordagem. Existem outras, a minha pode não ser a mais correcta, é a minha, funciona para mim.

    Caso me tenha explicado mal, posso tentar "esmiuçar" mais como faço as coisas, porque para mim isto é feito de forma quase automática na cabeça, por isso é difícil explicar bem aquilo que se faz em "modo auto-pilot".

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
M6

Para que a coisa corra como deve ser, o teu processo de setup tem de dar a volta a isso.

Ou o teu setup instala o engine da BD, se tal for permitido pelo licenciamento (não sei se é ou não), ou indicas (ou fazes de forma automática) os passos para a pessoa fazer download e instalar o engine da BD...

Outra forma, menos bonita, é teres como requisito a pré-instalação do engine da BD.

Da mesma forma que uma aplicação .Net requer a framework instalada, a tua aplicação pode requerer um engine SQL instalado, seja o Express ou o SQL Server...


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."

 

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Basicamente a questão do pré-requisito resolve-te a questão. Como mencionei no post onde apresentei a solução, o setup valida se existe ou não o SQL-Server Express instalado e se não estiver instalado ele instala. Segundo li e aproposito deste post fui efectivamente ler para também ficar a saber, uma vez que desde a versão 2K do SQL que não utilizo instalação automatica dele em nenhuma app minha, o seguinte comando execudado como administrador instala o SQL Express 2008

Setup.exe /q /ACTION=Install /SkipRules=VSShellInstalledRule RebootRequiredCheck /HIDECONSOLE /FEATURES=SQL /INSTANCENAME=xxx /SECURITYMODE="SQL" /SQLSVCACCOUNT="NT AUTHORITY\SYSTEM" /SAPWD="XXXXXXXXX" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /ENABLERANU=1 /AGTSVCACCOUNT="NT AUTHORITY\SYSTEM" /TCPENABLED=1 /ERRORREPORTING=1

    Irei ler com mais calma o manual, pois lá esta informação tem de constar e testar. Em teoria funcionará criando um user para a bd. A questão do attach continua a poder ser contornada na primeira execução da aplicação. Existem outras formas de o fazer, inclusive fazer o atach durante o setup recorrendo a scripts, mas teria de ler antes de te colocar aqui uma solução. Pesquisa sobre "command line attach" que de certeza encontras forma de automatizar o atach à BD.

    Penso que a tua questão deva ser mesmo se a pessoa tem o SQL Server Express instalado? Se for isto fica automaticamente resolvido, com a situação do pré-requisito.

    Não tenho a certeza, mas acho que a firewall do windows seven pelo menos abre as portas do SQL Express. Como disse não tenho a certeza.

      A questão da distribuição o @M6 já abordou a situação do licenciamento. Eu desde a versão 2000 do SQL Server que deixei de o utilizar nas minhas app's por isso não conheço a fundo as restrições de licenciamento.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
bioshock

Sinceramente pensei que fosse algo mais simples ou então, não tão complexo. Não quero tornar a aplicação 'comprida/pesada' nesse sentido, aí o access ganha algumas vantagens.

Uma outra opção seria um servidor online e aí nem se questionavam os problemas, presumo?

Share this post


Link to post
Share on other sites
M6

Profissionalmente o Access nunca tem vantagens sobre uma base de dados a sério.

Até porque o Access tem o mesmo problema das dependências, necessitas de o ter instalado no sistema e, por exemplo, eu não tenho em nenhuma das minhas máquinas...

Se essas dependências não forem resolvidas de forma simples e sem chatices para o utilizador então há uma grande barreira à entrada, em especial para utilizadores não técnicos. Até eu, sendo técnico, deixei de experimentar umas aplicações quando o .Net apareceu porque era necessário tê-lo instalado, simplesmente desisti de ver essas aplicações (até porque era apenas por curiosidade)...


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."

 

Share this post


Link to post
Share on other sites
ribeiro55

Existem soluções que não dependem de um server, como SQLLite.

Se a necessidade é apenas de armazenamento e consultas simples, sempre podes usar a minha QATDB, que vai sofrer um revamp em breve :P


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
apocsantos

Bom dia,

    Até à relativamente pouco tempo, existiam comercialmente algumas aplicações nomeadamente de gestão que usavam bd access. Na sua maioria sofria do mesmo mal, a bd corrompia com relativa facilidade, e quando era em ambientes de rede, os problemas eram ainda mais frequentes. Entretanto até essas aplicações passaram a usar SQL Server, (MS Dabatase Engine inicialmente e mais tarde o SQL Server Express).

    No teu caso, e não sei até que ponto se aplica, o ideal seria usar um motor de bd "embeded" tipo o SQL Server Compact 3.5, o Embedded Firebird, etc... Assim podes fazer tudo de forma automática.

    Eu utilizo uma o Embedded Firebird, nalgumas aplicações, e até à data não tenho queixa. Não tem o desempenho de uma base de dados "a sério", mas sempre é mais robusto que o access, e claro evita a questão das dificuldades de instalação.

    Eu como uso .net não me tenho chateado com a plataforma .net e continuo a testar as aplicações feitas para .net. Ainda assim preferia de longe não ter tantos "pré-requisitos", para instalar aplicações.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
bioshock

Profissionalmente o Access nunca tem vantagens sobre uma base de dados a sério.

Até porque o Access tem o mesmo problema das dependências, necessitas de o ter instalado no sistema e, por exemplo, eu não tenho em nenhuma das minhas máquinas...

Sim, mas nesse caso também se podia fazer como o apocsantos referiu para o SQL, ou seja, no setup haver uma localização para a instalação..etc, etc.

Existem soluções que não dependem de um server, como SQLLite.

Se a necessidade é apenas de armazenamento e consultas simples, sempre podes usar a minha QATDB, que vai sofrer um revamp em breve :)

O que entendes por 'consultas complexas' ?

Já tinha ouvido e lido sobre o SQL Lite, mas nunca prestei muita atenção, confesso. Com ele não é preciso ter a máquina SQL instalada?

Bom dia,

    Até à relativamente pouco tempo, existiam comercialmente algumas aplicações nomeadamente de gestão que usavam bd access. Na sua maioria sofria do mesmo mal, a bd corrompia com relativa facilidade, e quando era em ambientes de rede, os problemas eram ainda mais frequentes. Entretanto até essas aplicações passaram a usar SQL Server, (MS Dabatase Engine inicialmente e mais tarde o SQL Server Express).

Totalmente verdade, falo por experiência própria, mas dei o Access como um exemplo.

Eu utilizo uma o Embedded Firebird, nalgumas aplicações, e até à data não tenho queixa. Não tem o desempenho de uma base de dados "a sério", mas sempre é mais robusto que o access, e claro evita a questão das dificuldades de instalação.

Não conheço essa bd. As variáveis são idênticas às que utilizamos nas nossas aplicações para o SQL?

Que problema tem o desempenho? Se houver muita informação acumulada, vai ser criado um delay de processamento com o tempo?

Share this post


Link to post
Share on other sites
bioshock

Bem, já estive a ler em relação ao SQL Lite, parece-me simples e porreiro, mas têm um problema. Se houverem consultas por datas, como é feito? Visto que o SQL Lite apenas têm 4 tipos de dados: Integer, Text, Blob e Real.

Pode-se fazer via Text, mas é fugir um bocado à regra..:)

Share this post


Link to post
Share on other sites
ribeiro55
O que entendes por 'consultas complexas' ?

Consultas com sub-consultas, JOINS, etc...

Podias dar a volta à limitação da QATDB com lógica na aplicação, mas não faz muito sentido.

Já tinha ouvido e lido sobre o SQL Lite, mas nunca prestei muita atenção, confesso. Com ele não é preciso ter a máquina SQL instalada?

Sinceramente não experimentei, mas pelo que percebi não: basta levar as bibliotecas junto do executável (não tenho a certeza disto)


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
apocsantos

    Boa tarde,

    O Embedded Firebird tem limitações em termos de segurança. Essa é a maior limitação dele. Fora isso, não é feito para "ser um servidor de base de dados em rede", ou seja não suporta network connections, mas tem todas as funcionalidades de um "verdadeiro" servidor SQL. Existe um "workarround", mas nunca o vi ser preciso, pois sempre que é necessário usar em "multi-posto" basta instalar o Firebird Superclassic e mudar o ficheiro da bd de sitio. Sem attach sem complicações. É "super leve", em termos de recursos de sistema, e funciona super bem. :)

    Existe um exemplo muito bom no codeproject, que exemplifica a utilização do embedded firebird em .net e a migração de embedded para Superclassic, que como te disse é "trivial", e pode ser feita de forma totalmente automatica.

Aqui fica o link http://www.codeproject.com/KB/database/EmbeddedFirebird.aspx

    Em termos de licença, é flexível o suficiente, para permitir a distribuição sem chatices. Em termos de trabalho, tem tudo o que tem o SQL Server, só que é gratuito e com uma licença "relativamente aberta" a Interbase Public License.

    Para teres uma ideia, existem aplicações comerciais largamente difundidas a usar Firebird, algumas delas começando com o embedded quando é mono-posto e passando para o superclassic quando o cliente quer instalar multi-posto.

    Nunca me virei para o SQLite porque achei que lhe falta "qualquer coisa". O Firebird para mim foi "natural", o MSDE era chato e complicado para os utilizadores instalarem sem suporte tecnico, o firebird resolveu essa treta com meia dúzia de "next, next, netx, ... ok".

      Quando apareceu a versão embedded até esses "next..." desapareceram. Correm o setup e a app está pronta a funcionar. Querem instalar a versão de rede, correm o setup feito para esse efeito, e siga. (Sem complicações), que é o mais importante. Os utilizadores na sua maioria sabe fazer o famoso "next, next, next" nem lê o que está a fazer, quer é o programa a trabalhar depressa, sem chatices, e sem estar com muito esforço.

    Espero ter ajudado.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
bioshock

Consultas com sub-consultas, JOINS, etc...

Podias dar a volta à limitação da QATDB com lógica na aplicação, mas não faz muito sentido.Sinceramente não experimentei, mas pelo que percebi não: basta levar as bibliotecas junto do executável (não tenho a certeza disto)

JOINS e afins é o que mais faço na grande parte das aplicações de gestão que vou desenvolvendo, portanto preciso de algo que suporte isso. Estive a testar o SQLite na minha hora de almoço e pelo que me parece é totalmente idêntico ao SQL »

SQL:

Dim conn As New SqlConnection(String)

SQLite:

Dim conn As New SqliteConnection(String)

etc...

Trás também um Database browser onde podes monitorizar as tuas bases de dados, de resto só tens que adicionar a dll à aplicação.

Só obtive um pequeno (grande) problema. Eu segui-me por um tutorial postado no Macoratti, fiz os passinhos todos, consegui-me connectar com sucesso à base de dados, mas na altura de fazer uma query de selecção ele dizia e continua a dizer-me que a tabela não existe, já verifiquei 20 vezes os nomes e afins e até agora nada. 🤔

    Boa tarde,

    O Embedded Firebird tem limitações em termos de segurança. Essa é a maior limitação dele. Fora isso, não é feito para "ser um servidor de base de dados em rede", ou seja não suporta network connections, mas tem todas as funcionalidades de um "verdadeiro" servidor SQL. Existe um "workarround", mas nunca o vi ser preciso, pois sempre que é necessário usar em "multi-posto" basta instalar o Firebird Superclassic e mudar o ficheiro da bd de sitio. Sem attach sem complicações. É "super leve", em termos de recursos de sistema, e funciona super bem. :)

A aplicação que estou a desenvolver não precisa de utilização de base de dados em rede e pelo menos para já, não planeio nada onde envolva tal coisa. Mas no entanto isso que me acabaste de dizer não deixa de ser uma boa fonte de informação para futuras aplicações.

Que limitações é que possui a nível da segurança? Não preciso de nada muito complexo.

    Em termos de licença, é flexível o suficiente, para permitir a distribuição sem chatices. Em termos de trabalho, tem tudo o que tem o SQL Server, só que é gratuito e com uma licença "relativamente aberta" a Interbase Public License.

    Para teres uma ideia, existem aplicações comerciais largamente difundidas a usar Firebird, algumas delas começando com o embedded quando é mono-posto e passando para o superclassic quando o cliente quer instalar multi-posto.

Sim, pretendo algo totalmente free, não preciso de source code como o SQLite disponibiliza.

    Nunca me virei para o SQLite porque achei que lhe falta "qualquer coisa".

Uma das coisas que estranhei no Database browser do SQLite foi a "suposta" (digo suposta porque não sei se realmente resulta) adição de tipo de dados. Ou seja, o SQLite, quando crias um campo, dá-te a escolher: Integer, Text, Blob e Real...mas tem lá uma opção para adicionar outro tipo de dados..se eu adicionar "Joaquim" ele introduz 🤔 :)

Edit: Afinal a treta da base de dados, temos que ir ao ficheiro criado pelo SQLite e adicionar-lhe a extensão .db3

Portanto, o ficheiro criado é algo do género: "Serviços.db" e temos de alterar para: "Serviços.db3". :wallbash:

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    O Macoratti tem alguns exemplos interessantes de Embedded Firebird. Aqui fica o link para o artigo original: http://www.macoratti.net/vbn5_amf.htm

    As falhas de segurança são basicamente a velha questão da "master password" em que o user name é "SYSDBA" e a password é "masterkey". Tirando isso é bastante segura e bastante robusta.

    Existem bastantes aplicações gratuitas porreiras para se trabalhar com o Firebird. Eu normalmente uso o Flamerobin, que além de ser free, é "super leve", em termos de recursos de sistema, deixa-me fazer o que quero e não me chateia mínimo. Desde simples Querys a colocar triggers na bd, com o flamerobin faço o que preciso de fazer sem estar com grande trabalho. Existem outras ferramentas muito boas, eu gosto desta! (gostos não se discutem) :)

    Em termos de programação, é praticamente tudo igual ao que fazes para trabalhar com outras bases de dados como SQL Server, SQLite, qualquer uma delas.

    De resto não existe muito a acrescentar. Se colocares as dll dela no projecto como "included", quando instalar, instala tudo, funciona logo. A não ser que a app vá guardar "algum segredo de estado", o embedded firebird dá conta do recado.

Cordiais cumprimentos,

Apocsantos

     

   


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
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

×
×
  • 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.