Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как и куда можно прочитать varbinary(max) средствами Linq в код C#?

Читаю книжку Фримена Введение в ASP.NET MVC 4 ( ) и там описывается работа с изображениями. В примере используется Entity Framework
Изображение в книжке описывается как:
Код C# (класс товаров)
.....................................................................
public byte[] ImageData { get; set; }

[HiddenInput(DisplayValue = false)]
public string ImageMimeType { get; set; }
..................................................................

Поля в базе:
ImageData varbinary(max)
ImageMieType varchar(50)

И всё в примере получается замечательно

Я же использовал Linq to SQL и до этого момента всё получалось так же хорошо. Но на этом примере я встал в тупик. Не пойму как прочитать поле varbinary(max) из базы.
Стандартный код чтения из базы не работает и более того выдаёт синтаксическую ошибку.

    
public class ProductRepository : IProductRepository
    {
        private DBProductDataContext db = new DBProductDataContext();
        public IQueryable<Product> Products
        {
            get
            {
                IQueryable<Product> qProduct = from prods in db.Products
                                               select new Product
                                               {
                                                   ProductID = prods.ProductID,
                                                   Name = prods.Name,
                                                   Description = prods.Description,
                                                   Price = prods.Price,
                                                   Category = prods.Category,
                                                   [b][SIZE=4]ImageData = prods.ImageData[/SIZE],[/b]
                                                   ImageMimeType = prods.ImageMimeType
                                               };
                return qProduct;
            }
        }


Как поступать-то?
Ответ:
ValGer
однако не учёл, что в некоторых случаях картинка может отсутствовать (null в этом поле) - поэтому и выходила ерунда.

Бывает :)
Вопрос: Как Выбрать данные из MSSQL varbinary

Привет всем форумчанам.

Имеется MSQQL 2000 база-таблица и в ней поле Inventory <varbinary> размер 1728
в этом поле находится содержимое инвенторя игрового персонажа.

значится когда запускаю Ms QueryAnalizer и выполняю код
Код

Select Inventory From Character Where Name = 'Dark'


то выводит как положено
Код

0x0EEE8C003E74C27F00200000000000000500EC0000036F0000D0000000000000066E6B00A971797F09700000000000000
66E6B00F522547F0980000000000000066E6B002326C37F0990000000000000066E5700121E767F00A00000000000000
66E5700EB515D7F00B00000000000001E6EF700B80FA87F00D0000000000000


но такое не прокатывает в бормане 2010

Код

     ADOQuery1->SQL->Clear();             //varbinary
     ADOQuery1->SQL->Text = "Select  Inventory from dbo.Character where [Name]='"+ComboBox2->Text+"'";
     ADOQuery1->Open();


RecordCount показывает что есть 1 набор 
а вот длина всего 2.
Я так понимаю что он доходит до первого  нулевого символа и все.

ребята спасайте плз запарился

Это сообщение отредактировал(а) XPyCT - 25.11.2014, 16:23
Ответ:



Вопрос: Как прочитать и раскодировать из SQL server поле типа varbinary из sql server

Как прочитать и раскодировать из SQL server поле типа varbinary из sql server
хочу сдеть это через SqlDataRader
Желательно получить массив байтов.
Нашёл интересный метод SqlDataReader.GetStream но вот примеров использования не нашёл.
А может быть это делают по другому
Да и в форуме SQL по моему этот вопрос мало обсуждался
Можно конечно ещё и image.
Как лучше?
Ответ:
Вопрос: методы value и nodes

Добрый день!

Уважаемые формучане, не могли бы вы помочь в решении следующей задачи?

Есть столбец в формате image, после приведения в типу хml пытаюсь реализовать следующий код:


WITH XMLNAMESPACES(
DEFAULT '
' AS REP
)

SELECT C.ItemID,
C.Name,
C.Path,
DataSetXML.value('@Name', 'varchar(MAX)') DataSourceName,
DataSetXML.value('REP:Query[1]/REP:CommandText[1]', 'varchar(MAX)') CommandText,
ReportXML
FROM (SELECT ItemID,
CAST(CAST(CONTENT AS VARBINARY(MAX)) AS XML) ReportXML
FROM [dbo].[Catalog]
WHERE [Content] IS NOT NULL)ReportXML
OUTER APPLY ReportXML.nodes('//REP:DataSet') DataSetXML(DataSetXML)
LEFT JOIN [dbo].[Catalog] c
ON ReportXML.ItemID = c.ItemID
WHERE C.Name LIKE '%закрытым%


