Programma che installa il suo database

domenica 12 novembre 2006 - 20.44

Shadow Profilo | Junior Member

Dopo una breve pausa per motivi di studio,
da alcuni giorni eccomi tornato! Vi pongo un importante quesito per me ancora aperto, al quale non sono riuscito a trovare soluzione:

Ho una semplicissima applicazione rubrica telefonica in C# 2005 con database Sql Server 2005 Express. Ho creato correttamente uno script sql che se eseguito genera l'intero database; ora devo creare il progetto di installazione per l'intera applicazione (intera.. Capirai! E' piccolissima..) e vorrei fare in modo di includere ovviamente lo script di creazione database, per fare in modo che venga eseguito all'installazione del programma e che crei, se non esiste, il database.

Qual'è il modo giusto di procedere? Grazie!


Shadow

stellaga Profilo | Newbie

Ciao stò lavorando a qualcosa del genere. Stò procedendo creando, sempre in .Net, un programma che, tramite lo scipt sql, generi il database. Se funziona tutto bene ti faccio sapere.
Ciao
Gaetano Stella

Shadow Profilo | Junior Member

Gaetano sei stato molto gentile, tienimi informato! E' una vita che non vengo fuori da questo problema, mi sembra impossibile! Fare semplicemente in modo che all'installazione della propria win app C# 2005 venga eseguito uno script di creazione database... E' così difficile o sono io che ho scarsa esperienza? :-( Grazie di nuovo, aspetto notizie.
Shadow

lbenaglia Profilo | Guru

>E' una vita
>che non vengo fuori da questo problema, mi sembra impossibile!
>Fare semplicemente in modo che all'installazione della propria
>win app C# 2005 venga eseguito uno script di creazione database...

Shadow,

Ne abbiamo già discusso a lungo nel thread che hai aperto a luglio...
http://www.dotnethell.it/forum/messages.aspx?ThreadID=9412

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stellaga Profilo | Newbie

Shadow effettivamente come dice Lorenzo avevi avuto dei suggerimenti validi, comunque ti espongo quello che stò facendo:
1) Creazione file script sql con le istruzione per la generazione del database, lo puoi fare con SQL Server Management studio;
2) esportazione dei dati ( se ti interessa esportare anche i dati contenuti nelle tabelle) tramite l'utility da prompt dei comandi bcp,
la sintassi è bcp <nome tabella> out <nome file> -c -S .\<istanza sql server> -T
( esempio bcp agimm.dbo.citta out citta.dat -c -S .\sqlexpress -T)
3)importa come risorsa interna il file script per la creazione del db e utilizza il codice sottostante (consideralo come una traccia l'ho buttato giù senza starci a perdere molto tempo e rubacchiando del codice in giro, fonte MSDN "Embedding SQL Sever Express into Custom Application" che offre diversi metodi tra cui questo):

private string[] ParseStr(string str)
{
string[] commands;
commands = Regex.Split(str, "GO\r\n", RegexOptions.IgnoreCase);
return commands;
}

private void BuildDB(string str)
{
string strsql=@"Data Source=.\SQLEXPRESS;Integrated Security=True";
string[] strCommand;
strCommand = ParseStr(str);
SqlCommand cmd= new SqlCommand();

using (SqlConnection conn= new SqlConnection(strsql))
{
try
{
conn.Open();
cmd.Connection = conn;
foreach (string strcmd in strCommand)
{
if (strcmd.Length > 0)
{
cmd.CommandText = strcmd;
cmd.ExecuteNonQuery();
}
}
conn.Close();
}
catch (Exception err)
{
MessageBox.Show(err.Message);
};

}
}

private void insertDatiBulk()
{
string path=Application.StartupPath.ToString() + @"\resources\";
string str =@"bulk insert agimm.dbo.";
string str1=" from '";
string strsql=@"Data Source=.\SQLEXPRESS;Integrated Security=True";
string[] strCommand= new string[2];
strCommand[0]=@"citta";
strCommand[1]=@"catcomm";
SqlCommand cmd= new SqlCommand();
using (SqlConnection conn= new SqlConnection(strsql))
{
try
{
conn.Open();
cmd.Connection = conn;
foreach (string strcmd in strCommand)
{
cmd.CommandText =str + strcmd + str1 + path + strcmd + ".dat'";
cmd.ExecuteNonQuery();
}
conn.Close();
}
catch (Exception err)
{
MessageBox.Show(err.Message);
};
}
}

Questo codice lo puoi avviare tramite un processo che si attiva con l'installazione oppure, come ho fatto io, creando un applicativo a parte per la gestione del db
4)La procedura insertDatiBulk(), utilizzata per popolare il database, utilizza il comando transact-sql "insert bulk" la cui sintassi è insert bulk <database>.<owner>.<tabella> from <file>

Spero che quanto ti ho scritto ti sia di aiuto
Ciao

Gaetano Stella

Shadow Profilo | Junior Member

Caro Stellaga, caro LBenaglia,
grazie innanzitutto per il vostro grande aiuto. Quando 'sparisco' per un pò non è per diserzione dal mio Visual Studio (ci mancherebbe!!) ma perché gli impegni universitari mi costringono a giorni (e notti) nelle quali a volte mi scordo anche di pranzare. Eccomi tornato, dopo una prova inter corso davvero impegnativa.

Riprendiamo il discorso da dove lo avevamo lasciato. Benaglia, è vero, mi hai dato lunghissime e chiare risposte in un'altra discussione. Credevo di aver risolto tutto; la soluzione che ho postato nell'altra discussione riguardava l'utilizzo di Cyber Installer, col quale CREDEVO davvero di aver risolto tutto. In realtà testando il tutto su una nuova macchina mi sono accorto di non aver risolto nulla, e non (preciso!) per mancanze di Cyber Installer ma perché devo aver sbagliato qualcosa io in quanto il programma si installava benissimo ma nessun database veniva creato. Quindi ho ripreso i tuoi consigli là dove li avevo lasciati, e leggendo a fondo l'altra discussione mi sono soffermato su un tuo passaggio che è quello che sto seguendo ora:

_________________
LBenaglia wrote:
Guarda, non conosco le ultime diavolerie incluse in VS, ma io farei una cosa banalissima.
Ogni istanza di SQL Server 2005 include l'utility command line sqlcmd.exe che ti permette di interfacciarti ad essa. Come prima cosa preparerei lo script del db contenente gli oggetti, le login, gli user accounts, le permission, eventualmente dei dati tramite comandi INSERT, lo includerei nel setup ed aggiungerei una custom action al programma del setup che esegue tale script via sqlcmd.exe.
3 click ed il gioco è fatto
_________________

Premesso che, come da miei ultimi messaggi, sono riuscito (solo grazie ai tuoi consigli) a creare un perfetto file di creazione db contenente TUTTI gli oggetti, premesso che non ho problemi ad includerlo tra i file che il progetto di installazione dovrà creare, quindi anche l'inclusione nel setup è cosa fatta, tutto ciò premesso, come si aggiunge al programma di setup la custom action di cui parli? Come fare in modo che si esegua al primo avvio? (supponiamo il nome dello script NomeScript.sql). Gaetano, ho cercato di studiare un pò anche il tuo codice. Ti chiederei troppo se ti chiedessi di integrarlo con qualche riga di commento? Vedo alcune istruzioni mai usate prima.

Grazie infinitamente per il vostro insostituibile e soprattutto paziente aiuto, dite un pò mentre ero sommerso dai libri avete sentito la mia mancanza?

Shadow


Shadow
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5