Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Добрый день! Прошу помочь с такой проблемой:

Есть программа на c#, которая на определённом этапе выполняет следующий код:
 OleDbConnection con = new OleDbConnection(@"File Name = Connect.udl");
            using(con)
            {
                try
                {
                    OleDbCommand cmd_2 = new OleDbCommand("INSERT INTO [t_FilesUpdate] ([filename], [version], [date], [binary], [checksum])"
                       + "VALUES (?, ?,?,?,?)", con);

                    if (!IsFileLocked(file))
                    {


                        FileStream stream = new FileStream(
                            file.FullName, FileMode.Open, FileAccess.Read);
                        BinaryReader reader = new BinaryReader(stream);
                        byte[] imageBytes = reader.ReadBytes((int)stream.Length);
                        reader.Close();
                        stream.Close();

                        var md5 = MD5.Create();
                        byte[] hash = md5.ComputeHash(imageBytes);
                        //md5.Dispose();

                        cmd_2.Parameters.AddWithValue("@Filename", file.Name);
                        cmd_2.Parameters.AddWithValue("@Version", FileVersionInfo.GetVersionInfo(file.FullName).FileVersion);
                        cmd_2.Parameters.AddWithValue("@Date", DateTime.Now);
                        cmd_2.Parameters.AddWithValue("@binary", imageBytes);
                        cmd_2.Parameters.AddWithValue("@hash", hash);
                        con.Open();
                        
                        cmd_2.ExecuteNonQuery();
                        con.Close();
                        MessageBox.Show("Обновление успешно загружено!");
                    }
                    else
                    {
                        MessageBox.Show("Файл открыт другим приложением!");
                    }
                }


В БД поле поле binary имеет тип varbinary(max). При запуске на локальном сервере всё хорошо работает. Пробовал даже загрузить файл в 380МБ - всё хорошо. При загрузке на свой локальный сервер с другого компьютера (в пределах офиса) всё тоже проходит хорошо.

Запускаю программу на сервере объекта. Пытаюсь добавить файл. Добавляются все поля кроме varbinary. Биты добавляются корректно только при размере файла ~1КБ.

При попытке добавить файл в БД на объекте запуская программу загрузки на своём компьютере, так же добавляются корретно только файлы ~1КБ.

Где зарыта собака?
11 ноя 13, 17:29    [15110649]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

К сообщению приложен файл. Размер - 71Kb
11 ноя 13, 17:33    [15110695]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Алексей Ку.,

Поди, туннель где-то на маршруте кривит. Поставьте опцию "Размер сетевого пакета", скажем, 1460.
11 ноя 13, 17:35    [15110715]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Ennor Tiegael,
Поменял - без изменений :(
Может требует перезагрузки сервера?
11 ноя 13, 17:48    [15110830]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Ennor Tiegael,

А как туннель может кривить если даже при запуске с машины на объекте на которой висит сервер та же история? Т.е. локально тоже не работает.
11 ноя 13, 17:57    [15110911]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
public void InsertRow(string connectionString, string insertSQL)
{
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        // The insertSQL string contains a SQL statement that
        // inserts a new row in the source table.
        OleDbCommand command = new OleDbCommand(insertSQL);

        // Set the Connection to the new OleDbConnection.
        command.Connection = connection;

        // Open the connection and execute the insert command.
        try
        {
            connection.Open();
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        // The connection is automatically closed when the
        // code exits the using block.
    }
}


в качестве примера, обратите внимание , что вызывать метод Close у объекта не нужно. а также добавьте обработку ошибок и посмотрите , что у вас там происходит. кстати, объявление параметров лучше сделать с явным указанием их типов.
11 ноя 13, 17:59    [15110937]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Konst_One,

Подключение закроется автоматически при завершении программы?
Обработка есть (просто не стал загромождать топик), но никак ошибок не выдаётся!
11 ноя 13, 18:03    [15110961]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
command.Parameters.Add("@hash", OleDbType.binary, 16).Value = hash;
11 ноя 13, 18:06    [15110983]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
вот тут статейка подробней, правда к данному форуму не совсем относится. вообще этот топик стоит в C# перенести скорее всего

http://nullpro.info/2011/chteni-i-zapis-dvoichnyx-fajlov-v-bd/
11 ноя 13, 18:10    [15111010]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Konst_One,

Убрал закрытие подключения. Запустил на загрузку файл 78МБ. Программа долго висела, т.е. данные посылались серверу. В таблице появилась запись по этому файлу, но опять же с пустым полем Varbinary.

Делаю загрузку файла размером 9КБ. Всё загружается правильно,поле бинари проставилось как следует.
11 ноя 13, 18:13    [15111025]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Статья
http://nullpro.info/2011/chteni-i-zapis-dvoichnyx-fajlov-v-bd/
к сожалению не помогла. Сделал так же как в ней описано, но ситуация та же.
11 ноя 13, 18:25    [15111092]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Переделал под явное указание типов. Ничего не изменилось.
11 ноя 13, 18:35    [15111143]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Кинул ссылку в WinForms, .Net Framework

https://www.sql.ru/forum/1058509-a/ne-vstavlyaetsya-pole-binary-nastroyka-servera
11 ноя 13, 18:44    [15111189]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Sergey S
Member

Откуда: Киев
Сообщений: 215
А если профайлером посмтреть.... - Интересно что будет вставляться в базу?
11 ноя 13, 19:52    [15111473]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Алексей Ку.
В таблице появилась запись по этому файлу, но опять же с пустым полем Varbinary.
А как проверяли, что пустое?
11 ноя 13, 19:58    [15111505]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Matroz
Member

Откуда: Ekaterinburg
Сообщений: 230
AppendShunk попробовать, не?
11 ноя 13, 21:38    [15111804]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3692
По документации:
Binary - Array имеет тип данных Byte. Поток фиксированной длины из двоичных данных, имеющий длину от 1 до 8000 байтов.

Так что попробуйте тип
Image - Array имеет тип данных Byte. Поток переменной длины из двоичных данных, имеющий длину от 0 до 2 31 -1 (или 2 147 483 647) байтов.

Дополнительно: попробуйте, если не получится заменой типа поиграться с перегрузкой метода Add с параметром size

Ну и в чем прикол использования OleDB если для MS SQL есть нативный клиент?
11 ноя 13, 22:19    [15111920]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Поигрался и никаких изменений.

Решил переписывать всё заново и какие бы условия ни были под нативный клиент. А насколько разумно применять для вставки бинарного поля LINQ?
12 ноя 13, 11:09    [15113656]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алексей Ку.
Поигрался и никаких изменений.

Т.е. вы нашли, какую команду формирует ваш клиентский код для выполнения не сервере ?
12 ноя 13, 11:12    [15113670]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3692
Алексей Ку.,

что я делаю не так?

USE [Blobs]
GO

/****** Object:  Table [dbo].[Test]    Script Date: 12.11.2013 11:50:02 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Test](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[body] [varbinary](max) NULL,
 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


Результат:
SELECT TOP 1000
	[id],
	LEN(body)
FROM [Blobs].[dbo].[Test]

id (No column name)
1	12368512
2	10737
4	285344242


Код:
        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog fd = new OpenFileDialog() {CheckFileExists = true, Multiselect = false})
            {
                if(DialogResult.OK == fd.ShowDialog())
                {
                    byte[] file = File.ReadAllBytes(fd.FileName);

                    using (var con = new SqlConnection("Data Source=.;Initial Catalog=Blobs;Integrated Security=True"))
                    {
                        con.Open();

                        using (var cmd = new SqlCommand("insert into Test (body) values (@body); select scope_identity()", con) {CommandType = CommandType.Text, CommandTimeout = 0})
                        {
                            cmd.Parameters.Add("@body", SqlDbType.Image);
                            cmd.Parameters["@body"].SqlValue = file;

                            label1.Text = String.Format("Saved as {0}", cmd.ExecuteScalar());
                        }
                    }
                }
            }
        }
12 ноя 13, 11:53    [15113957]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Glory,
exec sp_executesql N'INSERT INTO [t_FilesUpdate] ([filename], [version], [date], [binary], [checksum]) VALUES (@P1, DEFAULT,@P3,@P4,@P5)',N'@P1 varchar(68),@P3 datetime,@P4 image,@P5 varbinary(16)','BuildVersionIncrement v2.5 (1).zip','2013-11-12 00:00:00',0x504...очень много битоффф...000,0x504B03041400000008006CB1073F7CD0


Что насчёт LINQ для вставки image?
12 ноя 13, 12:05    [15114056]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алексей Ку.
Glory,
exec sp_executesql N'INSERT INTO [t_FilesUpdate] ([filename], [version], [date], [binary], [checksum]) VALUES (@P1, DEFAULT,@P3,@P4,@P5)',N'@P1 varchar(68),@P3 datetime,@P4 image,@P5 varbinary(16)','BuildVersionIncrement v2.5 (1).zip','2013-11-12 00:00:00',0x504...очень много битоффф...000,0x504B03041400000008006CB1073F7CD0

И вы хотите сказать, что после выполнения такого инсерта с "0x504...очень много битоффф...000"
во вставленной записи "очень мало битоффф" ?
12 ноя 13, 12:07    [15114069]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
зачем вам LINQ ?
см выше, уже дали вам несколько раз решение.
12 ноя 13, 12:08    [15114084]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Arm79,

Забыл указать что по идее это условие использовать OleDb. Делать надо через него и тут обсуждать бессмысленно. Такое условие. Но я решил наплевать на него и сделать по-человечески через нативный клиент.
12 ноя 13, 12:09    [15114100]     Ответить | Цитировать Сообщить модератору
 Re: Не вставляется поле binary, настройка сервера  [new]
Алексей Ку.
Member

Откуда: Дубна
Сообщений: 295
Glory,

Вы предлагает мне привести тут 9КБ текста? ) Это я просто середину вырезал.
12 ноя 13, 12:10    [15114106]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить