Accessdatasource insert qui ne fonctionne pas

Résolu
vandedan Messages postés 5 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mars 2009 - 17 mars 2009 à 23:35
vandedan Messages postés 5 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mars 2009 - 19 mars 2009 à 20:09
Bonjour,

j'ai deux petits soucis avec un accessdatasource.insert.

Sur une page aspx, j'ai

un dropdownlist (populate par le contenu d'un champ "inspecteur"d'une table appelée "inspecteur")
un textbox
un bouton soumettre
un gridview (invisible) basé sur une table appelée "news" comprenant les champs "date_news", "inspecteur" et "texte_news"
un accessdatasource1 qui gère le dropdownlist
un accessdatasource2 qui gère le gridview et les commandes dont "insert"

le premier soucis est que je voudrais que le champ date_news soit rempli automatiquement avec la date et l'heure d'insertion
Le second soucis, c'est qu'après avoir consulter quelques codes sur ce site, je n'arrive toujours pas à faire l'insert.

C'est vraisemblablement une con... mais cette con... vient de me bouffer trois soirées...

Y aurait-il dans ce forum une bonne âme pour jeter un oeil sur le code ?
D'avance, un tout grand merci

Cordialement
Daniel

Voilà le code de la page

<%@ Page Language= "VB" AutoEventWireup="false" CodeFile="intronews.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<Script runat="server">
    Private Sub Insertnews(ByVal Source As Object, ByVal e As EventArgs)
        Dim datenews As Date
        datenews = Date.Now
        AccessDataSource2.Insert()
    End Sub ' Insertnews
</Script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="formats.css" rel="Stylesheet" type="text/css" />
    </head>

   
       
    <table border="1" cellpadding="0" cellspacing="0">
    <colgroup width="115px" span="5"></colgroup>
           ----

              , Accueil</td>
               Données,
               Inspections,
               Recommendations,
               Màj Tables,
          
   

    </td>
</tr>
<tr>
    <td>
               ----

                               <table>
                ----

                   , Menu Accueil

</td>
               
                ----

                Voir les news,
               
                ----

                Envoyer une news,
               
               

               </td>
              
               <td valign ="top">
                  

                  

                   <form id="form1" runat="server">
                   Inspecteur :
                  
                  
                  
                  
                  

                   News :
                  
                  

                  
                  

                  
                       <Columns>
                          
                          
                          
                       </Columns>
                  
                  
                       <DeleteParameters>
                          
                       </DeleteParameters>
                      
                          
                          
                          
                      
                      
                          
                          
                          
                      
                  
                   </form>
                  

               </td>
           </tr>
    </table>
    </td>
</tr>
</table>
   

</html>

8 réponses

ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
18 mars 2009 à 01:36
Bonsoir,

Oui, apparemment, tu as essayé plusieurs solutions... Mais tu n'as pas de variable liées dans ton datasource (et tes déclarations, sur l'insert, ne sont d'ailleurs pas valides pour un AccessDataSource).
Puisque l'insert semble déclenché sur le click du button, tu peux définir ton insertcommand lors du onclick. Ici, un exemple bête (mais attention, la requête n'est pas paramétrée, donc il y a possibilité d'injection ; c'est juste une piste) :

Dim sqlins As String
sqlins ="INSERT INTO [news] ([date_news], [inspecteur], [texte_news]) VALUES ("
sqlins &= DateTime.Now.Date & ", " & DropDownList1.SelectedValue & " , '" & TextBox1.Text & "')" 
AccessDataSource2.InsertCommand = sqlins
AccessDataSource2.Insert()

Ca doit aussi pouvoir se faire simplement en déclaration asp.

GGtry
3
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
18 mars 2009 à 11:39
Bonjour,

En fait, le passage par le code vb est surtout pour la date.
Pour le faire directement dans le code asp, tu dois en effet remplacer tes noms de variable par des points d'interrogation.

