the_smiths Ответов: 2

Как преобразовать поле изображения SQL server в текст?


У меня есть поле в базе данных Sql Server, тип данных этого поля-изображение, по-видимому, содержимое этого поля-текст из электронной почты.

Как извлечь читаемый текст, если тип данных-это изображение?

Что я уже пробовал:

Я перепробовал множество вариаций -

язык SQL -
select cast(cast(emailCompressed as varbinary(MAX)) as nvarchar(max)) as emailCompressed
from   [DB].[EmailMessage] where emailID = 1


и

С# -
byte[] gzBuffer = (byte[])reader["emailCompressed"];


                        using (MemoryStream ms = new MemoryStream())
                        {
                            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
                            ms.Write(gzBuffer, 0, gzBuffer.Length);

                            byte[] buffer = new byte[msgLength];

                            ms.Position = 0;
                            int length;
                            using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
                            {
                                length = zip.Read(buffer, 0, buffer.Length);
                            }

                            var data = new byte[length];
                            Array.Copy(buffer, data, length);
                            string s = Encoding.UTF8.GetString(data);

                        }

Richard Deeming

NB: типы данных ntext, text и image[^] будет удален в будущей версии SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте изменять приложения, которые в настоящее время их используют. Воспользуйся nvarchar(max), varchar(max), и varbinary(max) вместо.

Это предупреждение было в документации Microsoft в течение 15 лет. Вероятно, было бы неплохо начать обновлять свои базы данных, чтобы вместо этого использовать поддерживаемые типы. :)

the_smiths

Я полностью с тобой согласен, приятель. Я бы никогда не использовал поле изображения сам, но это не моя база данных, это из старой системы. Есть какие-нибудь идеи решения? Овации.

2 Ответов

Рейтинг:
10

the_smiths

Мне удалось заставить его работать. -

byte[] gzBuffer = (byte[])reader["emailCompressed"];

MemoryStream ms1 = новый MemoryStream(gzBuffer);

DeflateStream df1 = новый DeflateStream(ms1, режим сжатия.Распаковать, правда);


var sr = новый StreamReader(df1);

строка res = sr.ReadToEnd();


Рейтинг:
0

OriginalGriff

Поле изображения-это просто поток байтов, поэтому, если оно содержит текст, просто преобразуйте его в свой код C# :

byte[] bytes = ...
string s = System.Text.Encoding.UTF8.GetString(bytes);
Кодировка может быть ASCII, UTF16. или UTF8 в зависимости от того, что было использовано для преобразования тела письма в байты в первую очередь.


the_smiths

Боюсь, это не сработало, просто выходит мусор, по-видимому, он застегнут, поэтому мне приходится использовать что-то вроде GZip.