Caricamento dati da file.txt a tabella SQLServer 2005 express

lunedì 20 ottobre 2008 - 16.55

Mau67 Profilo | Expert

Un saluto a tutto il forum, ho la necessita di aggiornare la tabella Banche del mio database in SQLServer 2005 express del mio programma sviluppato in Visual Studio 2005 prendendo i dati da un file.txt i record presenti nel file.txt sono circa 70.000.

La tabella BANCA ha i seguenti campi:

ABI
CAB
BANCA
AGENZIA
INDIRIZZO
CAP
CITTA'

e di conseguenza anche il file.txt ha gli stessi campi e i relativi rcord.

So che devo procedere in questo senso

Definire un Datareader per leggere il file
Definire un command ed i relativi parametri per sql update
Definire un command ed i relativi parametri per sql insert
Definire un command ed i relativi parametri per sql select (select count(*) where chiave...) per verificare se il record esiste già

Per ogni riga
Scrivo i parametri sul command select
Eseguo il select command
Risultato:
=0 eseguo insert command
=1 eseguo update command

Il problema è che non so come mettere insieme il tutto e quindi con una semplice pressione del button in un form mi compia l'operazione che mi serve.

Grazie in anticipo per l'aiuto


Mau67

alx_81 Profilo | Guru

>Un saluto a tutto il forum,
Ciao1

>ho la necessita di aggiornare la
>tabella Banche del mio database in SQLServer 2005 express del
>mio programma sviluppato in Visual Studio 2005 prendendo i dati
>da un file.txt i record presenti nel file.txt sono circa 70.000.
Hai mai pensato di utilizzare la bcp utility?

bcp utility
http://msdn.microsoft.com/en-us/library/ms162802.aspx

>La tabella BANCA ha i seguenti campi:

>ABI
>CAB
>BANCA
>AGENZIA
>INDIRIZZO
>CAP
>CITTA'
>
>e di conseguenza anche il file.txt ha gli stessi campi e i relativi rcord.
>
>So che devo procedere in questo senso
>
>Definire un Datareader per leggere il file
No, devi definire uno StreamReader, non un DataReader..

>Definire un command ed i relativi parametri per sql update
>Definire un command ed i relativi parametri per sql insert
>Definire un command ed i relativi parametri per sql select (select count(*) where chiave...) per verificare se il record esiste
Io farei una stored procedure che gestisca l'inseirmento incrementale fatta così:

- IF NOT EXISTS sulla chiave della tabella (SELECT * FROM Tabella WHERE campochiave = @parametrochiave)
- se non esiste il record, INSERT e ricavo l'id appena inserito per dare un'informativa all'utente (se necessario)
- se esiste il record, UPDATE

>Grazie in anticipo per l'aiuto
di nulla!
se mi posti la create della tabella ti provo a scrivere una stored procedure che fa tutto. Ma prima prova a seguire le mie indicazioni.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Mau67 Profilo | Expert

Ecco la create della tabella da aggiornare con i record presenti nel file AbiCab.txt:

