powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ошибка в хранимой процедуре SQL2005
10 сообщений из 10, страница 1 из 1
Ошибка в хранимой процедуре SQL2005
    #33470920
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть кусок кода:

Код: plaintext
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.
oData1 = CREATEOBJECT("clsSQLData", "MAINSERVER", "POY")	&& Pass MS SQL Server instance name and database name  
  lcSelect = "SELECT * FROM dspDriver"  
 ** This is CursorAdapter (ADO)  
 ** .Alias = "vDriver"  
 ** .SelectCmd = lcSelect  
 ** .Tables = "dspDriver"  
  oDriver = oData1.CreateView("vDriver", lcSelect, "dspDriver") 	  
    
 ** adChar =  129   
 ** adParamInput	=  1   
 ** adParamOutput =  2   
  loSP = oData1.AddSP("usp_dsp_GetDriverStatus")	&& Returns custom object clsStoredProc  
  loSP.AddParam("@Drv_CD", adChar, adParamInput,  4 )  
  loSP.AddParam("@Status", adChar, adParamOutput,  2 )  
    
  SELECT vDriver  
  SCAN  
  	lcDrv_CD = vDriver.Dr_CD  
  	?lcDrv_CD, " - "  
  	loSP.SetParam("@Drv_CD", lcDrv_CD)  
  	loSP.oCmd.Execute(,,adExecuteNoRecords)	&& .oCmd is ADODB.Command  
  	lcStatus = loSP.GetParam("@Status")  
  	??lcStatus  
  ENDSCAN  
 ****************************************  
  DEFINE CLASS clsStoredProc AS Custom  
 * ...   
  PROCEDURE AddParam  
  LPARAMETERS tcName, tnType, tnDirection, tnSize  
  LOCAL loParam AS ADODB.Parameter  
  loParam = this.oCmd.CreateParameter(tcName, tnType, tnDirection, tnSize)  
  this.oCmd.Parameters.Append(loParam)  
  ENDPROC  
    
  PROCEDURE SetParam  
  LPARAMETERS tcName, tvVal  
  this.oCmd.Parameters(tcName).Value = tvVal  
  ENDPROC  
    
  FUNCTION GetParam  
  LPARAMETERS tcName  
  LOCAL lvVal  
  lvVal = this.oCmd.Parameters(tcName).Value  
  RETURN lvVal  
  ENDFUNC  
 *...  
  ENDDEFINE  
 ****************************************  



VFP 9.0 SP1, SQL 2000 - всё работает нормально. Выдаёт:

Код: plaintext
1.
2.
1001 - AV
1002 - CO
1003 - LDитд.

Настало время переносить всё в рабочую базу. Поскольку имеется SQL Server 2005, решил перенести в него.
Сделал detach, скопировал файлы, сделал attach к другому SQL Server. Поставил compatibility level = 90.
Поменял первую строчку в этом куске на новый сервер:
Код: plaintext
oData1 = CREATEOBJECT("clsSQLData", "MAINSERVER\SQL2005", "POY") 


Запускаю. Первая запись проходит нормально. На второй выдаёт ошибку. Нажимаю 'Ignore'. Третья запись проходит нормально. На четвёртой выдаёт ошибку. Итд. Нечётные записи срабатывают, чётные - грохаются. Ошибка нижеследующая:
OLE IDispatch exception code 0 from Microsoft OLE DB Provider for SQL Server:
The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect.
Parameter 2 (""): The RPC is marked with the metadata unchanged flag, but data type 0xAF has an actual length different from the one sent last time...

