Newsgroup: it.comp.lang.visual-basic
Titolo: Vb.Net 2010 + postgresql .. primi passi

ho deciso di provare anche postgresql.
Mi sono documentato un po in rete per poter sviluppare e ho deciso di 
utilizzare il provider Npgsql per il framework 4 (ho fatto bene?).
Installo Postgresql nella versione 9.
Estedo le mie classi che uso per gestire i database e sovrascrivo i vari 
metodi per adattarli al nuovo arrivato.
Funziona tutto, creo il mio database popolo le tabelle etc etc.
Approfondisco di più, mi servono ovviamente indici e chiavi.
Primo scoglio un id ad incremento automatico non c'è, ma dopo tanto 
cercare scopro che bisogna creare una SEQUENCE e usare la funzione 
nextval nel DEFAULT del campo Id.
Bene faccio una prova su un db d'esempio creato con il programma di 
amministrazione e sembra funzionare.
Applico il tutto al mio gestionale, creo la SEQUENCE per l'id di una 
tabella, ma all'atto della creazione della tabella Articoli mi viene 
fuori l'errore che la sequence creata non esiste. Riporto uno stralcio 
delle query impiegate
 
CREATE SEQUENCE "contatoreIdArticoli"
   INCREMENT 1
   MINVALUE 1
   MAXVALUE 9223372036854775807
   START 1
   CACHE 1;
ALTER TABLE "contatoreIdArticoli" OWNER TO postgres;
 
 
CREATE TABLE "Articoli" (
"CodArticolo" character varying(50) NOT NULL DEFAULT ''::character 
varying,
"Descrizione" character varying(255) DEFAULT ''::character varying,
"ID" Int NOT NULL DEFAULT nextval('contatoreIdArticoli'::regclass))
WITH (
OIDS = False
);
ALTER TABLE "public"."Articoli" OWNER TO postgres;
 
viene fuori l'errore:
 
ERROR: relation "contatoreidarticoli" does not exist
 
Apro il programma di amministrazione e in sequenze vedo quella che ha 
creato la query precedente.
 
Dove sbaglio??

 Dove sbaglio??
Ora come ora non lo sò.....c'ho da fare....proabilmente non lo setti 
come indice
 
COMUNQUE
mysql e Access c'hanno AUTO-INCREMENT
 
l'SQL "scolastico" aborre codesta schifezza e vorrebbe una sequenza
 
 
POSTGRESQL proprio perchè è ganzo....
ti fa usare le sequenze se sei un insegnante o se vuoi rispettare lo 
standard
MA....se devi badare a "far ciccia"....e non te ne frega dello 
standard...
 
http://www.postgresql.org/docs/8.4/static/datatype-numeric.html
 
c'ha il tipo SERIAL che di fatto è un vecchio "Contatore" di Access!!!
(di fatto credo che la sequenza la crei lui per te!)
 
-- 
----- Italliaaaaa 3227! -----
Verace o finta, è da temersi sempre  pietà di plebe.
(Vittorio Alfieri)
 
 

Sembra che Wodka40° abbia detto :
si ho ragione
http://blog.2ndquadrant.it/it/2009/02/sequenze-in-postgresql-aggiorn.html
 
 
-- 
----- Italliaaaaa 3227! -----
Io sono Attila:
A come atrocità,
doppia T come terremoto e tragedia,
I come ira di dio,
L come laco ti sangue
e A come adesso vengo e ti sfascio le corna!
(Diego Abatantuono "Attila Flagello di Dio")
 
 

Mysql access sqlserver sqlce ce l'hanno.
Comunque scusa non vorrei sembrarti scortese, ho perfettamente capito 
come gestire l'incremento con le sequenze. SERIAL non fa ne più ne meno 
che creare una sequenza.
 
Ripeto il problema:
- creo la sequenza (vedi query precedente)
- creo la tabella (vedi query precedente)
compare l'errore.
 
se esegui le query su un tuo db ti funzionano?

 Mysql access sqlserver sqlce ce l'hanno.
 
....ti faccio un altra domanda...se al posto della tua sequenza...usi 
serial (e la fai creare a lui)...il sistema ti da ancora errore?
 
e poi...
 
CREATE SEQUENCE myID;
CREATE TABLE TUATAB(
....
 recid INTEGER PRIMARY KEY DEFAULT NEXTVAL('myID'),
 ...altri campi...
 );
 
