Linq to sql截断存储过程返回的字符串

时间:2009-06-25 14:59:06

标签: linq linq-to-sql c#-3.0

我之前问过这个问题。但我无法得到任何答案。可能我不是很清楚。让我提供一些细节。

我有一个返回长字符串的SP。这是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));
}

这是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;
            }
         }
     }
}

这是我的代码

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

string returnStr = result.First().XML_F52E2B61_18A1_11d1_B105_00805F49916B;

一切都很好,当结果不是长字符串时,但只要sp返回一个很长的字符串,它就会截断结果。我不知道为什么......有人可以帮忙。

感谢

3 个答案:

答案 0 :(得分:1)

我能发现的唯一可疑的是这个 - 在宣言中,你好了:

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

(DbType = VARCHAR(8000)) - 这是ANSI(非Unicode),但是在列声明中你使用NTEXT - 首先,那是UNICODE(每个字符2个字节),以及为什么NTEXT ??上面你有VARCHAR?

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

这看起来有点奇怪.......

你能尝试在两个地方做同样的事情吗?例如。两种情况下都是VARCHAR(8000)??

马克

答案 1 :(得分:1)

LinqToSql将XML结果集拆分为块,因此您需要运行如下循环:

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

或使用LINQ:

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

答案 2 :(得分:0)

只需从

更改你的sp
SELECT ...
  FROM MyTable
  FOR XML AUTO

DECLARE @ResultXML xml

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

SELECT @ResultXML as [MyXML]

并重新创建linq方法