none
Query per duplicare il record selezionato RRS feed

  • Domanda

  • Buona domenica a tutti e buonasera, Sto cercando di portare avanti un mio progetto personale, e vorrei duplicare un record di una tabella, tutti i campi dovranno esser duplicati tranne un campo denominato codice( che non è presente nella query) e logicamente anche l'id che prenderà il proprio, il progetto è realizzato con VB Community 2013, la query che utilizzo è questa:

    INSERT INTO [dbo].[Table_Preventivi] ([Nominativo], [Indirizzo], [Civico], [Città], [Cap], [Provoncia], [Tel], [Cell], [Fax], [Email], [Data], [Tipo_Preventivo], [Note], [Iva], [Totale_Preventivo], [Tot_Materiali], [Tot_MaterialiExtra], [Tot_PreventiviEsterni], [Incremento], [c1], [c2], [c3], [c4], [c5]) 
    
    SELECT Nominativo, Indirizzo, Civico, Città, Cap, Provoncia, Tel, Cell, Fax, Email, Data, Tipo_Preventivo, Note, Iva, Totale_Preventivo, Tot_Materiali, Tot_MaterialiExtra, Tot_PreventiviEsterni, Incremento, c1, c2, c3, c4, c5 FROM Table_Preventivi WHERE IdPreventivi =(SELECT IdPreventivi  FROM Table_Preventivi )

    ed utilizzo questo codice:

     Private Sub DuplicaRecord_Preventivi_Click(sender As Object, e As EventArgs) Handles DuplicaRecord_Preventivi.Click
            Me.Table_PreventiviTableAdapter.CopiaRecordQuery()
            Me.Table_PreventiviTableAdapter.Fill(Me.Database_GestioneDataSet.Table_Preventivi)
        End Sub

    Il problema è questo, ammettiamo d'avere un record soltanto nella tabella, mandando in esecuzione da query tramite il codice postato mi duplica perfettamente il record, ma se intendo duplicarne ancora uno mi da questo errore e non so cosa fare:

    System.Data.SqlClient.SqlException non è stata gestita
      Class=16
      ErrorCode=-2146232060
      HResult=-2146232060
      LineNumber=1
      Message=Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    The statement has been terminated.
      Number=512
      Procedure=""
      Server=(LocalDB)\v11.0
      Source=.Net SqlClient Data Provider
      State=1
      StackTrace:
           in System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
           in System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
           in System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
           in System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
           in System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
           in System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
           in System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
           in GestionaleDitta.Database_GestioneDataSetTableAdapters.Table_PreventiviTableAdapter.CopiaRecordQuery() in C:\Users\utente\Documents\Visual Studio 2013\Projects\GestionaleDitta\GestionaleDitta\Database_GestioneDataSet.Designer.vb:riga 29703
           in GestionaleDitta.frm_Previntivi.DuplicaRecord_Preventivi_Click(Object sender, EventArgs e) in C:\Users\utente\Documents\Visual Studio 2013\Projects\GestionaleDitta\GestionaleDitta\frm_Previntivi.vb:riga 1805
           in System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
           in System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
           in System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
           in System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
           in System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
           in System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
           in System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
           in System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           in System.Windows.Forms.Control.WndProc(Message& m)
           in System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           in System.Windows.Forms.ToolStrip.WndProc(Message& m)
           in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           in System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           in System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           in System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           in System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           in System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           in System.Windows.Forms.Application.Run(ApplicationContext context)
           in Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           in Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           in Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           in GestionaleDitta.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:riga 81
           in System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           in System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           in Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           in System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           in System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           in System.Threading.ThreadHelper.ThreadStart()
      InnerException: 

    Avete modo di darmi un aiuto per capire cosa sbaglio?

    Grazie Guido

    domenica 13 dicembre 2015 16:48

