powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ошибка "String or binary data would be truncated"
12 сообщений из 12, страница 1 из 1
ошибка "String or binary data would be truncated"
    #39943393
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь загрузить данные и файл в БД. Поля на скрине

Метод:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
string querySaveFile = String.Format("select t1.id, t1.{0}, t2.{1} " +
                "from {2}.dbo.{3} t1 " +
                "left join {4}.dbo.{5} t2 on t1.id = t2.{6} " +
                "where t1.id = {7}",
                 ConnectionString.DoVarchar, colNameImageCmb.Text, ConnectionString.InitialCatalog, ConnectionString.TableNameText,initialCatalogTxb.Text, tableNameCmb.Text, fieldCommunicationCmb.Text, fileId);
command = new SqlCommand(querySaveFile, conn);
reader = command.ExecuteReader();
dt.Load(reader);
reader.Close();
foreach (var item in dt.Select())
{
   string fileName = (string)item[ConnectionString.DoVarchar];
   String newFileName = Path.GetInvalidPathChars().Aggregate(fileName, (current, invalid_char) => current.Replace("'", "_"));
    byte[] fileContent = (byte[])item[colNameImageCmb.Text];;


    string queryLoad = "UPDATE @table_name SET @filestream = @file_content, @datetime = (GetDate()) where \"id\" = @file_id";                                      
    command = new SqlCommand(queryLoad, conn);
    command.Parameters.Add("@table_name", SqlDbType.VarChar, ConnectionString.TableNameText.Length).Value = ConnectionString.TableNameText;
    command.Parameters.Add("@filestream", SqlDbType.VarChar, ConnectionString.Filestream.Length).Value = ConnectionString.Filestream;                                      
    command.Parameters.Add("@datetime", SqlDbType.VarChar, ConnectionString.Datetime.Length).Value = ConnectionString.Datetime;
    command.Parameters.Add("@file_content", SqlDbType.VarBinary, fileContent.Length).Value = fileContent;
    command.Parameters.Add("@file_id", SqlDbType.Int).Value = fileId;
    ommand.ExecuteNonQuery();                                            
  }
}



вылетает ошибка
Код: sql
1.
String or binary data would be truncated. The statement has been terminated

.
Поле вмещает в себя max размер, неужели оно не влазит в него? В чем может быть причина?
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39943395
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erleug

String or binary data would be truncated.

... skipped ... В чем может быть причина?

Причина может быть вовсе не в бинарном поле, а в одном из текстовых.
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39943398
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/binary-and-varbinary-transact-sql?view=sql-server-ver15 Значение max указывает, что максимальный размер при хранении составляет 2^31-1 байт.
т.е. максимум 2 Гб
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39943402
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/binary-and-varbinary-transact-sql?view=sql-server-ver15 Значение max указывает, что максимальный размер при хранении составляет 2^31-1 байт.

т.е. максимум 2 Гб

