2009-06-25 5 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

あなたは「非常に長い文字列」の長さについてより具体くださいことはできますか?また、どのデータベースサーバーを使用していて、文字列がデータベースで切り捨てられていないことを確認しましたか? –

+0

imはSQLサーバー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(非Unicodeであります)しかし、列宣言では、まずNTEXTを使用します。これはまずUNICODE(1文字あたり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を返すようにメソッドを変更し、文字列の残りの部分を取得するために見ます..動作は変です。私は –

+0

ループをlimitngさsomehthingすることができます? SELECT(文字列)、DATALENGTH(文字列)FROM(テーブル) - 実際に8000文字以上あるかどうかを確認します。 –

+2

は、あなたがこれらの文字列はどのように長いDBで確認することができます意味を通して返される文字列の長さ –

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を変更して再作成します次のようなループを実行してください:

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); 
関連する問題