hai provato a lanciare una cosa del genere....?
o non deve essere la primary key?(toglila)....se funziona tal 
quale....visto che hai capito....sai dove intervenire!
 
-- 
----- Italliaaaaa 3227! -----
Pasquà...Pasquale Zagaria...u'fighh'Riccard
[Vieni avanti cretino (1982)
c'ho pure il video! 
http://www.martek.it/public/dblog/banfi1.swf
 ]
 
 

Gli da fastidio il nome della sequenza chiusa fra virgolette!!

il bello è che da pgAdmin quando mi mostra la query di creazione del 
contatore lui le mette! per fortuna che è un db Ganzo.

 contatore lui le mette! per fortuna che è un db Ganzo.
 
Abbi pazienza eh....mi avanzavano 2 minuti....ANCHE IO SENZA 
POLEMICA...solo che prima di criticare è sempre meglio PROVARE!!!
 
Assunto che sicuramente saprai....scrivere in minuscolo per non avere 
casini!Trasforma da se spesso...ma per non aver casini...buona regola 
avere tutti i nomi in minuscolo!
 
Allora reinstallato pgAdmin....io uso navicat premium perchè uno mi 
basta per tutti da SQlite a mysql!
 
Comunque creata una sequenza ed una tabella. Guardato il codice SQL di 
pgAdmin....
 
Avviato VB.net (sono sul portatile ho 3.5....! Sorry!)
Imports Npgsql
....
 
 

 ....