у меня ошибка вылетает на файле в 40 кб
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39943406
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
private void TransferFiles()
        {
            int fileId = 0;
            using (SqlConnection conn = new SqlConnection(ConnectionString.Value))
            {
                try
                {
                    conn.Open();
                    string fullPath = System.Reflection.Assembly.GetAssembly(typeof(Form1)).Location;                    
                    string theDirectory = Path.GetDirectoryName(fullPath);                                             
                    DataTable dt = new DataTable();
                    DataTable dt2 = new DataTable();
                    string queryOpen = String.Format("select top {7} t1.id, t1.{0}, t2.{1} " +
                                                     "from {2}.dbo.{3} t1 " +
                                                    "left join {4}.dbo.{5} t2 on t1.id = t2.{6} " +
                                                     "where t2.{1} is not null and t1.{8} is null",
                                                     ConnectionString.DoVarchar, colNameImageCmb.Text, ConnectionString.InitialCatalog, ConnectionString.TableNameText,  initialCatalogTxb.Text, tableNameCmb.Text, fieldCommunicationCmb.Text, numericNumberOfLines.Value, ConnectionString.Datetime);                    
                    if (!String.IsNullOrEmpty(tableNameCmb.Text) && !String.IsNullOrEmpty(colNameImageCmb.Text) && !String.IsNullOrEmpty(fieldCommunicationCmb.Text))
                    {
                        SqlCommand command = new SqlCommand(queryOpen, conn);
                        SqlDataReader reader = command.ExecuteReader();
                        dt.Load(reader);
                        reader.Close();                       
                        if (dt.Rows.Count != 0)                                                                     
                        {
                            foreach (var item in dt.Select())
                            {
                                fileId = (int)item["id"];                                
                                string fileName = (string)item[ConnectionString.DoVarchar];
                                byte[] fileContent = (byte[])item[colNameImageCmb.Text];

                                    using (FileStream fs = new FileStream(newFileName, FileMode.OpenOrCreate))
                                    {
                                        fs.Write(fileContent, 0, fileContent.Length);
                                    }
                                    
                                    string queryLoad = "UPDATE ETA_EL_DOC SET @filestream = @file_content, @datetime = (GetDate()) where \"id\" = @file_id";
                                    command = new SqlCommand(queryLoad, conn);
                                    command.Parameters.Add("@filestream", SqlDbType.VarChar, 1000).Value = ConnectionString.Filestream;
                                    command.Parameters.Add("@datetime", SqlDbType.VarChar, 1000).Value = ConnectionString.Datetime;
                                    command.Parameters.Add("@file_content", SqlDbType.VarBinary, fileContent.Length).Value = fileContent;
                                    command.Parameters.Add("@file_id", SqlDbType.Int).Value = fileId;
                                    command.ExecuteNonQuery();
                                  
                                    File.Delete(fileName);                                                                       
                                }
                            }
                            MessageBox.Show("Копирование успешно завершено!");
                        }
                        else MessageBox.Show("Нет доступных данных для копирования!");
                    }
                    else
                        MessageBox.Show("Выберите все поля!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }



это мой изначальный вариант, так все работает. Но из-за загруженности памяти, которой бывает недостаточно, если запрос вытягивает 50000+ строк и вылетают ошибки про недостаточность памяти.

Попробовал переделать и изначально не вытягивать поле Image с данными, а после его отработки внутри запустить второй цикл с запросом только на поле Image, и тогда вылетает вот такая ошибка, как описал изначально
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39943697
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erleug
Но из-за загруженности памяти, которой бывает недостаточно, если запрос вытягивает 50000+ строк и вылетают ошибки про недостаточность памяти.

Всё вышеприведенное можно сделать одним апдейтом с джойном, не гоняя мегаабайты данных между клиентом и сервером..
Ну, и да, без DDL таблиц в такой ситуации можно разве что погадать на кофейной гуще.
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39944195
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны
erleug
Но из-за загруженности памяти, которой бывает недостаточно, если запрос вытягивает 50000+ строк и вылетают ошибки про недостаточность памяти.

Всё вышеприведенное можно сделать одним апдейтом с джойном, не гоняя мегаабайты данных между клиентом и сервером..
Ну, и да, без DDL таблиц в такой ситуации можно разве что погадать на кофейной гуще.


имеется ввиду переноси байтов напрямую из одной базы в другую? без промежуточного сохранения на диск?
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39944209
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем интересно, если вручную с sql сервера закидывать файл, он отлично загружается, если через запрос в программе то вылетает ошибка что данные усечены, не пойму что ему не нравится
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39944214
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erleug
имеется ввиду переноси байтов напрямую из одной базы в другую? без промежуточного сохранения на диск?

Ну да. Зачем здесь промежуточное сохранение?
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39944217
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны
erleug
имеется ввиду переноси байтов напрямую из одной базы в другую? без промежуточного сохранения на диск?

Ну да. Зачем здесь промежуточное сохранение?


так как я не профи в базах, сделал через вытягивания данных в переменные, а потом через другой запрос уже загрузка файлов в другую бд. Оказывается можно все одним запросом, не знал. Не подскажете, где можно посмотреть как это можно осуществить?
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39944225
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erleug
Не подскажете, где можно посмотреть как это можно осуществить?

В MSDN.
Простейший пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
use master
go
create database db1
go
create database db2
go
use db1
go
create table dbo.testdata (
  id int not null primary key,
  data varbinary(max) not null
)
go
insert into dbo.testdata(id, data) values
  (1, 0x123456789),
  (2, 0x987654321);
go

use db2
go
create table dbo.testdata (
  id int not null primary key,
  data varbinary(max) not null
)
go

merge db2.dbo.testdata dst
using db1.dbo.testdata src
on (dst.id=src.id)
when matched then
  update set data=src.data
when not matched then
  insert (id, data) values (src.id, src.data);

update db2.dbo.testdata set data=0x0;

update d2 set d2.data=d1.data
from db1.dbo.testdata d1
join db2.dbo.testdata d2 on d2.id=d1.id;
...
Рейтинг: 0 / 0
ошибка "String or binary data would be truncated"
    #39944229
erleug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

спасибо за подсказку, получилось вроде таким методом

Код: plsql
1.
2.
3.
update ETA_EL_DOC
SET fileDATA = t2.file_doc_im, data_change = (GetDate())
from permitproc.dbo.ETA_EL_DOC t1 left join permitproc2.dbo.ETA_EL_DOC t2 on t1.id = t2.id
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ошибка "String or binary data would be truncated"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]