Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL (число прочтений - 7479 )
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
24. Января 2011 :: 10:13
Печать  
Добрый день.
При выполнении след кода
Код
Выбрать все
	ТекстДетали = "
	|INSERT INTO [dbo].[LINESJOUR]
	|           ([PRICE]
	|           ,[QTY]
	|           ,[DOCID]
	|           ,[AMOUNTTOTAL]
	|           ,[AMOUNTVAT]
	|           ,[AMOUNTCASH]
	|           ,[AMOUNTPREPAY]
	|           ,[COMISSIONAMOUNT]
	|           ,[COMISSIONPERCENT]
	|           ,[CREDITAGRNUM]
	|           ,[ITEMID]
	|	    ,[INSERTDATE])
	|     VALUES
	|           (?,?,?,?,?,?,?,?,?,?,?,?)
	|";
	РСДетали.Подготовить(ТекстДетали);
	РСДетали.ПостроитьПараметры();

	тбЭкспД = СоздатьОбъект("ТаблицаЗначений");
	тбЭкспД.НоваяКолонка("PRICE","Число");
	тбЭкспД.НоваяКолонка("QTY","Число");
	тбЭкспД.НоваяКолонка("IDDOC","Строка");
	тбЭкспД.НоваяКолонка("AMOUNTTOTAL","Число");
	тбЭкспД.НоваяКолонка("AMOUNTVAT","Число");
	тбЭкспД.НоваяКолонка("AMOUNTCASH_","Число");
	тбЭкспД.НоваяКолонка("AMOUNTPREPAY_","Число");
	тбЭкспД.НоваяКолонка("COMISSIONAMOUNT","Число");
	тбЭкспД.НоваяКолонка("COMISSIONPERCENT","Число");
	тбЭкспД.НоваяКолонка("CREDITAGRNUM_","Строка");
	тбЭкспД.НоваяКолонка("ITEMID","Строка");
	тбЭкспД.НоваяКолонка("INSERTDATE","Число");

...
//Заполнение тбЭкспД
...
	ДатаВставки = Число(Формат(ТекущаяДата(),"ДГГГГММДД")+СтрЗаменить(ТекущееВремя(),":",""));
	тбЭкспД.Заполнить(ДатаВставки,,,"INSERTDATE");
	РСДетали.ВыполнитьSQL_ИзТЗ(тбЭкспД);
 



в итоге колонка [INSERTDATE] (тип bigint) в таблице SQL-сервера нулевая, хотя в тбЭкспД она точно не нулевая.

Если колонку [INSERTDATE] сделать строкой на сиквеле и в 1С, всё вставляется без проблем.

Вопрос: я что-то делаю не так или так и должно быть?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #1 - 24. Января 2011 :: 11:50
Печать  
в 1cpp не поддерживается преобразование из "Число" в "bigint"
=> "так и должно быть"
  

1&&2&&3
Наверх
 
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #2 - 24. Января 2011 :: 12:04
Печать  
trad писал(а) 24. Января 2011 :: 11:50:
в 1cpp не поддерживается преобразование из "Число" в "bigint"
=> "так и должно быть"

Спасибо. Теперь прояснилось.

А в какой числовой тип 1срр может преобразовать "Число"?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #3 - 24. Января 2011 :: 13:22
Печать  
например int, numeric
  

1&&2&&3
Наверх
 
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #4 - 01. Февраля 2011 :: 12:33
Печать  
trad писал(а) 24. Января 2011 :: 13:22:
например int, numeric

Я столкнулся с другой проблемой, которая связана с bigint и ВыполнитьSQL_ИзТЗ: при попытке вставить данные в сиквел вызовом ВыполнитьSQL_ИзТЗ выдает следующее

State 22018, native 0, message [Microsoft][ODBC SQL Server Driver]Недопустимое символьное значение для указания отклонения

Проблема оказалась связана с тем, что на сиквеле есть поля с типом bigint.
Но если данные вставлять через ВыполнитьИнструкцию, то такой проблемы нет (этим способом не могу пользоваться, так как время выполнения сильно увеличивается).
Может кто-то объяснит странное поведение, я то думал что тип bigint вообще не поддерживается?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #5 - 01. Февраля 2011 :: 13:40
Печать  
Ну а как ты вставлял bigint через ВыполнитьИнструкцию?.. не иначе как литералом в тексте запроса (или текстовым параметром, что то же самое). Это сработало, и это не удивительно.
А параметризированный запрос и его параметры требуют преобразования 1с-значения (числа в частности) в тип sql. Что в 1с++ проработано, на мой взгляд, не очень глубоко.

