2009-08-04 6 views
0

Je souhaite lire beaucoup de données (une seule colonne nvarchar (max)) à partir de SQL Server 2005 et les désérialiser vers un objet. Nous utilisons actuellement ce qui suit, mais ce n'est pas assez rapide, y a-t-il un moyen meilleur/efficace de le faire?Lire les données UTF8 (XML) de SQL Server 2005 de la manière la plus efficace

using(MemoryStream stream = Encoding.UTF8.GetBytes((string)cmd.ExecuteScalar())) 
{ 
    XmlTextReader xmlReader; 
    DataContractSerializer deserializer; 

    deserializer = new DataContractSerializer(typeToDeserialize); 
    xmlReader = new XmlTextReader(stream); 
    return deserializer.ReadObject(xmlReader); 
} 

J'ai essayé als de le faire avec un SqlDataReader et GetBytes mais je reçois des exceptions.

Merci d'avance.

Répondre

0

Avez-vous la possibilité de commuter pour utiliser le type de données XML? Il stocke les données dans un format binaire et expose les résultats XML en tant qu'instance XmlReader. Vous analysez les données lorsque vous les lisez dans la base de données, mais si vous avez utilisé une colonne XML, elle sera déjà analysée.

En attendant, essayez quelque chose comme ceci:

string s; 
using (SqlConnection conn = new SqlConnection("")) 
{ 
    using (SqlCommand cmd = new SqlCommand("", conn)) 
    { 
     s = (string) cmd.ExecuteScalar(); 
    } 
} 
using (StringReader sr = new StringReader(s)) 
{ 
    using (XmlReader reader = XmlReader.Create(sr)) 
    { 
     DataContractSerializer deserializer = 
      new DataContractSerializer(typeToDeserialize); 
     return deserializer.ReadObject(reader); 
    } 
} 
  1. Ne pas utiliser XmlTextReader plus.
  2. Pourquoi convertir la chaîne en octets et revenir en chaîne?
+0

John thanx Je vais essayer ça. Je vais vous le faire savoir – JSC

+0

Étrangement le problème est la latence d'un résultat de requête au framework .NET (La requête a une durée de 0ms et il n'y a pas de latence réseau). Sur notre serveur (VMware), je reçois en moyenne 400 recs p/s à un seul thread (2K xml) avec un taux de processeur de 5% maximum. Ceci est fait avec une boucle vide while while. – JSC

0

Je ne l'ai pas testé moi-même, mais SqlDataReader avec un appel à GetSqlBytes semble être un meilleur choix car il expose une propriété Stream que vous devriez pouvoir passer directement à XmlTextReader?

Il existe des informations sur MSDN à propos de GetSqlBytes here.

Questions connexes