2017-01-20 6 views
0

J'essaie d'insérer des données dans la base de données en utilisant détailsView insert commande. Et ça ne marche pas. Voici mon code derrière. J'ai réussi à insérer dans la page .aspx buti a quelques limitations, puisque j'ai besoin d'utiliser la ligne de la grille comme données aussi et je ne peux le faire que si je le fais dans la page aspx.cs.DetailsView Insérer derrière le code ne fonctionne pas

protected void DetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e) 
{ 
    string Price; 
    string Item; 
    string PetitionType; 
    string Note; 
    string UserNameGV = (GridView1.SelectedRow.Cells[3].Text); 
    string InvoiceGV = (GridView1.SelectedRow.Cells[5].Text); 
    string CreatedDateGV = (GridView1.SelectedRow.FindControl("lblLocalTime") as Label).Text; 
    SearchTB.Text = UserNameGV + " " + InvoiceGV + " " + CreatedDateGV; 
    DateTime CreatedDate = Convert.ToDateTime(CreatedDateGV); 

    for (Int32 attempt = 1; ;) 
    { 
     using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["RapidVisaConnectionString"].ConnectionString)) 
     { 
      try 
      { 
       Price = ((TextBox)DetailsView1.Rows[1].FindControl("TextBox2")).Text; 
       Item = ((DropDownList)DetailsView1.Rows[1].FindControl("DropDownList2")).SelectedValue; 
       PetitionType = ((DropDownList)DetailsView1.Rows[1].FindControl("DropDownList3")).SelectedValue; 
       Note = ((TextBox)DetailsView1.Rows[1].FindControl("TextBox2")).Text; 
       con.Open(); 
       string Sql = "INSERT INTO InvoiceDetail (Price, Item, PetitionType, Note, Paid, Quantity, Invoice, UserName, CreatedDate) VALUES (@Price, @Item, @PetitionType, @Note, @Paid, @Quantity, @Invoice, @UserName, @CreatedDate)"; 
       SqlCommand cmd = new SqlCommand(Sql, con); 
       cmd.Parameters.AddWithValue("@Price", Price); 
       cmd.Parameters.AddWithValue("@Item", Item); 
       cmd.Parameters.AddWithValue("@PetitionType", PetitionType); 
       cmd.Parameters.AddWithValue("@Note", Note); 
       cmd.Parameters.AddWithValue("@Paid", 1); 
       cmd.Parameters.AddWithValue("@Quantity", 1); 
       cmd.Parameters.AddWithValue("@Invoice", InvoiceGV); 
       cmd.Parameters.AddWithValue("@UserName", UserNameGV); 
       cmd.Parameters.AddWithValue("@CreatedDate", CreatedDate); 
       cmd.ExecuteNonQuery(); 
       return; 
      } 
      catch (SqlException sqlException) 
      { 
       // Increment Trys 
       attempt++; 
       // Find Maximum Trys 
       // Override the web.config setting of 4 for retrys for this method because we are getting time-out errors. 
       Int32 maxRetryCount = Int32.Parse(ConfigurationManager.AppSettings["ConnectionRetrys"]); 
       //Int32 maxRetryCount = 5; 
       // Throw Error if we have reach the maximum number of retries 
       if (attempt == maxRetryCount) 
       { 
        ErrorLog EL = new ErrorLog(); 
        EL.WriteErrorWithSubjectNoWriteToDB("", "Error InvoiceDetail Max Retry"); 
        //going to stop throwing an error because we are getting too many 
        //throw; 
        break; 
       } 
       // Determine if we should retry or abort. 
       if (!SQLUtilities.RetryLitmus(sqlException)) 
       { 
        ErrorLog EL = new ErrorLog(); 
        EL.WriteErrorWithSubjectNoWriteToDB("Insert Failed RetryLitmus for user " + UserName + ". Sql exception number " + sqlException.Number.ToString() + ". " + sqlException.ToString(), "Error InvoiceDetail Failed Litmus"); 
        //going to stop throwing an error because we are getting too many 
        //throw; 
        break; 
       } 
       else 
        Thread.Sleep(SQLUtilities.ConnectionRetryWaitSeconds(4)); 
       //Changed from default of 5 seconds to 3 seconds 
       //Thread.Sleep(SQLUtilities.ConnectionRetryWaitSeconds(attempt)); 
      } 
     } 
    } 
} 

Voici le message d'erreur que je suis arrivé.

L'insertion n'est pas prise en charge par la source de données 'DetailsViewDS' à moins que la commande InsertCommand ne soit spécifiée. Le problème est que je ne veux pas ajouter InsertCommand dans la page aspx, seulement dans aspx.cs

+0

Oui, voici le message. L'insertion n'est pas prise en charge par la source de données 'DetailsViewDS' sauf si InsertCommand est spécifié. Le problème est que je ne veux pas ajouter InsertCommand dans la page aspx, seulement dans aspx.cs – Ping

+0

Duplication possible de [L'insertion n'est pas supportée par la source de données 'SqlDataSource1' sauf si InsertCommand est spécifié] (http://stackoverflow.com/questions/7283920/inserting-is-not-supported-par-data-source-sqldatasource1-à-moins-insertcommand) –

+0

@M Adeel Khalid Je pense que je le mentionne déjà, je ne veux pas ajouter insertcommand dans aspx.page, seulement dans aspx.cs je expliquez pourquoi, car il y a quelques limitations dans mon code. – Ping

Répondre

0

J'ai testé votre code, fait quelques modifications et cela fonctionne. J'ai utilisé la table de ma base de données, vous pouvez la modifier en fonction de vos besoins. Modifiez votre code SqlDataSource et C# dans DetailsView1_ItemInserting comme mentionné ci-dessous. Cela fonctionnera parfaitement.

SqlDataSource:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
    SelectCommand="SELECT * FROM [Image]" InsertCommand="INSERT INTO [Image] ([Name]) VALUES (@Name)"> 
    <InsertParameters> 
     <asp:Parameter Name="Name" Type="String" /> 
    </InsertParameters> 
</asp:SqlDataSource> 

insertion de code derrière

protected void DetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e) 
    { 
     SqlDataSource sqldsInsertPassword = new SqlDataSource(); 
     sqldsInsertPassword.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     sqldsInsertPassword.ProviderName = ConfigurationManager.ConnectionStrings["ConnectionString"].ProviderName; 
     sqldsInsertPassword.InsertCommand = "INSERT INTO Image (Name) VALUES (@Name)"; 
     sqldsInsertPassword.InsertCommandType = SqlDataSourceCommandType.Text; 
     sqldsInsertPassword.InsertParameters.Add("Name", e.Values[0].ToString()); 
     sqldsInsertPassword.Insert(); 
    } 

J'espère que cela résoudra votre problème. Cordialement!