none
Salvare testo di una mail gmail in database sql RRS feed

  • Domanda

  • Ciao a tutti,

    vorrei fare un programma di ticketing andando a leggere le mail gmail tramite protocollo imap e l'intento sarebbe quelle di scriverle in database sql.

    Riesco a leggere il contenuto tramite ASP.NET (linguaggio visual basic) ma noto che per alcune mail si presentano errori del genere quando vado a tentare di scrivere il contenuto del messaggio in sql.

    Ho fatto prove invece con mail semplice con poche parole e funziona correttamente.

    L'errore è il seguente:

    "

    Si è verificata l'eccezione System.Data.SqlClient.SqlException
      HResult=0x80131904
      Messaggio=Sintassi non corretta in prossimità di 'esercizio'.
    L'etichetta 'mailto' è già stata dichiarata. In un batch di query o in una stored procedure i nomi di etichetta devono essere univoci.
    L'etichetta 'mailto' è già stata dichiarata. In un batch di query o in una stored procedure i nomi di etichetta devono essere univoci.
    L'etichetta 'http' è già stata dichiarata. In un batch di query o in una stored procedure i nomi di etichetta devono essere univoci.
    L'etichetta 'http' è già stata dichiarata. In un batch di query o in una stored procedure i nomi di etichetta devono essere univoci.
      Origine=.Net SqlClient Data Provider
      Analisi dello stack:
       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& usedCache, Boolean asyncWrite, Boolean inRetry)
       in System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       in WindowsApp1.Form1.UltimoMessaggio() in C:\Users\d.saulle\source\repos\WindowsApp1\WindowsApp1\Form1.vb: riga 55
       in WindowsApp1.Form1.Form1_Load(Object sender, EventArgs e) in C:\Users\d.saulle\source\repos\WindowsApp1\WindowsApp1\Form1.vb: riga 20
       in System.EventHandler.Invoke(Object sender, EventArgs e)
       in System.Windows.Forms.Form.OnLoad(EventArgs e)
       in System.Windows.Forms.Form.OnCreateControl()
       in System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       in System.Windows.Forms.Control.CreateControl()
       in System.Windows.Forms.Control.WmShowWindow(Message& m)
       in System.Windows.Forms.Control.WndProc(Message& m)
       in System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       in System.Windows.Forms.Form.WmShowWindow(Message& m)
       in System.Windows.Forms.Form.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)

    "

    Il codice del programma che ha problemi è questo:

            For Each Messaggio In MessaggiNonLetti
                Dim Mittente As String = Messaggio.Value.From.Address.ToString
                Dim DataRicezione = Messaggio.Value.Date
                Dim Oggetto As String = Messaggio.Value.Subject
                Dim CorpoMessaggio As String = Messaggio.Value.Body
                Dim cmd As New SqlCommand("INSERT INTO [dbo].[Ticket] ([Mittente],[Data],[Oggetto],[Body],[Check]) VALUES ('" + Mittente + "', '" + DataRicezione + "', '" + Oggetto + "', '" + CorpoMessaggio + "', 0)")
                cmd.Connection = Connessione
                Connessione.Open()
                cmd.ExecuteNonQuery()
                Connessione.Close()
            Next

    Come posso risolvere?

    Grazie.

    martedì 24 agosto 2021 14:44

Tutte le risposte

  • Buongiorno Daniele, 

    L'errore può venire da diversi problemi.

     

    Abilita la traccia degli errori a livello di pagina e chiama lo stack dalla configurazione web per vedere il problema effettivo.

    nella configurazione web dell'applicazione web apportare le seguenti modifiche a due attributi
    CallStack="true"
    AllowPageLevelTrace="true"
    e cerca customErrors e imposta su Off.

    Controllare i registri ULS per ulteriori informazioni (utilizzando CorrelationID).
    Assicurati che il tuo database di contenuti in SQL non sia pieno.

    Infine, potresti dare un'occhiata a questo thread e vedere se qualcosa non aiuta li:
    Sql Error Exception while trying to connect asp.net webapplication to sql server database


    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.



    martedì 24 agosto 2021 14:55
    Moderatore

  • Come posso risolvere?

    Grazie.

    Probabilmente ti basta utilizzare i parameters nella query. Il concatenamento di stringa è sconsigliatissimo per diversi motivi.

    Questo è il ciclo cui dovresti usare:

    For Each Messaggio In MessaggiNonLetti
                Dim Mittente As String = Messaggio.Value.From.Address.ToString
                Dim DataRicezione = Messaggio.Value.Date
                Dim Oggetto As String = Messaggio.Value.Subject
                Dim CorpoMessaggio As String = Messaggio.Value.Body
                Dim cmd As New SqlCommand("INSERT INTO [dbo].[Ticket] ([Mittente],[Data],[Oggetto],[Body],[Check]) VALUES (@par1, @par2, @par3, @par4, 0)")
                cmd.Connection = Connessione
                cmd.Parameters.AddWithValue("@par1", Mittente)
                cmd.Parameters.AddWithValue("@par2", DataRicezione)
                cmd.Parameters.AddWithValue("@par3", Oggetto)
                cmd.Parameters.AddWithValue("@par4", CorpoMessaggio)
                Connessione.Open()
                cmd.ExecuteNonQuery()
                Connessione.Close()
            Next

    Facci sapere,
    ciao


    Paolo Pranzo

    • Proposto come risposta Paolo Pranzo martedì 7 settembre 2021 09:57
    giovedì 26 agosto 2021 12:25