Caricamento dati da excel a sql server

mercoledì 12 gennaio 2005 - 14.52

lobax Profilo | Junior Member

salve,
penso sia un probvlema gia affrontato, in pratica devo leggere i dati di un floppy con un file di excel e caricarli con una procedura batch o altro su un database sql server posto in remoto, questo si deve poter fare ovviamente senza pacchetti dts, quindi sulla macchina del cliente non c'è office ne tantomenno enterprise manager, la si dovrebe poter fare o richiamare l'applicazione dirrettamente dall' interfaccia browser.
mi date un idea?
ciao
grazie

Brainkiller Profilo | Guru

Puoi far scaricare sul client una applicazione .NET ?
Il client avrà il .NET Framework installato ?

Se entrambi le risposte sono positive poi vediamo come fare.

ciao
david

lobax Profilo | Junior Member

si questo si, il framework 1.1 è installato.
quando dico che non ha office mi riferisco in pincipal modo al fatto che non c'è access ma le macchine sono nuove con xp home solo che utilizzano come applicazioni da ufficio quelle della sun (staroffice).
non le ideee molto chiare soprattutto per la lettura del file, pensavo di leggere il flusso dei caratteri convertendo il file excel in ascii ma aspetto di sentire quello che pensate prima voi.
ciao e grazie per l'interessamento.

Brainkiller Profilo | Guru

Si eventualmente ti conviene convertire il file Excel in altro formato più standard tipo Txt o meglio ancora Xml come già ti hanno consigliato. Oppure se sei in una LAN immagino che ci sarà almeno un PC con installato Excel.
Puoi mandare i file tramite copia banale da cartella a server e far elaborare il file da un'applicazione .NET che butterà tutto il suo contenuto nel database.

ciao
david

lobax Profilo | Junior Member

si ma come si converte da excel? mi chiede il mapping cosa vuol dire?.. che devo costrtuire a mano una struttura xml che contenga i dati da esportare?
non creedo no?
grz ciao

Brainkiller Profilo | Guru

Eh dipende dal tuo formato di Excel.
Se è una semplice griglia è un conto se invece è colorata, ci sono celle fuse, ecc. è tutt'altra storia.

Se è un formato standard quindi griglia semplice è sufficiente fare Salva con Nome e scegliere un formato tipo CSV o TXT.

La stessa cosa la puoi fare anche automaticamente tramite il VBA oppure con VB.NET/C# con i PIA di Office.

ciao
david

lobax Profilo | Junior Member

