Attualità e Information Technology

July 3, 2009

.NET e MySQL

Filed under: IT, .NET, SQL

Per utilizzare database MySQL in progetti .NET si deve installare il provider relativo. Sul sito MySQL vi sono i “Connector/Net”.

La versione più recente però, la 6.0.4, su Windows Server 2003 mi ha dato diversi problemi. Una volta non è riuscita semplicemente ad installarsi, un’altra non solo non si è installata ma ha anche sporcato il machine.config facendo saltare .NET.

Con la 5.2.6 non ho invece riscontrato problemi. O meglio, l’unico errore rilevato, un’eccezione con messaggio “reading from the stream has failed” non era dato dal connector ma da una non corretta configurazione del firewall.

Altra cosa che ho imparato “sul campo” è che in MySQL nella connection string si può utilizzare la parola chiave compress. Definendo nella connection string compress=true le operazioni di caricamento di dati in remoto si sono notevolmente velocizzate.

Riassumendo, nel progettino appena rilasciato che prevedeva di recuperare su un server remoto dati da un db MySQL, l’accoppiata migliore è stata usare il Connector/Net 5.2 e definire la connection string con compress=true.

AddThis Social Bookmark Button

March 23, 2009

Dynamic Search Conditions in T-SQL

Filed under: IT, SQL

Interessante articolo: Dynamic Search Conditions in T-SQL.

AddThis Social Bookmark Button

January 13, 2009

SSRS - Importi

Filed under: IT, .NET, SQL

In Microsoft SQL Server Reporting Services, quando bisogna visualizzare degli importi si ha a disposizione la funzione FormatCurrency che permette di specificare che il campo che si sta tirando su deve essere considerato un valore monetario. Bisogna poi ricordarsi di settare la lingua del report, altrimenti usando quella di default userà le impostazione del server su cui è installato.

AddThis Social Bookmark Button

May 6, 2008

sp_MSforeachtable - aggiungere colonna a tutte le tabelle

Filed under: IT, SQL

Mi annoto una query che mi capita di lanciare diverse volte per aggiungere una colonna con la data di inserimento del record a tutte le tabelle

exec sp_MSforeachtable ‘ALTER TABLE ? ADD dataInserimentoRecord smalldatetime NULL DEFAULT getdate()’

Per maggiori dettagli sull’uso di sp_MSforeachtable si veda il mio vecchio post sp_msforeachtable e sp_msforeachdb

AddThis Social Bookmark Button

April 16, 2008

SSRS 2005 su IIS 7

Filed under: IT, .NET, SQL, Vista

Per installare SQL Server Reporting Service 2005 su Windows Vista (Business o superiore) è necessario abilitare alcuni pacchetti di IIS.

Per sapere quali esiste relativa documentazione sul sito TechNet di Microsoft: Procedura: Installazione di Reporting Services a 32 bit in Windows Vista

AddThis Social Bookmark Button

April 13, 2008

Impostare il FILLFACTOR di default

Filed under: IT, SQL

Via T-SQL il comando per impostare il valore di default del fillfactor a livello server è:

sp_configure ’show advanced options’, 1
GO
RECONFIGURE
GO
sp_configure ‘fill factor’, 90
GO
RECONFIGURE
GO

AddThis Social Bookmark Button

November 26, 2007

Applicazioni scalabili

Filed under: IT, .NET, SQL

Lettura consigliata mattutina: Missione Compiuta (riflessioni sulle applicazioni).

Davide Mauri enfatizza come sia importante fin d’ora scrivere applicazioni scalabili e che in presenza di più processori sappiano sfruttarli tutti e non mandare a palla solo uno.

Davide si sofferma ovviamente sui database ricordando che sql server può fare parte del lavoro al posto nostro ma quando si scrive codice per sql bisogna sfruttare le sue caratteristiche e non scrivere codice come fossimo in una windows application e usassimo c#. Detto più chiaramente: in sql lavorare su insiemi e non per singola tupla.

Già che siamo in argomento segnalo un articolo sulla TPL (Task Parallel Library) che dovrebbe aiutarci a scrivere programmi paralleli in maniera più semplice: Come ottimizzare il codice gestito per computer multicore.

Technorati tags , , , ,

AddThis Social Bookmark Button

November 20, 2007

Confronto DB

Filed under: IT, SQL

Bell’articolo: Comparison of different SQL implementations.

Technorati tags , , , ,

AddThis Social Bookmark Button

November 18, 2007

ActiveRecord