Сompatibility level поставил обратно в 80 - не помогло.
Длина lcDrv_CD всегда 4.
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33470937
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь тут разделят мое мнение , что ошибка у тебя в голове.
Особенно нравится вот это:
oData1 = CREATEOBJECT("clsSQLData", "MAINSERVER", "POY")
Читаем описание функции CREATEOBJECT :
CREATEOBJECT(cClassName [, eParameter1, eParameter2, ...])
cClassName - Хде ?
Вообще радует:
loSP.AddParam("@Drv_CD", adChar, adParamInput, 4)
loSP.AddParam("@Status", adChar, adParamOutput, 2)
авторOLE IDispatch exception code 0 from Microsoft OLE DB Provider for SQL Server:
Где хоть одна команда связи с сервером через ODBC или ADO ? НУ параметры СA где ? ( хотя он все равно все делает проверенными выбранными методами доступа к данным).
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33470995
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНадеюсь тут разделят мое мнение , что ошибка у тебя в голове.
Надеюсь таки нет.
авторoData1 = CREATEOBJECT("clsSQLData", "MAINSERVER", "POY")
Читаем описание функции CREATEOBJECT :
CREATEOBJECT(cClassName [, eParameter1, eParameter2, ...])
cClassName - Хде ?
oData1 = CREATEOBJECT(" clsSQLData ", "MAINSERVER", "POY")
авторГде хоть одна команда связи с сервером через ODBC или ADO ? НУ параметры СA где ?
А шо у ней внутре? А внутре у ней неонка.
Все эти команды скрыты внутри класса clsSQLData. Я не стал его приводить здесь
1) из-за размера
2) потому что никакого отношения к ошибке он не имеет

Повторяюсь: под SQL 2000 всё прекрасно работает. Ошибки начинаются на SQL 2005.
А именно, грохается на команде
Код: plaintext
loSP.oCmd.Execute(,,adExecuteNoRecords)
,
где
Код: plaintext
1.
2.
loSP.oCmd - это ADODB.Command
loSP.oCmd.CommandType = adCmdStoredProc && 4
loSP.oCmd.CommandText = "usp_dsp_GetDriverStatus" && stored procedure name
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33471000
luser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oopyr :) Юморист.
Фамилию озвучь ?
Чтобы я знал, что за урод придет ко мне на собеседование.
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33471119
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, уже вышел релиз 2005? Видимо, я как-то пропустил...

Проблема в том, что по твоему коду ничего вразумительного сказать в принципе невозможно.

OopyrВсе эти команды скрыты внутри класса clsSQLData. Я не стал его приводить здесь
И что тебе могут на это ответить? Да откуда известно, что ты там написал!

Хорошо, сам класс приводить не обязательно. Но напиши тестовый примерчик в "чистом" виде. Тот фрагмент, который вызывает ошибку. Т.е., не через класс, а "в лоб". Начиная со строки соединения...

OopyrНа второй выдаёт ошибку. Нажимаю 'Ignore'.
А где сообщение об ошибке? Что случиться дальше уже не имеет значения. Ошибка то уже произошла. Какой смысл продолжать выполнение.

Насколько я знаю, "совместимость" у 2005 понятие несколько условное. Далеко не все команды SQL2000 пройдут в SQL2005. Например, хинт (nolock) не пройдет. Точнее, ему нужен другой синтаксис.

Посмотри с точки зрения синтаксиса, допустимы ли, те команды, которые ты посылаешь на сервер в SQL2005.
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33471127
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМА что, уже вышел релиз 2005? Видимо, я как-то пропустил...

Да, вышел. Был даже праздник .

Мне немного повезло - Microsoft домой прислал его (MS SQL Server 2005 enterpise edition) как новогодний подарок вместе с VS.NET 2005 Сейчас Вот надо менять компьютер - требования у этих продуктов очень уж большие...
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33471146
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luserЧтобы я знал, что за урод придет ко мне на собеседование.
Фи! Ну что за манеры? ;-)
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33472030
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"В лоб" будет вот так:
Код: plaintext
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.
#DEFINE adChar		 129 
#DEFINE adParamInput	 1 
#DEFINE adParamOutput	 2 
#DEFINE adCmdStoredProc	 4 
#DEFINE adExecuteNoRecords	 128 

CLEAR
LOCAL lcConnString, lcProvider, lcSQLServer, lcDataBase
LOCAL loConn AS ADODB.Connection
LOCAL loCmd AS ADODB.Command
LOCAL loParam AS ADODB.Parameter

