|
|
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
Пишу на 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'. Где могут быть грабли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2005, 23:17:25 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
Приведите пожалуйста текст хранимой процедуры. Иначе не понятно, что является "старым" значением, а что новым. Из вашего текста, например, новое значение 'Full Name Of the City', а не 'The Most Full Name Of the City' С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2005, 10:01:47 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2005, 12:24:17 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
Чего то я не понял! У вас в процедуре описан только один параметр: Код: plaintext 1. 2. 3. Код: plaintext Тогда и из VFP делайте вызов: Код: plaintext Из QA вызов же у вас с одним параметром! С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2005, 14:08:54 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
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 так себя не ведут - всегда возвращают параметры, не взирая на то, как завершилась ХП. Со стороны Фокса это просто непорядочно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2005, 14:33:32 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
А вот попутный вопрос: похоже, из фокса получить возвращаемое значение хранимой процедуры нереально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2005, 14:54:25 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
Как нельзя!? Вы сами привели пример с возвратом значения из хранимой процере сервера. Вот еще пример мз TechNet: Хранимая процедура Код: plaintext 1. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2005, 08:41:43 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
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. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2005, 09:09:07 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
2DBAdmin авторlnRetValue=SQLEXEC(lnConnHandle,"EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull") Здесь ошибка в вызове процедуры. Надо так: lnRetValue= SQLEXEC(lnConnHandle,"EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull OUT ") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2005, 19:03:55 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
FoxLamer Здесь ошибка в вызове процедуры. Надо так: lnRetValue= SQLEXEC(lnConnHandle,"EXEC [dbo].[spUpdateCities] ?gCityID,?@gCityFull OUT ") А вы сами проверяли параметр OUT при таком вызове хранимой процедуры из VFP? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2005, 20:47:24 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
Да, действительно, был неправ( Попробовал из QA Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Здесь первый select @testout возвратит NULL, а второй - 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 13:46:46 |
|
||
|
Странный глюк после коннекта к SQL Server
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 13:48:25 |
|
||
|
|

start [/forum/search_topic.php?author=MalNik&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
4ms |
get forum list: |
11ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
458ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 1116ms |
| total: | 1690ms |

| 0 / 0 |