Никакого разбиения строк не происходит и в 4 и 5 столбце выпадают значение NULL.
Ответ: Вот так заработало

SELECT distinct SUBSTRING(
x.CatContent
,x.CIndex
,CHARINDEX('"',x.CatContent,x.CIndex+7) - x.CIndex
)
FROM
(
SELECT CatContent = CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)))
,CIndex = CHARINDEX('xmlns="',CONVERT(NVARCHAR(MAX),CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content))))
FROM dbo.Catalog C
WHERE C.Content is not null
AND C.Type = 2
) X
;
WITH XMLNAMESPACES ( DEFAULT ' , ' AS rd )
SELECT ReportName = name
,DataSourceName = x.value('(Query/DataSourceName)[1]','VARCHAR(250)')
,CommandText = x.value('(Query/CommandText)[1]','VARCHAR(250)')
,path
FROM ( SELECT C.Name, c.path,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML

FROM dbo.Catalog C
WHERE C.Content is not null
AND C.Type = 2
) a
outer APPLY reportXML.nodes('/Report/DataSets/DataSet') r ( x )
ORDER BY name
Вопрос: GUID по дате

Добрый день!

В SQL'ке есть функция которая выдает гуид по переданной дате создания и пользователю:

Return Cast(@Date As VarBinary(8)) + Cast(@User As VarBinary(4)) + Cast(@User As VarBinary(4))


Нужна аналогичная функция на дельфи, пытаюсь сделать что то наподобие:
function IntToBinary(AValue: integer): string;
var
  lValue: array[1..4] of byte absolute AValue;
  I: Integer;
begin
  for I := 4 downto 1 do
   Result := Result + IntToStr(lValue[I]);
end;

function DateTimeToBinary(AValue: TDateTime): string;
var
  lValue: array[1..8] of byte absolute AValue;
  I: Integer;
begin
  for I := 8 downto 1 do
   Result := Result + IntToStr(lValue[I]);
end;

c integer все в норме, но вот с датой проблемы результат
Cast(@Date As VarBinary(8))
и
DateTimeToBinary
совсем разный. Пробовал в дельфи дату представлять как два отдельных integer(дата и время) и раскладывать по байтам но все равно не то(при этом integer(даты) после разложения совпадает а integer(времени) нет).
Ответ: x1ca4064,

Тогда в чем проблема сделать свой guid record и заполнять любыми данными -- лишь бы итоговая размерность всех совпадала с обычным guid. Например, вставив туда поля со временем и ид пользователя и заполнив оставшееся чем-то еще.

TmyGUID = packed record
  D1: LongWord;
  D2: Word;
  D3: Word;
  D4: array[0..7] of Byte;
end;
Вопрос: TClientDataSet - ошибка с TParam BLOB (ftBlob)

Добрый день!
Хочу записать данные в двоичное поле БД через Сторед процедуру.

Процедура принимает 2 параметра :
int UserID 
varbinary(max) Photo

Делаю чисто на ADO:
ADO.ProcedureName:='spui_SetClientPhoto';
ADO.Parameters.CreateParameter('@Photo',ftBlob,pdInput,0,NULL);
ADO.Parameters[0].LoadFromFile('C:\Param.png',ftBlob);
ADO.ExecProc;

Результат: Всё работает.

Делаю через CDS:
ADO.ProcedureName:='spui_SetClientPhoto';
cds.SetProvider(ADO);
cds.Params.CreateParam(ftBlob,'@Photo',ptInput).LoadFromFile('C:\Param.png', ftBlob);
cds.Execute;

Через CDS результат : Implicit Conversion from datatype Varchar(max) to Varbinary(max) is not allowed.
Может знает кто, какие буквы ещё надо написать, что бы это заработало через CDS ?
Ответ: Valery_B,

руки бы оторвать вашему проектировщику
впрочем подозреваю, что ТС и проектировщик - одно лицо )))
тогда рви только волосы
Вопрос: Ввод картинки в базу SQL Server и превышение длины строки

Здравствуйте, возникла такая проблема.
При попытке ввести картинку кодом

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
OpenFileDialog opf = new OpenFileDialog();
            if (opf.ShowDialog() == DialogResult.OK)
            {
                bmp = new Bitmap(opf.FileName);
                pictureBox1.Image = bmp;
            }
            using (SqlConnection conn = new SqlConnection(connection_string))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("INSERT INTO WaterMark(id,[image]) VALUES (1,@img)", conn);
                cmd.Parameters.Add("@img", SqlDbType.VarBinary); 
                MemoryStream ms = new MemoryStream();               
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                cmd.Parameters["@img"].Value = ms.ToArray();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
Выскакивает ошибка
: Не удалось создать строку размером 8081, который превышает допустимый размер, равный 8060.

