Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Connessione e inserimento dati in Database MySql con aspx

    Salve a tutti, sto creando un semplice social network che ho intenzione di portare all'esame, ma ho un problema riguardante la connessione al database MySql con una pagina .aspx .
    Posto parte del sorgente aspx (chiamato default.aaspx) per darvi un idea:

    <div id="dvRegistrazione" runat="server">
    <table id="tableReg" align="center">
    <tr>
    <th colspan="2" align="left"> <h4>Non sei ancora registrato? Registrati ora!</h4></th>
    </tr>
    <tr>
    <td><h1 class="scrittura">Nome</h1>
    <asp:TextBox id="txtNomeUser" runat="server" name="nome" onDblClick="this.value=''"> </asp:TextBox>
    </td>
    </tr>

    <tr>
    <td>
    <h1 class="scrittura">Password (max 30 caratteri)</h1>
    <asp:TextBox id="txtPassReg" runat="server" TextMode="Password" name="password" MaxLength="30" onDblClick="this.value=''"> </asp:TextBox>
    </td>
    </tr>
    Questo codice, con un Button "Registrati" mi rimanda ad una pagina "registrato.aspx" dove i dati verranno registrati nel database e mi ridarà una striga :" registrazione avvenuta!".
    Il problema sorge quando, come accennato sopra, tento di inserire i dati della registrazione nel database.
    Questo è il codice che ho utilizzato per la connessione e l'inserimento dei dati:

    protected void Page_Load(object sender, EventArgs e)
    {
    MySqlConnection MyConn = new MySqlConnection();
    MyConn.ConnectionString = "Server=localhost; Port=n°porta; DATABASE=nomedb; UID=user; PWD=pass";

    MyConn.Open();

    string Nome = Request.Form["nome"];
    string Cognome = Request.Form["cognome"];
    string Password = Request.Form["password"];
    string Email = Request.Form["email"];
    string Sesso = Request.Form["sesso"];

    //crea l'oggetto command
    MySqlCommand MyComm = MyConn.CreateCommand();

    // imposta il tipo di comando
    MyComm.CommandType = CommandType.Text;

    MyComm.CommandText = "INSERT INTO ACCOUNT(NOME, COGNOME, PASSWORD, EMAIL, SESSO) VALUES (" + Nome + "," + Cognome + "," + Password + "," + Email + "," + Sesso + ");";

    MyComm.ExecuteNonQuery();

    MyConn.Close();

    }
    N.B. le librerie MySql.Data; MySql.Data.MySqlClient; System.Data sono state inserite.
    P.S il messaggio ( o meglio parte del messaggio) di errore che mi ritorna è il seguente:

    (0x80004005): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,,)'.

    Non capisco come mai mi dia questo errore, se provo ad inserire i dati da mysql Query Browser nello stesso modo non mi crea problemi :/
    Spero possiate aiutarmi. Grazie

  2. #2
    Utente di HTML.it L'avatar di mexican
    Registrato dal
    Oct 2001
    residenza
    cava de tirreni
    Messaggi
    3,541
    string Nome = Request.Form["nome"];
    Fai cosi:
    string Nome = nome.text

    E poi il button perchè ti manda ad una nuova pagina? Non c'è bisogno.

    Basta che metti la funzione per il click del button ed esegui il codice nella stessa pagina.

    "INSERT INTO ACCOUNT(NOME, COGNOME, PASSWORD, EMAIL, SESSO) VALUES ('" + Nome + "','" + Cognome + "','" + Password + "','" + Email + "','" + Sesso + "')";
    Prova così

  3. #3
    Ciao Mexican. Innanzitutto ti ringrazio per il consiglio del button (una cosa abbastanza banale ma a cui non avevo pensato (: ) e grazie per la linea di codice riguardante l'inserimento dei valori (adesso non mi da più l'errore di prima).
    Il problema sorge qui:
    string Nome = Request.Form["nome"] dove "nome" è il valore della proprietà name;
    tu mi hai consigliato di mettere:
    string Nome = nome.text;
    Ecco, se scrivo così mi da errore, ma se lo faccio con il request.form non mi da nessun errore, anzi memorizza i dati nel database, ma solo il sesso.
    Ti spiego: l'id sesso è: rdbM/F (a seconda del sesso, appunto); quando vado a inserire valori quali nome, cognome, password ed email, il database mi registra questi campi, ma me li registra come se fossero vuoti TRANNE che per string Sesso = Request.Form["sesso"] ed incrementa l'id.
    Quindi se apro MySQL QueryBrowser e faccio una Select su account mi ritrovo con svariati id con i campi nome, cognome ecc. vuoti e il campo sesso= rdbM/F.
    p.s. a prescindere dal fatto che rdbM/F è una cosa banale, che posso cambiare in M/F per far si che sia più ordinato, perchè con l' INSERT TO() VALUES()... mi legge solo l'attributo sesso? e perchè nel database registra l'ID (di sesso, ovviamente, cioè rdbM o rdbF) ?? E' moooolto strano :/

  4. #4
    Utente di HTML.it L'avatar di mexican
    Registrato dal
    Oct 2001
    residenza
    cava de tirreni
    Messaggi
    3,541
    Scusa ma facendo il debug passo passo hai verificato che ti arrivano i valori?
    Poi mi sembra strano che se scrivi nome.text ti da errore.

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    non bisogna mettere la proprietà name perchè il framework lo aggiunge da sè.

    <asp:TextBox ID="txtNomeUser" runat="server" name="nome" onDblClick="this.value=''"> </asp:TextBox>

    viene reso con
    <input name="txtNomeUser" type="text" id="txtNomeUser" name="nome" onDblClick="this.value=&#39;&#39;" />


    perciò si recupera il valore nell'evento click di un pulsante (per esempio) mettendo (basic)

    dim nome as string=me.txtNomeUser.text
    Pietro

  6. #6

    RISOLTO

    Grazie Pietro, sei stato gentilissimo e di grande aiuto
    All'inizio non avevo messo il "name", solo che mi dava errore per via di alcune virgolette (") nella riga di codice del VALUES()... allora avevo pensato di metterlo, ma sempre niente xD ...fatto sta che senza di te non avrei mai pensato di ritoglierlo
    Quindi ho risolto in questo modo :
    Nella pagina default.aspx ho tolto il name e ho scritto come hai consigliato tu

    <h1 class="scrittura">Nome</h1>
    <asp:TextBox id="txtNomeUser" runat="server" onDblClick="this.value=''"> </asp:TextBox>

    Successivamente nella pagina default.aspx.cs nell'evento Button_click vado richiamare i dati da inserire nel database in questo modo:

    string Nome = Request.Form["txtNomeUser"];
    string Cognome = Request.Form["txtCognomeUser"];
    string Password = Request.Form["txtPassReg"];
    string Email = Request.Form["txtEmailReg"];
    string Sesso = Request.Form["sesso"];
    N.B. dato che l'opzione per il sesso è un radioBox, la scritta "sesso" che sta tra parentesi fa parte della proprietà GroupName.
    <h1 class="scrittura">Sesso</h1>
    M<asp:RadioButton id="M" runat="server" GroupName= "sesso"/> F... </asp:RadioButton>

    Grazie mille e spero che ciò possa essere di aiuto per tanti altri

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    anche se funziona non credo sia la soluzione migliore.

    Il codice di sotto è in Basic e tratta database Access ed è solo per esempio, non è per "copia e incolla"


    Suppongo di avere un controllo server di tipo TextBox
    codice:
    <asp:TextBox ID="c_testo" runat="server" MaxLength="50" ></asp:TextBox>
    è obbligato quindi metto un validatore:
    codice:
    <asp:RequiredFieldValidator ID="rfv_testo" runat="server" ControlToValidate="c_testo" ErrorMessage="Il campo testo è obbligato" ToolTip="Il campo testo è obbligato" Text="*" CssClass="text_error help"></asp:RequiredFieldValidator>

    ho un pulsante (o link) "salva" che, nell'evento click lancia il metodo updateData
    codice:
    Private Sub updateData()
    	Dim Connessione As o.OleDbConnection = Nothing
    	Dim Comando As o.OleDbCommand = Nothing
    	Dim Transazione As o.OleDbTransaction = Nothing
    	Dim Sql As String = "UPDATE [CAMPI] SET [TESTO] = ? WHERE [ID] = ? "
    
    	Try
    		Dim id As Integer = Me.id
    		Dim testo As String = Me.c_testo.Text
    
    		Connessione = New o.OleDbConnection(gl.StringaConnessioneTest)
    		Connessione.Open()
    		Transazione = Connessione.BeginTransaction()
    		Comando = Connessione.CreateCommand()
    		Comando.Transaction = Transazione
    
    		Comando.CommandText = Sql
    
    		Comando.Parameters.Clear()
    
    		Comando.Parameters.Add(msole.createParameterVarChar("testo", 50, l.StringNullToDBNull(testo)))
    
    		Comando.Parameters.Add("id", OleDbType.Integer).Value = id
    
    
    		Comando.ExecuteNonQuery()
    
    
    		'Transazione.Rollback()
    		Transazione.Commit()
    
    		Dim messaggio As String = "Dati immessi con successo."
    
    		If Not EIE9oSuperioreOAltri() Then
    			l.addLoadEventClient(Me, String.Format("if(self.aggiorna_chiamante){{aggiorna_chiamante();}};", ""))
    			l.MsgBox(Me, messaggio)
    		Else
    			l.MsgBox(Me, messaggio)
    			l.addLoadEventClient(Me, String.Format("if(self.aggiorna_chiamante){{aggiorna_chiamante();}};", ""))
    		End If
    
    
    
    
    
    	Catch ex As Exception
    		If (Not (Transazione Is Nothing) AndAlso Not (Transazione.Connection Is Nothing)) Then Transazione.Rollback()
    		Throw
    
    	Finally
    		If Not (Connessione Is Nothing) Then Connessione.Close()
    	End Try
    
    End Sub
    come vedi, si recupera i dati in modo diretto tipo:
    Dim testo As String = Me.c_testo.Text

    poi non creo la stringa sql, ma uso i parametri (elimini così DEFINITIVAMENTE i problemi dei caratteri "strani" e altro...)

    uso le transazione: se debbo aggiornare più tabelle ed un aggiornamento non va a buon fine, faccio il Rollback.

    Chiudo SEMPRE le connessioni nel blocco Finally.


    Il recupero dei dati con Request.Form la fai solo in determinate situazioni, quando non si può fare altrimenti.




    ps. nota che l.StringNullToDBNull(testo) non è altro che un metodo che restituisce dbNull.value se testo è vuoto, altrimenti restituisce testo, così ti metti al riparo dai campi vuoti.
    Pietro

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 © 2025 vBulletin Solutions, Inc. All rights reserved.