Строка усечения Linq в sql, возвращаемая хранимой процедурой

Asked
Viewd1525

1

Я задавал этот вопрос раньше. но я не смог получить никакого ответа. может быть я был не очень ясен. позвольте мне рассказать подробнее.

У меня есть 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 возвращает очень длинную строку, он обрезает результат. я понятия не имею, почему ... может кто-нибудь, пожалуйста, помогите.

спасибо

  • Увидев такой код, я просто выключил компьютер и пошел домой.

    vidalsasoon25 июня 2009, 15:22
  • Если определение столбца - varchar (8000), а длина данных составляет 8001 символ или более, в базе данных они усекаются. Код, который у вас здесь, похоже, также имеет дело с данными XML. Sql Server 2005 имеет для этого тип данных XML, который может лучше соответствовать вашим целям.

    Rob Allen25 июня 2009, 15:19
  • Я использую SQL Server 2005, и он не усекается на сервере базы данных. ну .. я не знаю точной длины, но может быть после 8000 символов. как вы думаете, мне стоит попробовать IMultipleResults?

    jyotishka bora25 июня 2009, 15:10
  • Не могли бы вы уточнить длину «очень длинной строки»? Кроме того, какой сервер базы данных вы используете и проверили ли вы, что строка не усекается в базе данных?

    Rob Allen25 июня 2009, 15:05

3 ответов

0

Просто измените SP с

 SELECT ...
  FROM MyTable
  FOR XML AUTO
 

в

 DECLARE @ResultXML xml

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

SELECT @ResultXML as [MyXML]
 

и воссоздать метод linq

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) в обоих случаях ??

Марк

  • Можете ли вы проверить в БД, какова длина этих строк ?? SELECT (строка), DATALENGTH (строка) FROM (таблица) - и посмотрите, действительно ли какие-то из них больше 8000 символов ??

    marc_s25 июня 2009, 15:47
  • Я тоже пробовал это. На самом деле я изменил метод, чтобы вернуть IMULtipleResults и просмотреть, чтобы получить остальную часть строки .. поведение странное. может быть что-то ограничивает длину возвращаемой строки

    jyotishka bora25 июня 2009, 15:21