В самой базе, столбец image имеет тип данных VarBinary(MAX)

Не понимаю как избавиться от проблемы. Помогите.
Ответ: Usaga, это потому что id не был счетчиком.

Igr_ok, Спасибо. Не знаю что у меня там было, но перешел на вашу таблицу и все заработало.
Вопрос: Неправильно записываются двоичные данные в таблицу БД

Здравствуйте, уважаемые!

Уже сбилась с ног, никак не могу понять в чем ошибка...

Суть проблемы. Пишу картинку в таблицу SQL, тип данных - varbinary(MAX), передаю туда byte[]. Из программы я вижу, что все туда передается, но вот в саму таблицу пишутся данные вида "0х42" и подобные, в зависимости от того, что использую - FileStream или MemoryStream. И в итоге у меня читается только 1 байт. Почему так может быть? Где остальные цифири теряются?

Заранее благодарю за ответы!

Добавлено через 4 минуты
Нашла! Аж голова уже болит... Проблема была в том, что в хранимой процедуре, которая записывает данные в таблицу, я указала просто varninary, вместо varbinary(MAX).
Ответ:

Не по теме:

Лакшми, вы не показали код, который выполнял запись в базу. Т.е. не предоставили всей необходимой информации для решения, только часть её.

Сообщение от Лакшми
Нужны были бы подробности, я бы их предоставила.
Без подробностей вам помогут только на РЕН-ТВ.

Вопрос: Регулярное выражение вместо перебора массива регулярок

Для прототипа поля прототипа формы достаю данные из схемы и пытаюсь преобразовать sql-типы в html-типы вот так:

Код:
      $sql_types=array(
         'varchar|text|year|char|tinytext|mediumtext|longtext' => 'text',
         'int|decimal|tinyint|smallint|mediumint|bigint|float|double|real' => 'number',
         'binary|varbinary|tinyblob|mediumblob|blob|longblob' => 'file',
         'enum|set'=>'select',
         'bit|boolean|serial'=>'checkbox',
         'timestamp' => 'datetime-local'
      );
   
      $type2input=function($type) use($sql_types) {
         foreach($sql_types as $types=>$input)
            if(preg_match('/^(?:'.$types.')$/',$type))
               return $input;
         return $type;
      };



Вопрос такой - можно сделать это одними только регами? Без php-шного перебора, то есть.

Попадались способы обозначить результат совпадений ключом чтобы, значит и забрать по нему из массива. Осмотрена и функция preg_grep()... в общем не соображу, подскажите как.
Ответ: Зачем что - то преобразовывать, если в поле формы попадет все равно обработанный текст?)
А тип поля можно получить с помощью
Вопрос: ошибка в атаче письма

Доброе время суток.

Есть такая проблема. В БД MS SQl server сохраняются сканы документов, в разных форматах (jpeg,pdf и т.д.).
Потом они могут отправляться по почте в присоединенном файле. Письма отправляются с помощью SmtpClient с сайта.
Аттач присоединяется так:
message.Attachments.Add(new Attachment(doc.Content, doc.FileName, doc.MediaType))

Изредка аттачи приходят в виде: =utf-8BOLTQvt......... (судя по всему в utf-8 перекодируются).

В БД файл нормальный, если его вытащить той же функцией и сохранить на диск, то всё хорошо. В БД файлы хранятся как varbinary(max), а названия как nvarchar.
Если запустить эту процедуру повторно, на тестовом сервере, то повторить такое не удаётся, файлы приходят хорошие.
Пока такое происходила только с файлами, которые содержат русские буквы в названии, но большинство файлов, содержащих русские буквы в названии, приходят нормально.

Не подскажите как попробовать повторить (сломать) аттачмент или что посмотреть в настройках или как решить такую проблему?
Ответ:
Askeros
Кстати, а у кого-нибудь работает ссылка, чтоб скачать этот хотфикс?


.. ради интереса попробовал - не работает .. но работала, я ее несколько лет назад ставил ... :) .. возможно в NET 4.5 оно уже пофиксено по умолчанию .... ну, или переименовывайте файлы в короткое имя перед сохранением в базу ...