ho una mini funzione connetti che si occupa lei di controllare s eil 
server è up e se è attivo e di stabilre una connessione e se 
cifrata....fa tutto lei...se va bene mi ritorna una connection!
 
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button4.Click
        Dim T As New System.Text.StringBuilder
 
        T.AppendLine("CREATE SEQUENCE miabastardasequenza ")
        T.AppendLine(" INCREMENT 1")
        T.AppendLine(" MINVALUE 1")
        T.AppendLine("MAXVALUE 1000000")
        T.AppendLine("START 1 ")
        T.AppendLine("CACHE 1")
        T.AppendLine("CYCLE;")
        T.AppendLine("ALTER TABLE miabastardasequenza")
        T.AppendLine("OWNER TO postgres;")
        T.AppendLine("")
        T.AppendLine("CREATE TABLE ""Test1""")
        T.AppendLine("(")
        T.AppendLine("piva character(11) NOT NULL,")
        T.AppendLine("id integer DEFAULT 
nextval('miabastardasequenza'::regclass),")
        T.AppendLine("CONSTRAINT ""Test_pkey2"" PRIMARY KEY (piva )")
        T.AppendLine(")")
        T.AppendLine("WITH (")
        T.AppendLine("OIDS = False")
        T.AppendLine(");")
        T.AppendLine("ALTER TABLE ""Test""")
        T.AppendLine("OWNER TO postgres;")
 
        'apri connessione
        Using Conn As Npgsql.NpgsqlConnection = PSQL.Connetti
            Using comando As New Npgsql.NpgsqlCommand
                With comando
                    .CommandText = T.ToString
                    .CommandType = CommandType.Text
                    .Connection = Conn
                    .ExecuteNonQuery()
                End With
            End Using
        End Using
 
    End Sub
 
il c# è superiore con la sintassi HEREDOC che sarebbe molto gradita in 
vb.net
!!!
Io ho lanciato la procedura!
M'ha creato la sequenza senza problemi e pure la tabella.....
Come vedi ho derogato da quanto detto sopra e messo la maiuscole...MA 
NON nella sequenza!
 
A me funziona tutto!...anche a prendere per buono quello che scrive 
pgAdmin!
Le virgolette sono la bestia nera di QUALSIASI query SQL....
 
eh si!
Postgresql è parecchio GANZO!
 
Salti! :')
 
 

         T.AppendLine("ALTER TABLE ""Test""")
zac
ovviamente m'e rimasto nel dito un 1 .... è Test1
         T.AppendLine("ALTER TABLE ""Test1""")
 
-- 
----- Italliaaaaa 3227! -----
Come ti senti oggi???
 
Giano Geminus Bifrons Bepop Flowers
http://youtu.be/Wk_gyLo0i-c
 
minuto 3:14
 
(Un uomo un mito: Luciano Lupoletti)
 
 

 Salti! :')
Macchè salti....Saluti!
 
-- 
----- Italliaaaaa 3227! -----
Soldato Joker, cosa ci fa il soldato Palla di Lardo con quel fucile in 
mano nel mio fottutissimo bagno?
 
Sergente Artman [ da: "Full Metal Jacket" ]
 
 

il codice è chiaro e sostanzialmente fai quello che faccio io.
Io non uso lo stringbuilder ma ho creato una stringa normale (dovrebbe 
solo migliorare la prestazione con il builder).
In alcune tabelle non ho problemi e crea sia il contatore che la tabelle.
In altre, come l'esempio del primo post, mi da l'errore.
L'unica cosa che ho modificato è stato togliere le virgolette dal nome 
della sequence ovvero invece di
CREATE SEQUENCE "contatoreIdArticoli";
ho messo
CREATE SEQUENCE contatoreIdArticoli;
e così ha funzionato.
E' così rognoso sto postgres?
Ma per tagliare la testa al toro, su tuo consiglio, ho usato il tipo 
SERIAL così crea lui le sequence.

 Salti! :')
 
 
a parte battutelle varie, la prima impressione è buona.
Mi sembra più ricco di MySQL e molto prestante...stiamo a vedere.
Certo che questi maledetti dialetti SQL!!
 

elmariachi scriveva e il server registrava il messaggio 457463

Allora....
ogni motoreDB ha le sue idiosincrasie....non ho molta esperienza ma c'è 
chi definisce Oracle un bagno di sangue!
 
Il problema di postgresql è che è un database abbastanza "formale" ma 
anche pratico!
Pratico...sembra dire "usa serial e non rompere i coglioni"
Formale...devo fare un lavoro compatibile con un CED di 
cervelloni...allora i nome sequenza devono uniformarsi allo standard 
dei nomi di SQL
 
LINK
http://www.postgresql.org/docs/9.0/static/functions-sequence.html
 
dove tra le tantissime cose interessanti
(cito)
...
Just write the sequence name enclosed in single quotes so that it looks 
like a literal constant. For compatibility with the handling of 
ordinary SQL names, the string will be converted to lower case unless 
it contains double quotes around the sequence name. Thus:
 
nextval('foo')      operates on sequence foo
nextval('FOO')      operates on sequence foo
nextval('"Foo"')    operates on sequence Foo
.....
 
 
quindi un consiglio (ovvio poi fai come ti pare)
contatoreIdArticoli
trasformalo in
contatoreidarticoli
purtroppo i danni che ha fatto microsoft con la sua insensibilità a 
molte cose standard nel resto del mondo....ha fatto danni nelle 
abitudini di noi programmatori!
Ciao
 
-- 
----- Italliaaaaa 3227! -----
Che giovano a quell'uomo ottant'anni passati senza far niente?... 
Costui non è vissuto, ma si è attardato nella vita; né è morto 
tardi,... ma ha impiegato molto tempo per morire!
 
Lucio Anneo Seneca
 
 

 elmariachi scriveva e il server registrava il messaggio 457463
zac
 
La bontà della cosa è che tollera un tipo virgoletta sbagliata perchè 
punta alla solita sequenza ...basta abituarsi a scrivere tutto in 
minuscolo!
 
-- 
----- Italliaaaaa 3227! -----
Quando vedi la tua verità fiorire sulle labbra del tuo nemico, devi 
gioire, perché questo è il segno della vittoria.
(Giorgio Almirante)
 
 

 il codice è chiaro e sostanzialmente fai quello che faccio io.
cmq....lo vedo ora....scusa è venerdi sono abbastanza cotto e do per 
scontate parecchie cose.....
perchè CREATE SEQUENCE "qualcosa"
perchè le virgolette??? Dove sta scritto di metterle? Nella mia query 
ci sono?
 
http://www.postgresql.org/docs/8.1/static/sql-createsequence.html
 
.....
Compatibility
 
CREATE SEQUENCE conforms to the SQL standard, with the following 
exceptions:
 
The standard's AS <data type> expression is not supported.
 
Obtaining the next value is done using the nextval() function instead 
of the standard's NEXT VALUE FOR expression.
 
...la famosa formalità di cui ti parlavo!
 
-- 
----- Italliaaaaa 3227! -----
Ho trovato una città di mattoni, ve la restituisco di marmo.
(Imperatore Augusto da Epistole)
 
 

le ho messe perchè ho seguito un esempio, tutto la..da qualcosa 
bisognerà pur cominciare.
E poi se crei una sequance in automatico con SERIAL se vai a vedere la 
query di generazione ci sono le virgolatte....almeno da me è così