Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Адаптер таблиц с хран процедурами на select,insert Добавлено: 23.04.09 11:10  

Автор вопроса:  Jak | Web-сайт: musautomat.ru | ICQ: 340809754 
Добрый день.

Пишу на vb.net + ms sql server. обмен данными между клиентом и сервером через процедуры. Использую стандартный конструктор DataSet'a для создания в нем адаптера таблицы и привязывания к ней процедур на получение и изменение данных.

Возник трабл: если в хранимых процедурах на select использовать временные таблицы, то мастер создания адаптера таблицы не показывает список полей, возвращаемых таблицей и ругается "Invalid object name 'имя врем таблицы'".

Пробовал: убирать # из название врем таблицы - не помогает; если убрать все действия с врем таблицей, а оставить только create table и drop table - работает.

Кто-нть знает в чем дело?

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #1 Добавлено: 23.04.09 11:27
в теле процедуры есть инструкция "set nocount on" ?

Ответить

Номер ответа: 2
Автор ответа:
 Jak



ICQ: 340809754 

Вопросов: 17
Ответов: 25
 Web-сайт: musautomat.ru
 Профиль | | #2
Добавлено: 23.04.09 11:37
Убрал - не помогло

Ответить

Номер ответа: 3
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #3 Добавлено: 23.04.09 11:42
ну она то и нужна в процедуре, если судить из того что ты используешь в sp временные таблицы, то в ней, я так понимаю, будет несколько конструкций. Неплохо было бы посмотреть на саму процедуру.

Ответить

Номер ответа: 4
Автор ответа:
 Jak



ICQ: 340809754 

Вопросов: 17
Ответов: 25
 Web-сайт: musautomat.ru
 Профиль | | #4
Добавлено: 23.04.09 11:53
  1.  
  2. USE [GKI_POST]
  3. GO
  4.  
  5. set ANSI_NULLS ON
  6. set QUOTED_IDENTIFIER ON
  7. go
  8.  
  9. -- =============================================
  10. -- Author: <esmirnov>
  11. -- Description: <Список неотгруженной номенклатуры с фильтрами для формирования из него спец-ии на доставку>
  12. -- Create date: <16/04/2009>
  13. -- TODO:
  14. -- =============================================
  15.  
  16. alter PROCEDURE [dbo].[pr_TRMTRForLogistic_lst]
  17. @CU_ID int = NULL, -- ID заказчика
  18. @DE_BUILD_NAME varchar(500)= NULL, -- наименование объекта
  19. @DE_BUILD_CODE varchar(255)= NULL, -- код стройки
  20. @SM_YEAR int = NULL, -- срок поставки МТР год
  21. @SM_MONTH int = NULL -- срок поставки МТР месяц
  22. AS

  23. BEGIN
  24.  
  25. --SET NOCOUNT ON
  26.  
  27. DECLARE @start_time datetime -- время начала работы процедуры
  28. DECLARE @exec_time bigint -- длительность работы процедуры (мс)
  29. DECLARE @cur_spec_code int -- код_спец из курсора по спец-иям
  30.  
  31. -- проверка на адекватность запускающего процедуру.
  32. -- если не заданы критерии отбора, то выходим, что бы не положить сервер
  33. IF (
  34. @CU_ID IS NULL AND
  35. @DE_BUILD_NAME IS NULL AND
  36. @DE_BUILD_CODE IS NULL AND
  37. @SM_YEAR IS NULL AND
  38. @SM_MONTH IS NULL
  39. )
  40. BEGIN
  41. RAISERROR ('Не задано ни одного критерия поиска. Это может привести выдаче несоразмерно большого количества номенклатуры и чрезмерной загрузке сервера. Чем больше Вы введете критериев, тем быстрее получите результат. Введите хотя бы один.',15,1)
  42. RETURN
  43. END
  44.  
  45.  
  46. SELECT @start_time = GETDATE()
  47.  
  48.  
  49. -- Временная таблица оборудования, отобранного по фильтрам
  50. CREATE TABLE #eq_filtered
  51. (
  52. eq_code INT, -- Оборудование.Код
  53. spec_code INT -- Оборудование.Код_спец
  54. )
  55.  
  56.  
  57. -- курсор по всем спецификациям, в которые входит отобранное оборудование, для привязки МГХ
  58. DECLARE #spec_cursor CURSOR FOR
  59. SELECT
  60. spec_code
  61. FROM
  62. #eq_filtered
  63. GROUP BY
  64. spec_code
  65.  
  66.  
  67. -- Получим Коды оборудования, удовлетворяющего фильтрам
  68. INSERT INTO #eq_filtered
  69. (
  70. eq_code, -- Оборудование.Код
  71. spec_code -- Оборудование.Код_спец
  72. )
  73. SELECT
  74. eq.Код,
  75. eq.Код_спец
  76. FROM
  77. tblDEMANDS de
  78. inner join
  79. tblSPECIFICATION sp on de.de_id = sp.sp_deid
  80. inner join
  81. Спец spec on sp.sp_idspec = spec.Код_спец_ключ
  82. inner join
  83. Оборудование eq on eq.Код_спец = spec.Код_спец
  84. left join
  85. tbl_TRSpecItems tsi on eq.Код = tsi.TSI_Eq_Code
  86. left join
  87. tblSPECIFICATION_MONTH sm on sm.SM_SPID = sp.SP_ID AND sm.SM_SIID = eq.Код
  88. LEFT JOIN
  89. vSPR_CUSTOMER cu ON de.de_cuid = cu.CU_ID
  90. WHERE
  91. -- фильтры
  92. ( -- по заказчику
  93. de.de_cuid = @CU_ID OR
  94. @CU_ID IS NULL
  95. ) AND
  96. ( -- по сроку
  97. sm.sm_year = @SM_YEAR OR
  98. @SM_YEAR IS NULL
  99. ) AND
  100. ( -- по сроку
  101. sm.sm_month = @SM_MONTH OR
  102. @SM_MONTH IS NULL
  103. ) AND
  104. ( -- по наименованию объекта
  105. de.DE_CODE_OBJ LIKE '%'+@DE_BUILD_NAME+'%' OR
  106. @DE_BUILD_NAME IS NULL
  107. ) AND
  108. ( -- по коду стройки
  109. de.DE_CODE_BILD = @DE_BUILD_CODE OR
  110. @DE_BUILD_CODE IS NULL
  111. ) AND
  112. tsi.TSI_TRSP_ID IS NULL

  113.  
  114. -- Проверим наличие МГХ для всех спецификаций, в которые входит отобранное оборудование
  115.  
  116. OPEN #spec_cursor
  117.  
  118. FETCH NEXT FROM #spec_cursor INTO @cur_spec_code
  119.  
  120. WHILE @@FETCH_STATUS = 0
  121. BEGIN
  122. print convert(varchar,@cur_spec_code)
  123.  
  124. EXEC dbo.pr_TRAddWeight @cur_spec_code

  125. FETCH NEXT FROM #spec_cursor INTO @cur_spec_code
  126. END
  127.  
  128. DEALLOCATE #spec_cursor
  129.  
  130. -- Выводим отобранное оборудование
  131. SELECT
  132. de.de_cuid, -- код заказчика
  133. ISNULL(cu.CU_TYPEOWNER, '')+ ' "'
  134. + ISNULL(cu.CU_DESC, '') + '"', -- заказчик
  135. de.DE_CODE_BILD BUILD_CODE, -- код стройки
  136. de.DE_CODE_OBJ BUILD_NAME, -- наим объекта
  137. sm.sm_year, -- срок поставки
  138. sm.sm_month, -- срок поставки
  139. eq.Оборуд,
  140. tsi.*
  141. FROM
  142. tblDEMANDS de
  143. inner join
  144. tblSPECIFICATION sp on de.de_id = sp.sp_deid
  145. inner join
  146. Спец spec on sp.sp_idspec= spec.Код_спец_ключ
  147. inner join
  148. Оборудование eq on eq.Код_спец = spec.Код_спец
  149. inner join
  150. #eq_filtered eqtmp on eqtmp.eq_code= eq.Код
  151. left join
  152. tbl_TRSpecItems tsi on eq.Код = tsi.TSI_Eq_Code
  153. left join
  154. tblSPECIFICATION_MONTH sm on sm.SM_SPID = sp.SP_ID AND
  155. sm.SM_SIID = eq.Код
  156. LEFT JOIN
  157. vSPR_CUSTOMER cu ON de.de_cuid = cu.CU_ID
  158. ORDER BY
  159. tsi.TSI_Code_spec,
  160. tsi.TSI_Eq_Code
  161.  
  162. DROP TABLE #eq_filtered
  163.  
  164. SELECT @exec_time = DATEDIFF(ms,@start_time,GETDATE())
  165. print 'exec time - '+convert(varchar,cast(@exec_time/1000.0 as numeric(8,3)))+'s'
  166. END