dunque..il file salvandolo da excel lo posso convertire in xmlns. non so se va bene,... poi.., ho visto un lavoro di un tale su internet , no è quello che mi serve esattamente ma è un buon punto di partenza, carica il file di excel da una fin di dialogo e lo trasferisce in un dataset, (solo che è in c# e non ci capisco una mazza...la conversione non viene), qundi anche per rendermi conto di come funziona lo sto rifacendo a mano, la prima parte quella che carica il file e lo legge, dovrei solo adattarla, la seconda , invece di caricare il dataset così comè , deve togliere alcuni dati da excel e sostituirli con quelli obbligatori sul db, quindi trasferire i dati sul db remoto.
parte di caricamento dati:
'dichiarazioni
Private FileName As String
'delegates
Public Delegate Sub FileLoadEventHandler(ByVal sender As Object, ByVal e As FileLoadEventArgs)

Private Function ReturnConnection(ByVal fileName As String) As OleDbConnection
Return New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;" + "Extended Properties=""Excel 8.0;""")
End Function 'ReturnConnection
Private Sub bntOpen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bntOpen.Click
With oFileDia
.InitialDirectory = "C\"
.Filter = "Excel Files (*.xsl )|*.xsl"
Dim tmpDiag As DialogResult = .ShowDialog()
If tmpDiag <> DialogResult.Cancel Then
FileName = .FileName
TextNameFile.Text = FileName
If TestFile(FileName) Then
' delegate fileload event
RaiseEvent FileLoad(Nothing, New FileLoadEventArgs(FileName))
Else
MessageBox.Show("Invalid input file. To diagnose, please enable tracing!", TextNameFile)' qui ho già un errore(errore di conversione dice che non +ò essere convertito in stringa)
End If


End If
End With
End Sub
non credevo così difficile sta cosa..o almeno sembra a me.
ciao grz

Brainkiller Profilo | Guru

Mi viene in mente una cosa.
E invece scusa far spedire il file .xls sul server e farlo processare dal DTS ?
Sono fatti apposta perchè non usarli. Ho capito che sul client non ci sono, allora facciamoli andare sul server :)

No ?
ciao
david

lobax Profilo | Junior Member

dunque..qualche cosa ho fatto:
bon intanto esportato in un dataset tramite un libreria funziona(da schifo ma intanto...)
sull'inserimeto ni da un'errore di tipecasting che non riesco ad individuare"imput string not in correct format"
questo è il cod form:
Public Class Form1
Inherits System.Windows.Forms.Form
Private dataGrid1 As System.Windows.Forms.DataGrid

Private components As System.ComponentModel.Container = Nothing
Private DataTableName, DataSetName As String
Private ds As DataSet
Public Sub New()
DataTableName = "Products"
DataSetName = "set1"
Dim MyArray() As String = {"IdSubCat", "CategoryId", "ModelName", "ModelNumber", "Description", "IdFornitore", "Netto", "UnitCost", "Iva", "ProductImage".ToString}'qui metto i nomi di tutte le colonne del db poi l'utente sceglie solo quelle che servono tramite una combo
exlExp.OuputDatatableName = DataTableName
exlExp.OutputDatasetName = DataSetName
exlExp.AllowedOuputColumnNames = MyArray

End Sub 'New
Public Sub exlExp_DataSetExport(ByVal sender As System.Object, ByVal e As My.Data.Trans.DataSetExportEventArgs) Handles exlExp.DataSetExport

dataGrid1.DataSource = e.ExportedDataSet
dataGrid1.DataMember = DataTableName
ds = e.ExportedDataSet.Copy() 'qui lo copio per inviarlo al server sql
e.ExportedDataSet.AcceptChanges()
End Sub
Private Sub DoINN()
Dim cn As New SqlConnection
Dim cb As SqlCommandBuilder
Dim da As SqlDataAdapter
Try

Dim dsTmp As DataSet
' "..sql e stringa di connessione"
da = New SqlDataAdapter(sql, strcn)
cn.ConnectionString = strcn
dsTmp = ds.GetChanges
cb = New SqlCommandBuilder
cb.DataAdapter = da
da.UpdateCommand = _
cb.GetUpdateCommand()
da.InsertCommand = _
cb.GetInsertCommand()
da.DeleteCommand = _
cb.GetDeleteCommand
If dsTmp Is Nothing Then
MessageBox.Show("Nessun record da aggiornare")
Else
da.Update(ds, "Products")

End If


Catch ex As Exception
MessageBox.Show(ex.Message, "Conferma click aggiornamento")
End Try

End Sub

Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
DoINN()
End Sub
quindi questo sopra mi da un errore di typecasting ma inserisce i dati nel db, poi avevo fatto anche una routine per inserire nuovi dati dala griglia sarebe bene se si potesse modificare cancellare ecc direttamente l'output che esce dalla griglia, avevo fatto questo ma e sconclusionato e non bindato è no funziona quindi.
Private Sub InsertNewRow()
Dim dr As DataRow

Try

For Each dr In ds.Tables("Products").Rows
dr = ds.Tables("Products").NewRow
dr.BeginEdit()
dr("ModelNumber") = dr("ModelNumber")
dr("modelName") = dr("modelName")
dr("description") = dr("description")
dr("idSubCat") = dr("idSubCat")
dr("categoryId") = dr("categoryId")
dr("UnitCost") = dr("UnitCost")
dr("IdFornitore") = dr("IdFornitore")
dr.EndEdit()
Next
ds.Tables("Products").Rows.Add(dr)
Catch ex As Exception
MessageBox.Show(ex.Message, "Routine inserimento nel datatable()")
End Try
End Sub
Ciao grz

Brainkiller Profilo | Guru

:-|
Chiedi troppo... è abbastanza impossibile per chiunque immergersi in un blocco di codice così cercando di capire come funziona.
Già faccio fatica con il codice che scrivo io :)

ciao
david

lobax Profilo | Junior Member

si capisco, più che altro se c'era qualche cosa che saltava agli occhi magari da fuori qualche volta si vedono delle cose che magari chi lo scrive trascura, ..le cllasiche sviste...infatti adesso funziona, era solo che se tentavo di iviare una riga vuota di un errore di typecasting come è logico che sia , ora è a posto.

cmq quello che mi chiedo è, come fanno gli altri quando si presenta un problema del genere? sarà capitato sicuramente, ho cercato in rete ma ho trovato solo le operazioni contrarie(da sql a excel ) ma non partendo da un file x.xls per caricare una tabella sql.
se riesco ad avere un po' di tempo per fare un po' d'ordine ve la mando.
grazie ciao
lobax

Brainkiller Profilo | Guru

A volte mi chiedo anche io molti come fanno a risolvere certi problemi !!
Dove magari io perdo delle ore o delle giornate intere....caspita.
Eppure succede.

ciao
david
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