Bulk Insert ed Aruba

venerdì 28 dicembre 2007 - 10.43

gae58 Profilo | Senior Member

salve, come già accennato precedentemente, ho la necessità di inviare un file csv sul sito e farlo leggere da una stored procedure per alimentare una tabella del database, la stored procedure verrà richiamata da un bottone di una pagina aspx o in automatico ad una determinata ora se possibile.

Quando ho creato la stored procedure su aruba, mi ritorna l'errore che Bul Insert non è possibile usarlo per motivi di sicurezza.

Ho chiesto alternative, ma sino ad oggi nessuna risposta.

Qualcuno mi sa dire se c'è un altro tipo di soluzione?

grazie


Gaetano

alx_81 Profilo | Guru

>salve,
Ciao!

>come già accennato precedentemente, ho la necessità di
>inviare un file csv sul sito e farlo leggere da una stored procedure
>per alimentare una tabella del database, la stored procedure
>verrà richiamata da un bottone di una pagina aspx o in automatico
>ad una determinata ora se possibile.
>
>Quando ho creato la stored procedure su aruba, mi ritorna l'errore
>che Bul Insert non è possibile usarlo per motivi di sicurezza.
>
>Ho chiesto alternative, ma sino ad oggi nessuna risposta.
Un'alternativa c'è.. Fare l'upload del file ed, al termine del caricamento, usare il framework ed il namespace System.IO per leggere il csv, ricavarne i "campi" e inserire tramite semplici stored procedure di insert sul db tramite il namespace System.Data.
Un po' macchinoso, ma se non ti fanno fare DTS e/o bulk insert.. puoi usare questo metodo .

>grazie
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

gae58 Profilo | Senior Member

ti ringrazio per la risposta, ma in questa situazione ho un altro problema.
Il csv contiene una colonna col progressivo che forzavo attraverso un'opzione del bulk insert, in modo da mantenere lo stesso del file da cui ricavo il csv.

Tu sai se si può effettuare la stessa forzatura attraverso la soluzione che mi hai consigliato?

grazie


Gaetano

alx_81 Profilo | Guru

>Il csv contiene una colonna col progressivo che forzavo attraverso
>un'opzione del bulk insert, in modo da mantenere lo stesso del
>file da cui ricavo il csv.
Questo significa che sul CSV hai il progressivo che DEVI forzare nella tabella di destinazione che altrimenti avrebbe una colonna identity?
Se è così il problema non è portare la logica del bulk nella nuova soluzione ma è dire alla tabella di destinazione che deve accettare il progressivo. In quel caso, l'importazione per come te l'ho passata, non cambia. E' la tabella che deve consentire la "forzatura" dell'inserimento di una colonna altrimenti readonly.
Ho capito bene? Magari prova ad illustrarmi bene il problema, in maniera più approfondita..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

gae58 Profilo | Senior Member

>>Il csv contiene una colonna col progressivo che forzavo attraverso
>>un'opzione del bulk insert, in modo da mantenere lo stesso del
>>file da cui ricavo il csv.
>Ho capito bene?

Perfetto, è proprio quello che intendevo.

La tabella sql ha un campo Progressivo di tipo Identity.
La tabella csv, nella Prima colonna ha il valore Progressivo.
I due valori devono corrispondre e, quindi, nella tabella sql, devo forzare il valore del csv.

Tieni presente che in bulk insert, attraverso l'opzione KEEPIDENTITY, ho la possibilità di forzare il valore ed in +, mi valorizza il progressivo con l'ultimo valore + alto.

C'è qualche opzione del genere volendolo farew manualmente?

grazie


Gaetano

alx_81 Profilo | Guru

>Perfetto, è proprio quello che intendevo.
>
>La tabella sql ha un campo Progressivo di tipo Identity.
>La tabella csv, nella Prima colonna ha il valore Progressivo.
>I due valori devono corrispondre e, quindi, nella tabella sql,
>devo forzare il valore del csv.
>
>Tieni presente che in bulk insert, attraverso l'opzione KEEPIDENTITY,
>ho la possibilità di forzare il valore ed in +, mi valorizza
>il progressivo con l'ultimo valore + alto.
>C'è qualche opzione del genere volendolo farew manualmente?

c'è la SET IDENTITY INSERT, quindi devi scrivere una stored procedure di inserimento in cui, come prima cosa, prima dell'inserimento metti a ON questo flag.

Eccoti la guida sui Books on line:
http://technet.microsoft.com/it-it/library/ms188059.aspx

>grazie
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

gae58 Profilo | Senior Member

ciao,

scusa se riprendo il thread, ma alla fine ho fatto come mi hai indicato, leggo la riga del file csv e attraverso lo split li separo per campi.
Tutto il codice ce l'ho nel codbehind (si dice così?) della pagina asp.

A questo punto volevo spstare un po' di codice in una stored procedure, come da te consigliatomi.

Per richiamare la SP, ho provato con questa istruzione, ma non mi funziona:
EXEC StPr.