USE [C:\DATABASE.MDF]
GO
/****** Object: Table [dbo].[Banca] Script Date: 10/21/2008 09:26:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Banca](
[Abi] [varchar](5) COLLATE Latin1_General_CI_AS NULL,
[IstitutoCredito] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Cab] [varchar](5) COLLATE Latin1_General_CI_AS NULL,
[Agenzia] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[IndirizzoIstituto] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[LuogoIstituto] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Cap] [varchar](5) COLLATE Latin1_General_CI_AS NULL,
[Prov] [varchar](5) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

Se i recorde delle banche sono già presenti nella tabella deve aggiornarli se non ci sono deve aggiungerli.

Ciao grazie
Mau67

alx_81 Profilo | Guru

A prescindere dal fatto che non hai proprio provato a scrivere la stored , questa tabella non ha chiave primaria?
Violi da subito le forme normali?
Oppure non l'hai scriptata?
La chiave è ABI e CAB? e sono informazioni presenti sul file?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Mau67 Profilo | Expert

La chiave è ABI e CAB, secondo te e meglio creare una chiave primaria?

Ciao Grazie
Mau67

alx_81 Profilo | Guru

>La chiave è ABI e CAB, secondo te e meglio creare una chiave primaria?
E' una delle prime cose "necessarie" poichè ti rende univoco il record, sia fisicamente, sia logicamente.
Se nella tua tabella cercassi di inserire più ABI e CAB identici con gli altri attributi diversi (o anche uguali) potrei. E non è corretto.

Eccoti la tabella:

CREATE TABLE dbo.Banca ( Abi varchar(5) NOT NULL , Cab varchar(5) NOT NULL , IstitutoCredito varchar(50) NULL , Agenzia varchar(50) NULL , IndirizzoIstituto varchar(50) NULL , LuogoIstituto varchar(50) NULL , Cap varchar(5) NULL , Prov varchar(5) NULL , CONSTRAINT PK_dboBanca PRIMARY KEY CLUSTERED ( Abi , Cab ) ON [PRIMARY] ) ON [PRIMARY] GO

Eccoti l'esempio di stored procedure:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Detto questo, mi soffermerei sulla tipizzazione dei campi e sulle eventuali tabelle aggiuntive rispetto a quella già definita..
Se la dbo.Banca è una tabella di appoggio, ok. Ma io ci vedo tante altre cose..
Ad esempio vedo altre tabelle da relazionare piuttosto che campi come IstitutoCredito o Agenzia. Vedo due tabelle e nella dbo.Banca solo l'id di relazione. Vedo na tabella delle province..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Mau67 Profilo | Expert

Grazie per la Stored, ma come faccio a prelevare i dati dal file di testo e fare in modo che la stored faccia il lavoro?
Grazie
Mau67

alx_81 Profilo | Guru

>Grazie per la Stored, ma come faccio a prelevare i dati dal file
>di testo e fare in modo che la stored faccia il lavoro?
devi scrivere un programmino (magari in C# ad esempio) che si connetta al file, legga riga per riga il file e, per ogni riga, lanci la stored procedure..
Il meglio qui sarebbe SSIS, ma con la express non riesci ad averlo (almeno gli strumenti di sviluppo, il runtime c'è).
Ma devi schedulare il processo o è una tantum?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Mau67 Profilo | Expert

Ogni volta che trovo l'aggioramento delle banche devo salvarle nella tabella ti chiedo troppo se mi costruisci un form di esempio in visual studio 2005 non in csharp in vb te ne sarei grato, e se ci sarebbe anche un progressbar per visualizzare i tempi di attesa sarebbe il massimo.

Grazie
Mau67

alx_81 Profilo | Guru

>Ogni volta che trovo l'aggioramento delle banche devo salvarle
>nella tabella ti chiedo troppo se mi costruisci un form di esempio
>in visual studio 2005 non in csharp in vb te ne sarei grato,
>e se ci sarebbe anche un progressbar per visualizzare i tempi
>di attesa sarebbe il massimo.
è una cosa molto pesante come risposta per un post..
però posso consigliarti di installare la versione 2008 EXPRESS, almeno hai il tool di Import Export e puoi salvare il processo schedulandolo con Windows..

http://www.microsoft.com/express/sql/download/
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Mau67 Profilo | Expert

Ho risolto, grazie

ho solo un problema se volessi interrompere l'eseguzione del caricamento dei dati con la stored che mi hao postato come faccio?

è come faccio a mandare in eseguzione una progressbar per visualizzare i tempi di attesa che ono molto lunghi?

grazie
Mau67

alx_81 Profilo | Guru

>ho solo un problema se volessi interrompere l'eseguzione del
>caricamento dei dati con la stored che mi hao postato come faccio?
Ma l'hai fatto con una windows form application?
>
>è come faccio a mandare in eseguzione una progressbar per visualizzare
>i tempi di attesa che ono molto lunghi?
http://www.vbdotnetheaven.com/UploadFile/mahesh/ProgressBar04262005051817AM/ProgressBar.aspx
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

Mau67 Profilo | Expert

si lo fatto con un windows form application in vs 2005 e non csharp

ciao grazie
Mau67

alx_81 Profilo | Guru

>si lo fatto con un windows form application in vs 2005 e non csharp
ricordati, se ritieni che ti sia stato di aiuto, di accettare la risposta così chiudiamo il thread.
Ciao!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5