2009-06-25 8 views
1

J'ai déjà posé cette question auparavant. mais je n'étais pas en mesure d'obtenir une réponse. Peut-être que je n'étais pas très clair. permettez-moi de donner plus de détails.Chaîne tronquée Linq to sql renvoyée par la procédure stockée

J'ai un SP qui renvoie une chaîne longue. voici le code de fichier dbml

[Function(Name="dbo.spX")] 
public ISingleResult<spXResult> spX([Parameter(DbType="VarChar(8000)")] string str) 
{ 
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), str); 
    return ((ISingleResult<spXResult>)(result.ReturnValue)); 
} 

et voici la classe spXResult

public partial class spXResult 
{ 
    private string _XML_F52E2B61_18A1_11d1_B105_00805F49916B; 

    public spXResult() 
    { } 

    [Column(Name="[XML_F52E2B61-18A1-11d1-B105-00805F49916B]", 
    Storage="_XML_F52E2B61_18A1_11d1_B105_00805F49916B", 
    DbType="NText", UpdateCheck=UpdateCheck.Never)] 
    public string XML_F52E2B61_18A1_11d1_B105_00805F49916B 
    { 
     get 
     { 
      return this._XML_F52E2B61_18A1_11d1_B105_00805F49916B; 
     } 
     set 
     { 
      if ((this._XML_F52E2B61_18A1_11d1_B105_00805F49916B != value)) 
      { 
       this._XML_F52E2B61_18A1_11d1_B105_00805F49916B = value; 
      } 
     } 
    } 
} 

et voici mon code

ISingleResult<spXResult> result = ctx.spX("1234"); 

string returnStr = result.First().XML_F52E2B61_18A1_11d1_B105_00805F49916B; 

tout va bien, lorsque le résultat est pas une chaîne longue, mais dès que le sp renvoie une très longue chaîne, il tronque le résultat. Je n'ai aucune idée pourquoi .. quelqu'un peut-il m'aider s'il vous plaît.

grâce

+0

Pouvez-vous être plus précis sur la longueur d'une « très longue chaîne » s'il vous plaît? De plus, quel serveur de base de données utilisez-vous et avez-vous vérifié que la chaîne n'est pas tronquée dans la base de données? –

+0

im en utilisant SQL Server 2005, et non son ne pas tronqué sur le serveur de base de données. bien .. je ne sais pas la longueur exacte, mais peut être après 8000 caractères. Pensez-vous que je devrais essayer IMultipleResults? –

+1

Si votre définition de colonne est varchar (8000) et que les données contiennent 8001 caractères ou plus, elles sont tronquées dans la base de données. Le code que vous avez ici semble également traiter des données XML. Sql Server 2005 a un type de données XML pour cela qui peut mieux convenir à votre objectif. –

Répondre

1

La seule chose de louche, je peux repérer est ce - ici dans la déclaration, vous hvae:

public ISingleResult<spXResult> spX([Parameter(DbType="VarChar(8000)")] string str) 

(DbType = VARCHAR (8000)) - qui est ANSI (non-Unicode), mais dans la déclaration de colonne, vous utilisez NTEXT - tout d'abord, c'est UNICODE (2 octets par caractère), et pourquoi NTEXT ?? Ci-dessus vous avez VARCHAR?

[Column(Name="[XML_F52E2B61-18A1-11d1-B105-00805F49916B]", 
    Storage="_XML_F52E2B61_18A1_11d1_B105_00805F49916B", 
    DbType="NText", UpdateCheck=UpdateCheck.Never)] 

Cela semble un peu bizarre .......

Pouvez-vous essayer de faire la même chose dans les deux endroits? Par exemple. VARCHAR (8000) dans les deux cas ??

Marc

+0

J'ai essayé cela aussi. En fait, j'ai modifié la méthode pour retourner IMULtipleResults et regarder à travers pour obtenir le reste de la chaîne .. le comportement est bizarre.peut être quelque chose limite la longueur de la chaîne de retour –

+0

loop thru je veux dire –

+2

Pouvez-vous vérifier dans la base de données combien de temps ces chaînes sont ?? SELECT (chaîne), DATALENGTH (chaîne) FROM (table) - et voyez s'il y en a plus de 8000 caractères? –

0

il suffit de changer votre sp de

SELECT ... 
    FROM MyTable 
    FOR XML AUTO 

à

DECLARE @ResultXML xml 

SET @ResultXML = 
(SELECT ... 
    FROM MyTable 
    FOR XML AUTO) 

SELECT @ResultXML as [MyXML] 

et recréez méthode LINQ

1

LinqToSql divise le résultat XML mis en morceaux, de sorte que vous devez exécutez une boucle comme celle-ci:

ISingleResult<spXResult> result = ctx.spX("1234"); 
string xml = ""; 
foreach (var x in result) 
    xml += x.XML_F52E2B61_18A1_11d1_B105_00805F49916B; 

Ou LINQ:

string xml = result.Aggregate("", (current, x) => current + x.XML_F52E2B61_18A1_11d1_B105_00805F49916B); 
Questions connexes