powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странный глюк после коннекта к SQL Server
12 сообщений из 12, страница 1 из 1
Странный глюк после коннекта к SQL Server
    #33313271
DBAdmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу на VFP 8.0:

lcConnString='DRIVER=SQL Server;SERVER=SQLServer;DATABASE=SQLDB;Trusted_Connection=Yes'
lnConnHandle=SQLSTRINGCONNECT(lcConnString)
gCityID=9
gCityFull='Full Name Of the City'
lnRetValue=SQLEXEC(lnConnHandle,"EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull")
=SQLDISCONNECT(lnConnHandle)

Параметр после выполнения хранимой процедуры на сервере меняет значение, ну, скажем, на 'The Most Full Name Of the City'. Хранимая процедура на SQL Server 2000 возвращает измененный параметр - это сто процентов. Однако после вызова SQLEXEC в переменной gCityFull остается старое значение, т.е. 'Full Name Of the City'.

Где могут быть грабли?
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33313370
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите пожалуйста текст хранимой процедуры. Иначе не понятно, что является "старым" значением, а что новым. Из вашего текста, например, новое значение 'Full Name Of the City', а не 'The Most Full Name Of the City'

С уважением, Алексей.
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33313440
DBAdmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KПриведите пожалуйста текст хранимой процедуры. Иначе не понятно, что является "старым" значением, а что новым. Из вашего текста, например, новое значение 'Full Name Of the City', а не 'The Most Full Name Of the City'

С уважением, Алексей.

Часть кода:

ALTER PROCEDURE [dbo].[spUpdateCities]
@CityFull CHAR(100)=NULL OUTPUT
AS
SET NOCOUNT ON
SET QUOTED_IDENTIFIER OFF
SET XACT_ABORT OFF

..............................................................

SET @CityFull='The Most Full Name of the City'

............................................................

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Вызов из QA:
DECLARE @City CHAR(100)
SET @City='The Full Name of the City'
EXEC spUpdateCity @City OUTPUT
SELECT @City - возвращает 'The Most Full Name of the City'

Вызов из фокса - возвращает 'The Full Name of the City'
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33313518
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего то я не понял!
У вас в процедуре описан только один параметр:
Код: plaintext
1.
2.
3.
ALTER PROCEDURE [dbo].[spUpdateCities]
@CityFull CHAR( 100 )=NULL OUTPUT
AS
...
а передаете при вызове из VFP вы два параметра:
Код: plaintext
EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull
Где-то у вас путаница.
Тогда и из VFP делайте вызов:
Код: plaintext
EXEC [dbo].[spUpdateCities] ?@gCityFull
.
Из QA вызов же у вас с одним параметром!
С уважением, Алексей
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33313541
DBAdmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KЧего то я не понял!
У вас в процедуре описан только один параметр
а передаете при вызове из VFP вы два параметра

Не обращайте внимания

Все, разобрался. Фишка в этом:

Returning Parameter Values
Input/output parameters are available only after the last result set of a statement has been fetched. This means that input/output values are returned to Visual FoxPro only after:

SQLEXEC( ) returns (1) in batch mode

-or-

SQLMORERESULTS( ) returns (2) in non-batch mode.


То есть получается, что Фокс еще и ставит условие: "если ХП отработала без ошибки (SQLEXEC()>0), то я верну параметры, а если с ошибкой (SQLEXEC()<0), то я параметры возвращать не буду". Похоже, что разработчики забыли, что ошибка может генерироваться программистом (RAISERROR). А если нужно вернуть измененный параметр именно если возникла ошибка (особенно если этих параметров куча)? Ни сам SQL Server, ни .NET так себя не ведут - всегда возвращают параметры, не взирая на то, как завершилась ХП. Со стороны Фокса это просто непорядочно.
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33313561
DBAdmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот попутный вопрос: похоже, из фокса получить возвращаемое значение хранимой процедуры нереально?
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33313934
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как нельзя!? Вы сами привели пример с возвратом значения из хранимой процере сервера. Вот еще пример мз TechNet:
Хранимая процедура
Код: plaintext
1.
CREATE PROCEDURE mysp_GetVersion @tcVersion Char( 200 ) Output AS 
SELECT @tcVersion = @@VERSION
Код VFP
Код: plaintext
1.
2.
3.
lcVersion = SPACE( 200 )
lcCommand = "exec mysp_GetVersion ?@lcVersion"  && Note the pass by reference.
=SQLEXEC(lnConn, lcCommand)
?lcVersion 
С уважением, Алексей.
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33313973
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBAdmin
То есть получается, что Фокс еще и ставит условие: "если ХП отработала без ошибки (SQLEXEC()>0), то я верну параметры, а если с ошибкой (SQLEXEC()<0), то я параметры возвращать не буду". Похоже, что разработчики забыли, что ошибка может генерироваться программистом (RAISERROR). А если нужно вернуть измененный параметр именно если возникла ошибка (особенно если этих параметров куча)? Ни сам SQL Server, ни .NET так себя не ведут - всегда возвращают параметры, не взирая на то, как завершилась ХП. Со стороны Фокса это просто непорядочно.
1. Фишка в том, что вы неправильно вызывали хранимую процедуру, т.е. ошибка произошла на этапе вызова (описан один параметр, а передается два) и до ее выполнение дело просто не дошло. И не важно, как вы ее вызываете, из VFP, .NET и др. Если бы вы проверили результат работы команды SQLEXEC после ее вызова, то заметили бы, что вернулась ошибка 8144 (Procedure or function .... has too many arguments specified.). Даже если вы ее выполняли из QA
2. Если вы вставите RAISERROR в процедуру с присвоением параметров, то, действительно, VFP не вернет параметр, определенный через OUTPUT. Даже если его значение было присвоено в хранимой процедуре ДО RAISERROR, но... Разработчики не забыли, что RAISERROR - это генерация ошибки, просто они считают, что RAISERROR нужна именно для генерациии ошибки (с Severity Level > 10), а параметры можно вернуть через OUTPUT или SELECT ...
Смысл генерации ошибки в том, что уже НИКАКИЕ параметры не спасут. А если ошибка не критична, то флаг работы процедуры можно "запихать" в OUTPUT параметр или RowSet.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33315921
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2DBAdmin

авторlnRetValue=SQLEXEC(lnConnHandle,"EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull")



Здесь ошибка в вызове процедуры.
Надо так:

lnRetValue= SQLEXEC(lnConnHandle,"EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull OUT ")
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33316034
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxLamer
Здесь ошибка в вызове процедуры.
Надо так:
lnRetValue= SQLEXEC(lnConnHandle,"EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull OUT ")
А вы сами проверяли параметр OUT при таком вызове хранимой процедуры из VFP?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33317367
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, действительно, был неправ(
Попробовал из QA

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE PROCEDURE _testout @in int,  @out int out
AS
select @out=@in+ 1 
exec _testout @in,@out
GO


declare @testout int
exec _testout  0 ,@testout 
select @testout
exec _testout  0 ,@testout out
select @testout


Здесь первый select @testout возвратит NULL,
а второй - 1
...
Рейтинг: 0 / 0
Странный глюк после коннекта к SQL Server
    #33317374
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE PROCEDURE _testout @in int,  @out int out
AS
select @out=@in+ 1 

GO


declare @testout int
exec _testout  0 ,@testout 
select @testout
exec _testout  0 ,@testout out
select @testout
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странный глюк после коннекта к SQL Server
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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