Ma sicuramente, la sintassi non è giusta perchè mi restituisce errore.

ciao
Gaetano

alx_81 Profilo | Guru

>ciao,
>
>scusa se riprendo il thread, ma alla fine ho fatto come mi hai
>indicato, leggo la riga del file csv e attraverso lo split li
>separo per campi.
>Tutto il codice ce l'ho nel codbehind (si dice così?) della pagina
>asp.
Sì si dice così
>
ma da dove la devi eseguire? da codice .net?
Alx81 =)

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

gae58 Profilo | Senior Member

si da una pagina .aspx.cs
Gaetano

alx_81 Profilo | Guru

>si da una pagina .aspx.cs
Eccoti il codice per lanciare una stored procedure che non torna nulla:

using (SqlConnection sqlConn = new SqlConnection("tuaconnectionstring")) { // apro la connessione sqlConn.Open(); using(SqlCommand sqlCmd = new SqlCommand("nomesp",sqlConn)) { // tipo di comando sqlCmd.CommandType = CommandType.StoredProcedure; // eventuali parametri sqlCmd.Parameters.Add("@p1", SqlDbType.Int).Value = 10; sqlCmd.Parameters.Add("@p2", SqlDbType.VarChar).Value = "PROVA"; // esecuzione sqlCmd.ExecuteNonQuery(); } }

ed eccoti quello per lanciare una sp che torna un resultset

DataTable dt = new DataTable("provadati"); using (SqlConnection sqlConn = new SqlConnection("tuaconnectionstring")) { // apro la connessione sqlConn.Open(); using (SqlCommand sqlCmd = new SqlCommand("nomesp", sqlConn)) { // tipo di comando sqlCmd.CommandType = CommandType.StoredProcedure; // eventuali parametri sqlCmd.Parameters.Add("@p1", SqlDbType.Int).Value = 10; sqlCmd.Parameters.Add("@p2", SqlDbType.VarChar).Value = "PROVA"; // esecuzione using (SqlDataAdapter da = new SqlDataAdapter(sqlCmd)) { da.Fill(dt); } } } // in dt hai i dati


Alx81 =)

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

gae58 Profilo | Senior Member

ti ringrazio per la disponibilità.

Provo e ti faccio sapere

ciao

Gaetano

gae58 Profilo | Senior Member

ciao ho letto e provato il tuo codice, ma non funziona, probabilmente sbaglio io qualcosa.

Una domanda, io fino ad adesso ho sempre scritto:
SqlConnection SqlCmd = bew ...
tu invece hai scritto:
using (SqlConnection SqlCmd = bew ...

quell'using cosa significa ed a cosa serve?


Gaetano

alx_81 Profilo | Guru

>ciao ho letto e provato il tuo codice, ma non funziona, probabilmente
>sbaglio io qualcosa.
Ciao! l'ho testato, funziona.. non saprei dirti come mai non ti gira..
>
>Una domanda, io fino ad adesso ho sempre scritto:
>SqlConnection SqlCmd = bew ...
>tu invece hai scritto:
>using (SqlConnection SqlCmd = bew ...
>
>quell'using cosa significa ed a cosa serve?
E' un nuovo operatore, mooolto comodo, perchè gestisce il rilascio delle risorse in maniera efficiente.
Leggiti questo link:

Using Statement
http://msdn2.microsoft.com/en-us/library/yh598w02(VS.80).aspx
Alx81 =)

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

gae58 Profilo | Senior Member

ancora non ho letto il link che mi hai dato, ed attualmente uso ancora il codice che ti ho detto.

Attualmente l'insert lo faccio all'interno della pagina .aspx, nel code behind.

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["pippo"].ConnectionString);
SqlCommand cmdDB = new SqlCommand(strDB, conn);
// Definisce i Paramentri
cmdDB.Parameters.Add("Nome", SqlDbType.VarChar);
cmdDB.Parameters.Add("Data", SqlDbType.DateTime);
// Apre la Connessione
conn.Open();
lancio il while
// Valorizzo Paramentri
cmdDB.Parameters["Nome"].Value = "Gae";
cmdDB.Parameters["Data"].Value = DateTime.Parse("01/01/2008")

poi l'eseguo
cmdDB.ExecuteNonQuery();

Vorrei adesso farlo attraverso un SP:
Per azzerare la tabella faccio così:
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Svuota";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
// Apre la Connessione
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

ma non ho capito come faccio a passare i parametri




Gaetano

alx_81 Profilo | Guru

>ancora non ho letto il link che mi hai dato, ed attualmente uso
>ancora il codice che ti ho detto.
come preferisci, il codice con la union è migliore.
>
>Vorrei adesso farlo attraverso un SP:
ma perchè vuoi spostare il ciclo?

>ma non ho capito come faccio a passare i parametri
come hai fatto prima, non capisco.. ma poi, che parametri ti servono? non so che parametri voglia la stored procedure in questione..
Alx81 =)

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