2011-07-23 3 views
-2

J'écris les noeuds d'un code XML dans les colonnes de la base de données, mais je souhaite supprimer tout (*) de la base de données avant d'écrire à nouveau dans la table.Tout supprimer de la table avant l'écriture des données XML dans la table

Maintenant, si un utilisateur avec l'ID utilisateur '100' est inséré dans la base de données, le code ne vérifie pas les dupes et je vais avoir plus de 1 ID utilisateur '100 dans la base de données. J'ai besoin de vérifier si l'identifiant de la colonne (par exemple) correspond au nœud id du xml. S'il y a une correspondance, mettez à jour le v et les noeuds, s'il n'y a pas de correspondance dans la table puis insérez l'identifiant, v et un noeud dans la table

J'ai créé une fonction, private void deleteFromDb(string table) mais je ne peux pas l'appeler (si je l'ai fait correctement en premier lieu) avant que les données XML soient insérées dans la table. Mais cela efface toutes les données, mais la dernière personne qui accède à la page

<%@ Page Language="C#"%> 
<%@ Import namespace="System.Net"%> 
<%@ Import namespace="System.Data"%> 
<%@ Import namespace="System.Data.SqlClient"%> 
<%@ Import namespace="System.IO"%> 
<%@ Import namespace="System.Xml"%> 
<%@ Import Namespace="System" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<script runat="server" language="C#"> 

public class XML 
{ 
    internal string connString = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString(); 

    private void add2Db(string table, string sqlRows, string sqlValues) 
    { 
     string sql = String.Format("INSERT INTO {0} ({1}) VALUES ({2})", table, sqlRows, sqlValues); 
     using (SqlConnection dbConn = new SqlConnection(connString)) 
     { 
      using (SqlCommand cmd = new SqlCommand(sql, dbConn)) 
      { 
       cmd.Connection.Open(); 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 

    private void deleteFromDb(string table) 
    { 
     string sql = String.Format("DELETE *", table); 
     using (SqlConnection dbConn = new SqlConnection(connString)) 
     { 
      using (SqlCommand cmd = new SqlCommand(sql, dbConn)) 
      { 
       cmd.Connection.Open(); 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 

    public void parseXML(XmlDocument doc) 
    { 
     string tsLogpro = ""; 
      string sqlRows = ""; 
      string sqlValues = ""; 

      //SELECT NODE: logPro 
      foreach (XmlNode logPro in doc.SelectNodes("broadcasting")) 
      { 
       tsLogpro = logPro.SelectSingleNode("@ts").InnerText; 

       //SELECT CHILD NODE: logPro 
       foreach (XmlNode child in logPro.ChildNodes) 
       { 

        //GET ROWS 
        foreach (XmlNode rows in child.Attributes) 
        { 
         sqlRows += rows.Name + ", "; 
        } 

        //GET VALUES 
        foreach (XmlNode values in child.Attributes) 
        { 
         sqlValues += "'" + values.InnerText + "', "; 
        } 

        sqlRows = sqlRows.Substring(0, sqlRows.Length - 2); 
        sqlValues = sqlValues.Substring(0, sqlValues.Length - 2); 

        //Response.Write("\n\n"); 
        //Response.Write(sqlRows); 
        //Response.Write("\n" + sqlValues); 

        add2Db("flashcoms_chat7_broadcast", sqlRows, sqlValues); 

        sqlValues = ""; 
        sqlRows = ""; 

       } 
      } 
     } 
    } 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.ExpiresAbsolute = DateTime.Now; 
    Response.AddHeader("Content-type", "text/plain"); 

    HttpRequest request = HttpContext.Current.Request; 
    System.IO.Stream body = request.InputStream; 
    System.Text.Encoding encoding = request.ContentEncoding; 
    System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding); 
    XmlDocument doc = new XmlDocument(); 

    string s = reader.ReadToEnd(); 

    if (Request.Params["action"] != string.Empty && Request.Params["action"] == "test") 
     { 
      doc.InnerXml = "" + 
       "<broadcasting ts=\"12345\">" + 
        "<u id=\"1\" v=\"true\" a=\"true\" />" + 
        "<u id=\"2\" v=\"true\" a=\"true\" />" + 
        "<u id=\"3\" v=\"true\" a=\"false\" />" + 
        "<u id=\"4\" v=\"true\" a=\"true\" />" + 
        "<u id=\"5\" v=\"true\" a=\"true\" />" + 
       "</broadcasting>"; 
     } 
     else if (!string.IsNullOrEmpty(s)) 
    { 
     doc.InnerXml = s; 
    } 

    // Starting at line 111 in your original post 
    XML oXML = new XML(); 
    oXML.deleteFromDb("f_chat7_broadcast") 
    oXML.parseXML(doc); 
    Response.Write("Done"); 
    Response.End(); 
} 
    /* 
    * 
    * 
    SET ANSI_NULLS ON 
    GO 
    USE [DB] 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    CREATE TABLE [dbo].[f_chat7_broadcast](
     [id] [nchar](100) NULL, 
     [v] [nchar](10) NULL, 
     [a] [nchar](10) NULL 
    ) ON [PRIMARY] 
    GO 
    * 
    */ 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head id="Head1" runat="server"> 
     <title>blah blah</title> 
    </head> 
    <body> 
     <form id="Form2" method="post" runat="server"><% Page_Load(null, null); %></form> 
    </body> 
</html> 
+2

Pourquoi appelez-vous Page _Load (null, null)? Page_Load se déclenche automatiquement (cela fait partie du cycle de vie de la page). – Tim

+1

La table est-elle destinée à conserver les données sur une période donnée ou est-elle plutôt une table temporaire? Si le premier, supprimer les données dans le tableau avant de charger les données du document XML juste pour éviter les doublons ID utilisateur me semble être paresseux. – Tim

+0

Eh bien, Tim, avez-vous une solution pour vérifier le nœud 'id' par rapport à la colonne 'id'? Si l'ID existe dans la table, mettez à jour uniquement les colonnes a et v et si ce n'est pas le cas, insérez les données id, a et v du code XML dans la table. – Patriotec

Répondre

0

cette

string sql = String.Format("DELETE *", table); 

devrait être

string sql = String.Format("DELETE FROM {0}", table); 

un autre point: pour autant que je peux vous voir ne pas avoir de configuration de gestion des exceptions (try/catch ...) ce qui est une mauvaise pratique ...

+0

désolé, j'ai mis l'utilisation complètement fausse. J'ai besoin de mettre à jour le v et une colonne si l'identifiant existe déjà. Pardon – Patriotec

Questions connexes