Puis tu dois définir tes insertparameters, mais comme controlparameters pour tes deux derniers champs, en définissant dans le même ordre que tes champs quels sont les contrôles qui alimentent chaque champ :

               
               
           
Le problème ici est pour la date, car je ne sais pas comment passer datetime.now directement dans un parameter (d'où le code vb dans le premier exemple).
Une solution serait de supprimer date_news de ton insert et de définir le champ de date, dans ta bdd access avec une valeur par défaut à date(). De la sorte, la date s'insérera automatiquement lors de l'insert, sans que tu ais besoin de la préciser dans ton code asp.
C'est probablement mieux.
(à propos, pourquoi mets-tu un gridview invisible ? si tu ne l'affiches jamais, tu peux le supprimer et garder seulement ton accessdatasource. L'insert se fera aussi bien).

GGtry
3
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
18 mars 2009 à 22:56
Bonsoir,


Ma dernière suggestion consistait à utiliser le pur code asp, donc de ne pas utiliser le code vb donné au début : utilise plutôt les insertparameters. Cela sera plus simple.


Cela dit, dans le code que tu donnes vb à la fin, tu as :
... VALUES (" & DropDownList1.SelectedValue & ", " & etc.

Ce qui est en rouge doit bien entendu être supprimé.

Si tu n'y arrives pas, je peux t'envoyer un exemplet complet de code.

GGtry
3
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
19 mars 2009 à 00:40
rebonsoir,


Non, c'est parfaitement normal : un postbackurl sert à faire un postback, mais sur une autre page. Autrement dit, tu transfères le traitement de code sur une page qui a un autre url que ta première page, mais dans laquelle tu peux récupérer néanmoins les renseignements de la première page, au niveau du serveur.
Le postbackurl empêche donc ton button_click d'être activé, puisque tu passes la main, pour le code, à une autre page (plus clairement, le postback ne renvoie plus à la même page, mais à la nouvelle page, et donc ignore le code de la page précédente).


Dans ton cas, il ne paraît pas que tu aies besoin d'un postbackurl : donc, tu peux plutôt, dans ton sub insertnews, après l'insert, faire un response.redirect vers ta page default.aspx.

GGtry
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vandedan Messages postés 5 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mars 2009
18 mars 2009 à 09:41
Bonjour GGtry,

merci pour la réponse. 
Ce qui me parait un peu bizarre, c'est qu'il y aurait lieu de redéfinir la chaîne d'insertion (que tu as appelée sqlins) mais alors, je ne comprends pas à quoi sert l'insert command dans le <asp:accessdatasource mais bon, Microsoft...

cela voudrait il dire aussi que dans la commande insert de mon datasource (sous <asp:accessdatasource, je dois virer les @inspecteur, @text_news etc et remettre les points d'interrogations originaux ?

Je vais essayer cela ce soir en rentrant du boulot.  J'espère que cela marchera. 

Encore un tout grand merci pour ton aide

Daniel
0
vandedan Messages postés 5 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mars 2009
18 mars 2009 à 22:32
re-

j'ai fait divers tests sur base des codes fournis, ce qui semble aller le mieux est ce code :

Private Sub Insertnews(ByVal Source As Object, ByVal e As EventArgs)
        Dim sqlins As String
         sqlins = "INSERT INTO [news] ([date_news], [inspecteur], [texte_news]) VALUES ("&Date.Now &" , " & DropDownList1.SelectedValue & ", " & TextBox1.Text & ")"
        AccessDataSource2.InsertCommand = sqlins
        AccessDataSource2.Insert()
    End Sub ' Insertnews

je dis mieux car j'ai toujours le problème de date, que j'essaye de passer l'argument par une variable  ou comme indiqué ci-dessus avec date.now, datetime.now ou datetime.now.date.

J'obtiens toujours cette erreur :

System.Data.OleDb.OleDbException was unhandled by user code
  ErrorCode=-2147217900
  Message="Syntax error (missing operator) in query expression '18/03/2009 22:23:30'."
  Source="Microsoft JET Database Engine"
  StackTrace:
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
       at System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command, DataSourceOperation operation)
       at System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert(IDictionary values)
       at System.Web.UI.WebControls.SqlDataSource.Insert()
       at ASP.intronews2_aspx.Insertnews(Object Source, EventArgs e) in d:\basic web site\intronews2.aspx:line 11
       at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException:

J'ai aussi essayé avec date auto - date() comme date par défaut dans la base de données mais là aussi problème. j'ai essayé plusieurs trucs et au dernier essai, j'ai mis ce code, me disant que si la date était automatique, je n'avais pas à l'inclure dans le insertcommand string : 

Private Sub Insertnews(ByVal Source As Object, ByVal e As EventArgs)
        Dim sqlins As String
         sqlins = "INSERT INTO [news] ([inspecteur], [texte_news]) VALUES (" & DropDownList1.SelectedValue & ", " & TextBox1.Text & ")"
        AccessDataSource2.InsertCommand = sqlins
        AccessDataSource2.Insert()
    End Sub ' Insertnews

et là, rebelote, nouvel erreur :

System.Data.OleDb.OleDbException was unhandled by user code
  ErrorCode=-2147217900
  Message="Syntax error (missing operator) in query expression 'Dupont'."
  Source="Microsoft JET Database Engine"
  StackTrace:
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
       at System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command, DataSourceOperation operation)
       at System.Web.UI.WebControls.SqlDataSourceView.ExecuteInsert(IDictionary values)
       at System.Web.UI.WebControls.SqlDataSource.Insert()
       at ASP.intronews2_aspx.Insertnews(Object Source, EventArgs e) in d:\basic web site\intronews2.aspx:line 11
       at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
       at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
       at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException:

Je suis de plus en plus perplexe...

bien cordialement et merci pour votre aide

Daniel
0
vandedan Messages postés 5 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mars 2009
18 mars 2009 à 23:42
Re-bonsoir,

ca code dur ce soir, j'ai trouvé une solution qui fonctionne avec autodate dans la base access comme suggéré par GGtry.  UN GRAND MERCI A LUI !
je met le code ci-dessous pour tout le monde MAIS car il y a un mais (voir plus bas après le code)

<%@ Page Language= "VB" AutoEventWireup="false" CodeFile="intronews.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<Script runat="server">
    Private Sub Insertnews(ByVal Source As Object, ByVal e As EventArgs)
        Dim sqlins As String
        sqlins = "INSERT INTO [news] ([inspecteur], [texte_news] ) VALUES (drop,box)"
        AccessDataSource2.InsertCommand = sqlins
        AccessDataSource2.Insert()
        TextBox1.Text=" "
        DropDownList1.ClearSelection
        End Sub ' Insertnews
</Script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="formats.css" rel="Stylesheet" type="text/css" />
    </head>

   
       
    <table border="1" cellpadding="0" cellspacing="0">
    <colgroup width="115px" span="5"></colgroup>
           ----

              , Accueil</td>
               Données Del,
               Inspections,
               Recommendations,
               Màj Tables,
          
   

    </td>
</tr>
<tr>
    <td>
               ----

                               <table>
                ----

                   , Menu Accueil

</td>
               
                ----

                Voir les news,
               
                ----

                Envoyer une news,
               
               

               </td>
              
               <td valign ="top">
                  

                  

                   <form id="form1" runat="server">
                   Inspecteur :
                  
                  
                  
                  
                  

                   News :
                  
                  

                  
                  

                  
                  
                        
                        
                  
                  
                   </form>
                  

               </td>
           </tr>
    </table>
    </td>
</tr>
</table>

</html>

MAIS, si par malheur, on met dans le button le code postbackurl=default.aspx pour revenir à la page initiale après le click, on revient bien à la page default.aspx mais la base de données n'est pas mise à jour ! Comique cela

une idée du code à mettre dans la private sub ? ou alors, ce n'est pas possible ?

cordialement

Daniel
0
vandedan Messages postés 5 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mars 2009
19 mars 2009 à 20:09
Bonsoir GGtry,

super, ca marche, je vais pouvoir continuer ma petite application.

Bien cordialement et encore merci pour ton aide.

Daniel
0
Rejoignez-nous