Risposte

  • Ok,

    la insert diventa:

    INSERT INTO [dbo].[Table_Preventivi] ([Nominativo], [Indirizzo], [Civico], [Città], [Cap], [Provoncia], [Tel], [Cell], [Fax], [Email], [Data], [Tipo_Preventivo], [Note], [Iva], [Totale_Preventivo], [Tot_Materiali], [Tot_MaterialiExtra], [Tot_PreventiviEsterni], [Incremento], [c1], [c2], [c3], [c4], [c5]) 
    SELECT Nominativo, Indirizzo, Civico, Città, Cap, Provoncia, Tel, Cell, Fax, Email, Data, Tipo_Preventivo, Note, Iva, Totale_Preventivo, Tot_Materiali, Tot_MaterialiExtra, Tot_PreventiviEsterni, Incremento, c1, c2, c3, c4, c5
    FROM   Table_Preventivi
    WHERE  IdPreventivi = @IdSelezionato

    e poi esegui il metodo CopiaRecordQuery passando il valore a IdSelezionato

    Me.Table_PreventiviTableAdapter.CopiaRecordQuery(IdSelezionato:=.......)

    Se hai bisogno di ulteriori dettagli su come reperire il valore dal tuo datagridview credo che il luogo più adatto sia il forum di VB.net

    Ciao
    Giorgio Rancati


    lunedì 14 dicembre 2015 09:12
    Moderatore

Tutte le risposte

  • Ciao Guido,

    il messaggio di errore è chiaro e indica che nella seconda esecuzione la subquery posta nella clausola Where restituisce più di un record, è normale visto che esistono 2 record e la subquery

    (SELECT IdPreventivi  FROM Table_Preventivi )

    restituisce tutti gli IdPreventivi  presenti in tabella.

    Dovresti chiarire cosa devi duplicare, se vuoi duplicare un solo record devi indicare a quale IdPreventivi  corrisponde.

    Ipotizzando che vuoi duplicare l'ultimo record corrispondente all'IdPreventivi più alto come valore,  la insert diventa:

    INSERT INTO [dbo].[Table_Preventivi] ([Nominativo], [Indirizzo], [Civico], [Città], [Cap], [Provoncia], [Tel], [Cell], [Fax], [Email], [Data], [Tipo_Preventivo], [Note], [Iva], [Totale_Preventivo], [Tot_Materiali], [Tot_MaterialiExtra], [Tot_PreventiviEsterni], [Incremento], [c1], [c2], [c3], [c4], [c5])

    SELECT Nominativo, Indirizzo, Civico, Città, Cap, Provoncia, Tel, Cell, Fax, Email, Data, Tipo_Preventivo, Note, Iva, Totale_Preventivo, Tot_Materiali, Tot_MaterialiExtra, Tot_PreventiviEsterni, Incremento, c1, c2, c3, c4, c5
    FROM   Table_Preventivi
    WHERE  IdPreventivi = (SELECT TOP 1 IdPreventivi  FROM Table_Preventivi ORDER BY IdPreventivi DESC)


    Ciao

    Giorgio Rancati

    domenica 13 dicembre 2015 20:19
    Moderatore
  • Buonasera Giorgio, grazie della spiegazione, quello che cerco di fare è duplicare il record che seleziono dalla datagridview del progetto.
    domenica 13 dicembre 2015 22:57
  • Ok,

    la insert diventa:

    INSERT INTO [dbo].[Table_Preventivi] ([Nominativo], [Indirizzo], [Civico], [Città], [Cap], [Provoncia], [Tel], [Cell], [Fax], [Email], [Data], [Tipo_Preventivo], [Note], [Iva], [Totale_Preventivo], [Tot_Materiali], [Tot_MaterialiExtra], [Tot_PreventiviEsterni], [Incremento], [c1], [c2], [c3], [c4], [c5]) 
    SELECT Nominativo, Indirizzo, Civico, Città, Cap, Provoncia, Tel, Cell, Fax, Email, Data, Tipo_Preventivo, Note, Iva, Totale_Preventivo, Tot_Materiali, Tot_MaterialiExtra, Tot_PreventiviEsterni, Incremento, c1, c2, c3, c4, c5
    FROM   Table_Preventivi
    WHERE  IdPreventivi = @IdSelezionato

    e poi esegui il metodo CopiaRecordQuery passando il valore a IdSelezionato

    Me.Table_PreventiviTableAdapter.CopiaRecordQuery(IdSelezionato:=.......)

    Se hai bisogno di ulteriori dettagli su come reperire il valore dal tuo datagridview credo che il luogo più adatto sia il forum di VB.net

    Ciao
    Giorgio Rancati


    lunedì 14 dicembre 2015 09:12
    Moderatore
  • Grazie mille Giorgio, molto gentile e preciso, funziona tutto..

    Saluti

    Guido

    lunedì 14 dicembre 2015 12:07