Filed under: IT, .NET, SQL

Pensiero serale: ActiveRecord non mi entusiasma, preferisco NHibernate “liscio” se mi devo affidare ad un ORM.

Spiego brevemente. ActiveRecord lavora sopra NHibernate ma enfatizza l’uso degli attributi nelle nostre classi al posto dei file xml di mapping.

Precisato che anche con NHibernate si possono usare gli attributi invece che generare i file, è una cosa che non mi piace per niente. Ergo non mi piace ActiveRecord e non mi piace NHibernate usato così.

Il perchè è semplice e riassumibile con un “sporca il domain model”.

Oltre a questo possiamo ricordare che per la sua natura AR è più povero di NH, quindi se devo valutare di usare un ORM preferisco usare uno strumento più potente e che mi lascia la strada aperta anche per il futuro (quando l’applicativo si complicherà sicuramente).

Technorati tags , , , ,

AddThis Social Bookmark Button

October 4, 2007

SQL 2005 - Error handling

Filed under: IT, SQL

Parliamo di SQL 2005 e del costrutto TRY-CATCH.

Dentro al CATCH ha senso capire quale errore si è verificato. Per questo scopo esistono alcune funzioni, che elenco di seguito:

  • ERROR_NUMBER()
  • ERROR_SEVERITY()
  • ERROR_STATE()
  • ERROR_LINE()
  • ERROR_PROCEDURE()
  • ERROR_MESSAGE()

Io in genere uso sempre ERROR_MESSAGE() e ERROR_PROCEDURE().

Lo scrivo nella speranza che prima o poi anche un mio collega inizi a usarle…

Technorati tags , , , ,

AddThis Social Bookmark Button

September 9, 2007

Float vs Decimal

Filed under: IT, SQL

In ufficio mi trovo nella pessima situazione di dover portare avanti un software mastodontico sviluppato da non informatici, o meglio da gente che ha imparato a programmare in .NET direttamente sviluppandolo e non provenienti da un’università o comunque più in generale da esperienze informatiche. Si può quindi immaginare quali tipi di obrobri si possano vedere. Da thread usati per serializzare invece che parallelizzare, connessioni ai database semplicemente folli, procedure che girano per gorni dando poi magari anche risultati errati, etc.

In confronto a tutto questo marasma quello che ho dovuto sistemare l’altro giorno in realtà è una banalità, ma mi ha dato lo spunto per questo post. Riguarda il problema dei float in SQL.

Spiego: i tipi float, come anche i real, sono tipi di dato che rientrano nei “Approximate Numerics”, cioè non tutti i valori compresi nel range accettato dai float può essere correttamente rappresentato. Ergo se li stiamo usando per fare conti abbastanza precisi è naturale che possano venir fuori dati non precisi. Ecco perchè è meglio usare i decimal, che invece rientrano tra gli “Exact Numerics”.

Per dettagli: Data Types (Transact-SQL)

Technorati tags , , ,

AddThis Social Bookmark Button

September 1, 2007

SQL e funzioni sulle date

Filed under: IT, SQL

Un po’ di tempo fa avevo trovato un bel post, sul sempre interessante blog di Jeff Smith su sqlteam, riguardante le funzioni “essenziali” per maneggiare i tipi DateTime in attesa di SQL 2008 e dei nuovi tipi Date e Time. Visto che da allora me le porto sempre dietro su ogni database, riporto lo script di generazione delle stesse.