...
Цитата:
этим способом не могу пользоваться, так как время выполнения сильно увеличивается

можно еще попробовать РежимRPC(1) + текстовые параметры, которые в этом режиме превращаются в пареметры sp_executesql()
  

1&&2&&3
Наверх
 
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #6 - 01. Февраля 2011 :: 14:03
Печать  
Спасибо за ответ.
Через ВыполнитьИнструкцию использовал текстовый параметр - тут главное было выяснить будет ли работать вообще.

А кому-то и где можно пожелания оставить по поводу bigint в параметризированном запросе - полезная же вещь и код в итоге простой и красивый?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #7 - 01. Февраля 2011 :: 14:04
Печать  
(0) почему для поля INSERTDATE не использовать тип datetime
или в крайнем случае char(16)
  
Наверх
 
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #8 - 01. Февраля 2011 :: 14:18
Печать  
Z1 писал(а) 01. Февраля 2011 :: 14:04:
(0) почему для поля INSERTDATE не использовать тип datetime
или в крайнем случае char(16)


В итоге и стали использовать nvarchar(14), но это 14 байт, а не 8. А записей в таблице планируются миллионы
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #9 - 01. Февраля 2011 :: 14:26
Печать  
vectorov писал(а) 01. Февраля 2011 :: 14:18:
Z1 писал(а) 01. Февраля 2011 :: 14:04:
(0) почему для поля INSERTDATE не использовать тип datetime
или в крайнем случае char(16)


В итоге и стали использовать nvarchar(14), но это 14 байт, а не 8. А записей в таблице планируются миллионы

ну так и используйте datetime 8 байт
то что записей милионы ну и что из этого ? место на диске
практически ничего не стоит.

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #10 - 01. Февраля 2011 :: 14:30
Печать  
Ну скажем nvarchar(14) это 2*14 = 28 байт
Да, а datetime - 8.
А smalldatetime так тот вообще 4 байта (если конечно диапазон и дискретность устроит)
  

1&&2&&3
Наверх
 
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #11 - 01. Февраля 2011 :: 14:34
Печать  
trad писал(а) 01. Февраля 2011 :: 14:30:
Ну скажем nvarchar(14) это 2*14 = 28 байт
Да, а datetime - 8.
А smalldatetime так тот вообще 4 байта (если конечно диапазон и дискретность устроит)


datetime это хорошо бы.
Как мне вставить дату и обязательно текущее время через ВыполнитьSQL_ИзТЗ?
Я пробовал передавать как форматированную строку, но не получилось - ошибку уже не помню.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #12 - 01. Февраля 2011 :: 14:37
Печать  
vectorov писал(а) 01. Февраля 2011 :: 14:34:
trad писал(а) 01. Февраля 2011 :: 14:30:
Ну скажем nvarchar(14) это 2*14 = 28 байт
Да, а datetime - 8.
А smalldatetime так тот вообще 4 байта (если конечно диапазон и дискретность устроит)


datetime это хорошо бы.
Как мне вставить дату и обязательно текущее время через ВыполнитьSQL_ИзТЗ?
Я пробовал передавать как форматированную строку, но не получилось - ошибку уже не помню.

на поле INSERTDATE поставить default  getdate()
и убрать вообще из insert

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #13 - 01. Февраля 2011 :: 14:41
Печать  
Работать с параметризированным datetime/smalldatetime - проблем нет. Если будет нужно подскажем.
А, вообще, Z1 прав. Для твоей задачи идеальное решение.
  

1&&2&&3
Наверх
 
IP записан
 
vectorov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 08. Октября 2010
Пол: Мужской
Re: ВыполнитьSQL_ИзТЗ обнуляет колонку при вставке в SQL
Ответ #14 - 01. Февраля 2011 :: 14:54
Печать  
trad писал(а) 01. Февраля 2011 :: 14:41:
Работать с параметризированным datetime/smalldatetime - проблем нет. Если будет нужно подскажем.

Подскажите, пожалуйста.

trad писал(а) 01. Февраля 2011 :: 14:41:
А, вообще, Z1 прав. Для твоей задачи идеальное решение.

В моем случае это поле обеспечивает версионность набора данных, вставляемых из ТЗ, поэтому getdate не подходит
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать