2009-06-25 3 views
1

나는 전에이 질문을했습니다. 그러나 나는 어떤 대답도 얻을 수 없었다. 나는 아주 명확하지 않았다. 좀 더 자세히 설명하겠습니다.Linq 저장 프로 시저에 의해 반환 된 문자열을 자름 SQL

긴 문자열을 반환하는 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가 매우 긴 문자열을 리턴하자마자 결과를 잘라 버린다. 나는 아무런 단서도 없다. 누군가 도와 줄 수 있을까?

감사

+0

당신이하시기 바랍니다 "매우 긴 문자열"의 길이에 대한보다 구체적인 될 수 있을까? 또한 어떤 데이터베이스 서버를 사용하고 있으며 문자열이 db에서 잘리지 않는지 확인 했습니까? –

+0

메신저는 SQL Server 2005를 사용하며 데이터베이스 서버에서 잘리지 않습니다. 글쎄 .. 난 정확한 길이를 모르지만, 8000 문자 뒤에있을 수 있습니다. 내가 IMultipleResults를 시도해야한다고 생각하니? –

+1

열 정의가 varchar (8000)이고 데이터가 8001 자 이상인 경우 데이터베이스에서 잘립니다. 여기에있는 코드는 XML 데이터를 처리하는 것으로 보입니다. Sql Server 2005에는 용도에 더 적합한 XML 데이터 형식이 있습니다. –

답변

1

내가 발견 할 수 비린내가 유일한 것은 이것이다 - 여기 선언에, 당신은 hvae :

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

(DbType과 = VARCHAR (8000)) - ANSI입니다 (비 유니 코드를), 그런 다음 열 선언에서 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) ??

마크

+0

나는 그것을 시도했다. 실제로 나는 IMULtipleResults를 반환하고 문자열의 나머지 부분을보기 위해 메소드를 수정했다. 동작이 이상하다.somehthing은 반환 문자열 길이가 제한되어 있습니다 –

+0

내 말은 –

+2

을 의미합니다. DB의 길이를 확인할 수 있습니까? SELECT (문자열), DATALENGTH (문자열) FROM (테이블) - 실제로 8000 개가 넘는 문자가 있는지 확인합니다. ?? –

0

그냥 당신이 필요하므로,

1

LinqToSql가 덩어리로 설정 한 XML 결과를 분할 LINQ 방법을

DECLARE @ResultXML xml 

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

SELECT @ResultXML as [MyXML] 

SELECT ... 
    FROM MyTable 
    FOR XML AUTO 

에서 SP를 변경하고 다시 다음과 같은 루프를 실행하십시오 :

,210
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); 
관련 문제