Ответить

Номер ответа: 5
Автор ответа:
 Jak



ICQ: 340809754 

Вопросов: 17
Ответов: 25
 Web-сайт: musautomat.ru
 Профиль | | #5
Добавлено: 23.04.09 11:54
ругается на #eq_filtered

Ответить

Номер ответа: 6
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #6 Добавлено: 23.04.09 12:08
в процедуре pr_TRAddWeight ты используешь таблицу #eq_filtered ?

Ответить

Номер ответа: 7
Автор ответа:
 Jak



ICQ: 340809754 

Вопросов: 17
Ответов: 25
 Web-сайт: musautomat.ru
 Профиль | | #7
Добавлено: 23.04.09 12:11
нет

Ответить

Номер ответа: 8
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #8 Добавлено: 23.04.09 12:41
Зачем ты используешь Create Table?
Юзай такую конструкцию

SELECT eq.Код, eq.Код_спец
INTO #eq_filtered (eq_code, spec_code)
FROM

А потом открывай курсор. Хотя использование курсора, под большим сомнением. Имхо их лучше вобще не использовать.

Ответить

Номер ответа: 9
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #9 Добавлено: 23.04.09 12:43
тобишь
SELECT eq.Код as eq_code, eq.Код_спец as spec_code
INTO #eq_filtered
FROM

Ответить

Номер ответа: 10
Автор ответа:
 Jak



ICQ: 340809754 

Вопросов: 17
Ответов: 25
 Web-сайт: musautomat.ru
 Профиль | | #10
Добавлено: 23.04.09 12:57
курсор, хрен с ним. знаю, что плохо. не суть.
помогла конструкция в начале процедуры
  1.  
  2. IF 1=0 BEGIN
  3.     SET FMTONLY OFF
  4. END


на англоязычных форумах этот вопрос много обсуждается.
набери в гугле "temporary tables in ms sql stored procedures for select in net tableadapter" будет много ссылок
Это Баг! в microsoft'e о нем знаю и, типа, работают над ним :)

Спасибо за помощь, Fluke! :)

Ответить

Номер ответа: 11
Автор ответа:
 Jak



ICQ: 340809754 

Вопросов: 17
Ответов: 25
 Web-сайт: musautomat.ru
 Профиль | | #11
Добавлено: 23.04.09 12:57
знаю = знают

Ответить

Номер ответа: 12
Автор ответа:
 fluke



ICQ: 318170731 

Вопросов: 15
Ответов: 96
 Профиль | | #12 Добавлено: 23.04.09 13:03
не за что, сам ведь разобрался:))

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам