Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Belo Horizonte, Brazil
    Messaggi
    258

    [SQL Server 2005] Openrowset, insert di sole righe nuove da Excel al DB

    Salve a tutti.
    Ho il seguente problema: devo fare, su una tabella di Sql Server 2005, una insert che fa riferimento a dei dati su un file .xls (Excel). Fin qui tutto ok, ma dovrei selezionare solo quei dati che non sono presenti sul DB, altrimenti avrei righe di dati sul DB uguali.
    Ecco la query che mi permette di selezionare tutte le righe del file .xls:

    INSERT INTO Commessa (Numerodoc, Cod_Arca) SELECT Colonna_TS, Cod_ARCA FROM
    OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'Excel 8.0;Database=C:\folder\filename.xls', [Foglio1$])

    Per fare la selezione delle righe nuove del file .xls anziché tutte come faccio? O almeno quelle righe non presenti sul DB?
    Spero di essermi spiegato bene.
    Grazie in anticipo.

  2. #2

    Re: [SQL Server 2005] Openrowset, insert di sole righe nuove da Excel al DB

    Originariamente inviato da x_raystyle
    Salve a tutti.
    Ho il seguente problema: devo fare, su una tabella di Sql Server 2005, una insert che fa riferimento a dei dati su un file .xls (Excel). Fin qui tutto ok, ma dovrei selezionare solo quei dati che non sono presenti sul DB, altrimenti avrei righe di dati sul DB uguali.
    Ecco la query che mi permette di selezionare tutte le righe del file .xls:

    INSERT INTO Commessa (Numerodoc, Cod_Arca) SELECT Colonna_TS, Cod_ARCA FROM
    OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'Excel 8.0;Database=C:\folder\filename.xls', [Foglio1$])

    Per fare la selezione delle righe nuove del file .xls anziché tutte come faccio? O almeno quelle righe non presenti sul DB?
    Spero di essermi spiegato bene.
    Grazie in anticipo.
    Cosi non puoi farlo, secondo me devi aprire un cursor per le righe del file excel per scorrerlo e per ogni riga controllarne la presenza sul db, se non presente fare l'insert.
    codice:
    declare @colonna varchar
    declare @arca varchar
    declare prova cursor for
    SELECT Colonna_TS, Cod_ARCA FROM
    OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'Excel 8.0;Database=C:\folder\filename.xls', [Foglio1$])
    
    fetch next from prova
    into
    @colonna,@arca
    
    while (@@fetch_status = 0)
    begin
    
    --controlli e inserimento
       IF not EXISTS(SELECT *FROM Commessa  WHERE Numerodoc= @colonna AND Cod_Arca= @arca)
    BEGIN
         INSERT INTO Commessa (Numerodoc, Cod_Arca) values (@colonna,@arca)
    END
    
    fetch next from prova
    into
    @colonna,@arca
    end
    close prova
    deallocate prova
    Più o meno è cosi che devi fare, ora ci sarà qualche errore di sicuro, ma l'idea è questa

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Belo Horizonte, Brazil
    Messaggi
    258
    Ti sei dimenticato di un "open prova" per aprire il cursore.

    In ogni caso c'è una cosa che non va, cioè prende soltanto il primo carattere del campo. Com'è possibile?

    EDIT: ok l'ho capito, è che nel declare non hai specificato la lunghezza del campo. In ogni caso non funziona lo stesso, cioè inserisce comunque tutte le righe.

  4. #4
    Originariamente inviato da x_raystyle
    Ti sei dimenticato di un "open prova" per aprire il cursore.

    In ogni caso c'è una cosa che non va, cioè prende soltanto il primo carattere del campo. Com'è possibile?

    EDIT: ok l'ho capito, è che nel declare non hai specificato la lunghezza del campo. In ogni caso non funziona lo stesso, cioè inserisce comunque tutte le righe.
    scusa ma Numerodoc e Cod_Arca sono varchar?? perchè altrimenti non ti funziona di sicuro.
    Io ho messo varchar perche non sapevo che tipo di dati erano ma te devi mettere quelli giusti,
    altrimenti quando ti va a fare la select non ti trova nulla........

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Belo Horizonte, Brazil
    Messaggi
    258
    Originariamente inviato da DonFrignolo
    scusa ma Numerodoc e Cod_Arca sono varchar?? perchè altrimenti non ti funziona di sicuro.
    Io ho messo varchar perche non sapevo che tipo di dati erano ma te devi mettere quelli giusti,
    altrimenti quando ti va a fare la select non ti trova nulla........
    nvarchar per entrambi. Il primo ha lunghezza di 50, il secondo di 6.
    Il problema non è il tipo, ma il fatto che è come se non controllasse il contenuto della tabella.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Belo Horizonte, Brazil
    Messaggi
    258
    Ho capito! Nella select dell'if ho tolto " AND Cod_Arca = @arca", e funziona!
    Grazie mille dell'aiuto!

  7. #7
    Originariamente inviato da x_raystyle
    nvarchar per entrambi. Il primo ha lunghezza di 50, il secondo di 6.
    Il problema non è il tipo, ma il fatto che è come se non controllasse il contenuto della tabella.
    MMMM...... non vorrei che quando prende i dati da excel ci metta anche degli spazi.
    prova ad aggiunger prima dell'if
    print('*'+@colonna+'*')
    print('*'+@arca+'*')
    per vedere che dati ti tira fuori.
    Perchè se ci sono degli spazi li devi togliere altrimenti nella where condition non ti trova i dati giusti

  8. #8
    Originariamente inviato da x_raystyle
    Ho capito! Nella select dell'if ho tolto " AND Cod_Arca = @arca", e funziona!
    Grazie mille dell'aiuto!
    bene era più semplice di quanto pensavo

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Belo Horizonte, Brazil
    Messaggi
    258
    E' sorto un altro problema.
    Ho un sito in aspx, in cui in una pagina ho un bottone che, cliccandoci sopra, esegue quella query lì.
    In localhost, quindi in debug utilizzando Visual Studio non mi dà alcun problema. Ma una volta pubblicato il sito in locale premendo quel bottone mi dà il seguente errore:

    codice:
    [SqlException (0x80131904): Impossibile inizializzare l'oggetto origine dei dati del provider OLE DB "Microsoft.Jet.OLEDB.4.0" per il server collegato "(null)".]
       System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1950890
       System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4846875
       System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
       System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
       System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
       System.Data.SqlClient.SqlDataReader.get_MetaData() +83
       System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
       System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954
       System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
       System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
       System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
       System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
       System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
       System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130
       System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +287
       System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +92
       Timesheet_Timesheet.btnAggiornaCo_Click(Object sender, EventArgs e) +772
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
       System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565
    Mi chiedo perché in debug, su Visual Studio, funziona e dopo pubblicato no.

  10. #10
    Non sono molto esperto di .NET ho fatto solo delle applicazioni semplici in c#, di solito programmo in java, comunque a occhio è un problema di Framework, forse hai un'altra versione istallata sul server remoto.... oppure mancano le runtime di excel

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.