lcProvider = "SQLOLEDB.1"
lcSQLServer = "MAINSERVER\SQL2005"
lcDataBase = "POY"

lcConnString = ""
lcConnString = lcConnString + "Provider = " + lcProvider + ";"
lcConnString = lcConnString + "Data Source = " + lcSQLServer + ";"
lcConnString = lcConnString + "Initial Catalog = " + lcDataBase + ";"
lcConnString = lcConnString + "Integrated Security = SSPI"

loConn = NEWOBJECT("ADODB.Connection")
loConn.ConnectionString = lcConnString
loConn.Open()

loCmd = CREATEOBJECT("ADODB.Command")
loCmd.ActiveConnection = loConn
loCmd.CommandType = adCmdStoredProc
loCmd.Prepared = .T.
loCmd.CommandText = "usp_dsp_GetDriverStatus"

loParam = loCmd.CreateParameter("@Drv_CD", adChar, adParamInput,  4 )
loCmd.Parameters.Append(loParam)

loParam = loCmd.CreateParameter("@Status", adChar, adParamOutput,  2 )
loCmd.Parameters.Append(loParam)

* SQL stored procedure calls

loCmd.Parameters("@Drv_CD").Value = "1001"
loCmd.Execute(,,adExecuteNoRecords)  && Выполняется и на  2000 , и на  2005 
?loCmd.Parameters("@Status").Value

loCmd.Parameters("@Drv_CD").Value = "1002"
loCmd.Execute(,,adExecuteNoRecords)  && Выполняется на  2000 , грохается на  2005 
?loCmd.Parameters("@Status").Value

loCmd.Parameters("@Drv_CD").Value = "1003"
loCmd.Execute(,,adExecuteNoRecords)  && Выполняется на  2000 
?loCmd.Parameters("@Status").Value

Можно вызывать с одним и тем же значением входного параметра - первый вызов проходит, второй падает.
Код: plaintext
1.
2.
loCmd.Parameters("@Drv_CD").Value = "1001"
loCmd.Execute(,,adExecuteNoRecords) &&OK
loCmd.Execute(,,adExecuteNoRecords)  &&Error

Ошибка:
OLE IDispatch exception code 0 from Microsoft OLE DB Provider for SQL Server:
The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect.
Parameter 2 (""): The RPC is marked with the metadata unchanged flag, but data type 0xAF has an actual length different from the one sent last time...

Сама процедура выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
ALTER PROCEDURE [dbo].[usp_dsp_GetDriverStatus]
	@Drv_CD	CHAR( 4 ),
	@Status	CHAR( 2 ) OUTPUT
AS

SELECT @Status = Stat_CD FROM dspDriver WHERE Dr_CD = @Drv_CD
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33472031
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если сделать
Код: plaintext
loCmd.Prepared = .F.
то всё работает.
...
Рейтинг: 0 / 0
Ошибка в хранимой процедуре SQL2005
    #33473111
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Oopyr!

=========Beginning of the citation==============
Some commands should never be prepared. For example, commands that specify
stored procedure execution or include invalid text for SQL Server stored
procedure creation should not be prepared.
=========The end of the citation================

В общем "подготавливать" вызов ХП нет никакого смысла - а вот неприятные
последствия как раз и вылезли...

Проблема видимо в конвертации типов (второго параметра). Например если ЯВНО
задать второй параметр - т.е. присвоить ему некоторое начальное НЕПУСТОЕ
значение (для этого также надо указать что второй параметр имеет тип
input/output), то никакой ошибки не возникнет.
Т.е. заменив строку
Код: plaintext
1.
loParam = loCmd.CreateParameter("@Status", adChar, adParamOutput, 
 2 )
на
Код: plaintext
1.
loParam = loCmd.CreateParameter("@Status", adChar, 
adParamOutput+adParamInput,  2 , "")
Мы обходим проблему с Prepared командой.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ошибка в хранимой процедуре SQL2005
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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