/****** Object: UserDefinedFunction [dbo].[UF_Date] Script Date: 09/01/2007 19:29:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[UF_Date](@Year int, @Month int, @Day int)
— returns a datetime value for the specified year, month and day
returns datetime
as
begin
return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
end
GO

/****** Object: UserDefinedFunction [dbo].[UF_DateOnly] Script Date: 09/01/2007 19:29:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[UF_DateOnly](@DateTime DateTime)
— Returns @DateTime at midnight; i.e., it removes the time portion of a DateTime value.
returns datetime
as
begin
return dateadd(dd,0, datediff(dd,0,@DateTime))
end
GO

/****** Object: UserDefinedFunction [dbo].[UF_DateTime] Script Date: 09/01/2007 19:29:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[UF_DateTime](@Year int, @Month int, @Day int, @Hour int, @Minute int, @Second int)
— returns a dateTime value for the date and time specified.
returns datetime
as
begin
return dbo.Date(@Year,@Month,@Day) + dbo.Time(@Hour, @Minute,@Second)
end
GO

/****** Object: UserDefinedFunction [dbo].[UF_Time] Script Date: 09/01/2007 19:29:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[UF_Time](@Hour int, @Minute int, @Second int)
— Returns a datetime value for the specified time at the “base” date (1/1/1900)
returns datetime
as
begin
return dateadd(ss,(@Hour*3600)+(@Minute*60)+@Second,0)
end
GO

/****** Object: UserDefinedFunction [dbo].[UF_TimeOnly] Script Date: 09/01/2007 19:29:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[UF_TimeOnly](@DateTime DateTime)
— returns only the time portion of a DateTime, at the “base” date (1/1/1900)
returns datetime
as
begin
return @DateTime - dbo.DateOnly(@DateTime)
end
GO

Fonte: Essential SQL Server Date, Time and DateTime Functions

Technorati tags , , , ,

AddThis Social Bookmark Button

August 16, 2007

T-SQL - OBJECTPROPERTY e tabelle senza chiavi

Filed under: IT, SQL

Avevo letto su qualche blog, ma ora non ricordo. Comunque per avere velocemente un elenco di tabelle di un dato database che sono prive di chiave primaria, basta sfruttare la funzione OBJECTPROPERTY(id, property). Per dettagli rimando alla guida on-line: OBJECTPROPERTY (Transact-SQL).

Tra le property che si possono specificare, infatti, è presente anche TableHasPrimaryKey, che svolge per l’appunto il compito che ci serve.

La banale query risulta quindi essere una cosa del tipo:

SELECT name AS tableName
FROM sys.tables
WHERE OBJECTPROPERTY(object_id, ‘TableHasPrimaryKey’) = 0
ORDER BY tableName

Cambiando la property ad esempio in TableHasIdentity ecco che potremmo avere l’elenco delle tabelle che hanno per l’appunto un campo identity:

SELECT name AS tableName
FROM sys.tables
WHERE OBJECTPROPERTY(object_id, ‘TableHasIdentity’) = 1
ORDER BY tableName

Ovviamente qualora volessimo usare una property che non fa riferimento ad una tabella ma altresì a qualche altro elemento del database dovremmo cambiare il FROM e puntare sulla tabella di sistema più adatta ai nostri scopi.

Technorati tags , , , , ,

AddThis Social Bookmark Button

August 7, 2007

Default recovery model in SQL Server

Filed under: IT, SQL

Visto che poco prima di pranzo ne abbiamo parlato in ufficio e a nessuno era venuto in mente, posto qui, a futura memoria, la soluzione più semplice ad un banale quesito: come cambiare l’impostazione di default del recovery model per i database su SQL Server.

Di default infatti il recovery model è impostato su full, ma in un ambiente di sviluppo va benissimo settato a simple.

Per farlo, come dicevo, il metodo più veloce e semplice che mi è venuto in mente è cambiare tale opzione nel database di sistema Model, visto che quando creiamo un database questo ne eredita le impostazioni.

Technorati tags , , , , ,

AddThis Social Bookmark Button

August 6, 2007

SQL Server e gli insert multipli

Filed under: IT, SQL

Segnalo una interessante novità del nuovo SQL Server 2008 che uscirà il prossimo anno: la possibilità di fare più insert con una sola istruzione.

Esempio che dice più di mille parole:

INSERT INTO tab (campoA, campoB, campoC)
VALUES (<val1>, <val2>, <val3>),
(<val4>, <val5>, <val6>),
(<val7>, <val8>, <val9>)

Per inciso, non vorrei sbagliarmi, ma mi pare che questa sintassi sia già supportata da MySQL, che come in diverse circostanze (vedi caso LIMIT per il paging lato server) si dimostra più comodo nella sintassi.

In realtà una cosa simile si può fare anche con l’attuale versione di SQL Server, basta sfruttare UNION ALL.

Anche in questo caso un esempio veloce:

INSERT INTO tab (campoA, campoB, campoC)
SELECT <val1>, <val2>, <val3>
UNION ALL
SELECT <val4>, <val5>, <val6>
UNION ALL
SELECT <val7>, <val8>, <val9>

Anche qui parlo senza aver fatto molti test, ma almeno a naso dovrebbe essere più performante, portato ovviamente su grandi dimensioni, che non fare tante singole insert.

Precisazione utile. Differenza tra UNION e UNION ALL: la prima elimina i doppioni (in pratica fa una distinct), la seconda no.

Technorati tags , , ,

AddThis Social Bookmark Button

Get free blog up and running in minutes with Blogsome | Theme designs available here