powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Запуск хранимой процедуры из Excel
25 сообщений из 45, страница 1 из 2
Запуск хранимой процедуры из Excel
    #39609857
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди, помогите кодом!
Мне нужно запускать хранимую процедуру в SQL-server'е из екселя с вводом параметра. То есть, ввожу в ячейку 0,56, запускаю макрос - ХП выполняется. И ещё как-то бы получать в качестве обратной связи сообщения типа, "Не удалось записать значение плотности" или "Параметр успешно записан" - это предусмотрено скриптом ХП.
Оговорюсь сразу: из SQLа процедура успешно работает с выдачей диагностических сообщений, строка подключения тоже верна. Приведённый скрипт посоветовали, но не фурычит он, ругается "Type mismatch".
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub RecDens()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Connection
Set cn = New ADODB.Connection

cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=PowerPlant;Data Source="PROTON" 'Ïàðàìåòðû ñòðîêè ïîäêëþ÷åíèÿ
cn.Open
Set cmd = New ADODB.Command
cmd = "exec SPNetWriteGasDensity" & "0.56"
cn.Close
End Sub


Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609873
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovax,

у вас есть на сервере процедура с именем SPNetWriteGasDensity0.56 ?
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609874
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала в этом коде синтаксическая ошибка (там где кавычки в строке подключения) - кавычки в текстовых литералах нужно задваивать

А дальше надо почитать что-нить о том, как запускать процедуры с параметрами
первое попавшееся http://www.askit.ru/custom/vba_office/m9/09_06_ado_command.htm
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609880
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
0,56 - это значение, которое процедура SPNetWriteGasDensity должная записать в прибор.
Указанная процедура, разумеется, есть.
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39609923
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxShocker.Pro,
0,56 - это значение, которое процедура SPNetWriteGasDensity должная записать в прибор.
Указанная процедура, разумеется, есть.нет, я спросил именно про имя "SPNetWriteGasDensity0.56"

Потому что именно такую вы пытаетесь запустить
Код: vbnet
1.
cmd = "exec SPNetWriteGasDensity" & "0.56"
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610078
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker Pro, чёт я Вас не понимаю: Вы что имеете в виду? В вышеуказанную строку я вкладываю следующий смысл: exec(пробел)имя процедуры(пробел)значение. Может, в этом ошибка?
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610095
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxимя процедуры( пробел )значениеи покажите мне этот самый пробел
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610099
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, как его показать-то... Просто нажатие клавиши пробела.
Может быть, надо: cmd = "exec SPNetWriteGasDensity 0.56"?
В понедельник на работе попробую.
Да, и на строку подключения внимания не обращайте - она у меня в других макросах используется - проверено, работает.
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610114
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxХм, как его показать-то.Ну как. Я же давал ссылку на то, как оформлять сообщения. Там есть и средства выделения в коде.kovaxПросто нажатие клавиши пробела.нажатие клавиши пробела не означает появления пробела в тестовом литерале.kovaxДа, и на строку подключения внимания не обращайте - она у меня в других макросах используется - проверено, работает.строка может и рабочая, но это не значит, что втупую скопированная она будет правильно присвоена переменной.kovaxМожет быть, надо: cmd = "exec SPNetWriteGasDensity 0.56"?как вариант. А вообще, ссылку как запускать процедуру с параметрами я давал выше
kovaxПриведённый скрипт посоветовали, но не фурычит онне знаю, кто там вам чего советовал, но этот скрипт ни о чем, он ничего не делает, даже если исправить в нем ошибки
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610440
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, запускать процедуру с параметром я научился, наконец-таки!
Осталось решить задачу с обратной связью - чтобы в виде MsgBox'ов выводилось сообщение, которое выводится, если я эту процедуру выполняю из кверианализера.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub Rec_Density()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Set cn = New ADODB.Connection
cn.ConnectionString = "строка подкл"
cn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "SPNetWriteGasDensity"
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 20
cmd.Parameters.Append cmd.CreateParameter("@Density", adVarChar, adParamInput, 5, TextBox1.Value)
cmd.Execute
cn.Close
Set cn = Nothing
Set cmd = Nothing
End Sub
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610446
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker Pro,
прошу Вас помочь в этом деле! Знаю теперь, что можете!
Привожу скрипт ХП (авторство не моё, если что):
Код: sql
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varChar(16)
AS
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
)

insert #SPNetMain select Port, Baud, Timeout, ConnDevAddr, RequestDelay from SPNetworks where id = 1

declare @Port as varchar(16)
declare @Baud as int
declare @Timeout as int
declare @ConnDevAddr as int
declare @RequestDelay as int

select @Port = Port from #SPNetMain
select @Baud = Baud from #SPNetMain
select @Timeout = Timeout from #SPNetMain
select @ConnDevAddr = ConnDevAddr from #SPNetMain
select @RequestDelay = RequestDelay from #SPNetMain

drop table #SPNetMain

declare @Handle int
declare @rc int

exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT

if @rc = 0 begin
	declare @WriteResult int
	set @WriteResult = 0

	declare @ErrorMessage varchar(256)
	set @ErrorMessage = 'Не могу записать плотность газа: '

	-- Счетчик 7, канал 1
	exec @rc = master..xp_SPNet_set_array @Handle, 7, 1, 125, 9, @Density
	set @WriteResult = @WriteResult + @rc

	if @rc != 0 begin
		set @ErrorMessage = @ErrorMessage + '(cчетчик 7, канал 1)'
	end

	exec master..xp_SPNet_disconnect @Handle

	if @WriteResult != 0 begin
		select @ErrorMessage as Diagnostic
	end
	else begin
		select 'Ok' as Diagnostic
	end
end
else begin
	select 'Не могу подключиться к СПСети' as Diagnostic
end
GO
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610463
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
Set rs = cmd.Execute()
MsgBox rs("Diagnostic")
rs.Close


Типа того
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610501
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Sub Rec_Density()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Dim rst As ADODB.Recordset
Set cn = New ADODB.Connection
cn.ConnectionString = ""
cn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "SPNetWriteGasDensity"
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 20
cmd.Parameters.Append cmd.CreateParameter("@Density", adVarChar, adParamInput, 5, TextBox1.Value)
cmd.Execute
Set rst = cmd.Execute()
MsgBox rst("Diagnostic")
cn.Close
rst.Close
Set cn = Nothing
Set cmd = Nothing
End Sub


Выскакивает ошибка "Run-time error '3265'. "Не удаётся найти объект в семействе, соответствующий требуемому имени или порядковому номеру".
Пробовал подставлять вместо Diagnostic ErrorMessage (@ErrorMessage) - то же самое
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610540
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первым оператором хранимки напиши
Код: sql
1.
SET NOCOUNT ON
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610645
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вставил. После AS (т.е. 4-ой строкой SET NOCOUNT ON). Ничего не изменилось. Почти: если писать не "Diagnostic", а "Diagnostics", тогда выскакивает MsgBox "Ok". Правда, он выскакивает всегда, даже если в счётчик не записалось значение. А до ввода SET NOCOUNT ON даже такая "диагностика" не работала. В общем, не то, что нужно.
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610647
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На всякий случай...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varchar(16)
AS
SET NOCOUNT ON
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610676
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы что-то мутите, потому что никакого Diagnostics в вашем коде нет.
Поставьте точку останова на MsgBox, посмотрите, что возвращается в rst
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610690
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё раз скрипт ХП и скриншот
Код: sql
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varchar(16)
AS
SET NOCOUNT ON
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
)

insert #SPNetMain select Port, Baud, Timeout, ConnDevAddr, RequestDelay from SPNetworks where id = 1

declare @Port as varchar(16)
declare @Baud as int
declare @Timeout as int
declare @ConnDevAddr as int
declare @RequestDelay as int

select @Port = Port from #SPNetMain
select @Baud = Baud from #SPNetMain
select @Timeout = Timeout from #SPNetMain
select @ConnDevAddr = ConnDevAddr from #SPNetMain
select @RequestDelay = RequestDelay from #SPNetMain

drop table #SPNetMain

declare @Handle int
declare @rc int

exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT

if @rc = 0 begin
	declare @WriteResult int
	set @WriteResult = 0

	declare @ErrorMessage varchar(256)
	set @ErrorMessage = 'Не могу записать плотность газа: '

	-- Счетчик 7, канал 1
	exec @rc = master..xp_SPNet_set_array @Handle, 7, 1, 125, 9, @Density
	set @WriteResult = @WriteResult + @rc

	if @rc != 0 begin
		set @ErrorMessage = @ErrorMessage + '(cчетчик 7, канал 1)'
	end

	exec master..xp_SPNet_disconnect @Handle

	if @WriteResult != 0 begin
		select @ErrorMessage as Diagnostic
	end
	else begin
		select 'Ok' as Diagnostic
	end
end
else begin
	select 'Не могу подключиться к СПСети' as Diagnostic
end
GO
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610693
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виноват, скрипт чуть изменил
Код: sql
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE PROCEDURE SPNetWriteGasDensity
	@Density varchar(16)
AS
SET NOCOUNT ON
create table #SPNetMain (
	Port varchar(16),
	Baud int,
	Timeout int,
	ConnDevAddr int,
	RequestDelay int
)

insert #SPNetMain select Port, Baud, Timeout, ConnDevAddr, RequestDelay from SPNetworks where id = 1

declare @Port as varchar(16)
declare @Baud as int
declare @Timeout as int
declare @ConnDevAddr as int
declare @RequestDelay as int

select @Port = Port from #SPNetMain
select @Baud = Baud from #SPNetMain
select @Timeout = Timeout from #SPNetMain
select @ConnDevAddr = ConnDevAddr from #SPNetMain
select @RequestDelay = RequestDelay from #SPNetMain

drop table #SPNetMain

declare @Handle int
declare @rc int

exec @rc = master..xp_SPNet_connect @Port, @Baud, @Timeout, @ConnDevAddr, @Handle OUTPUT

if @rc = 0 begin
	declare @WriteResult int
	set @WriteResult = 0

	declare @ErrorMessage varchar(256)
	set @ErrorMessage = 'Не могу записать плотность газа: '

	-- Счетчик 7, канал 1
	exec @rc = master..xp_SPNet_set_array @Handle, 7, 1, 125, 9, @Density
	set @WriteResult = @WriteResult + @rc

	if @rc != 0 begin
		set @ErrorMessage = @ErrorMessage + '(cчетчик 7, канал 1)'
	end

	exec master..xp_SPNet_disconnect @Handle

	if @WriteResult != 0 begin
		select @ErrorMessage as Diagnostic
	end
	else begin
		select 'Успешно' as Diagnostic
	end
end
else begin
	select 'Не могу подключиться к СПСети' as Diagnostic
end
GO
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610705
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скрин с результатом точки останова на MsgBox
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610706
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот для варианта Diagnostics
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610713
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так на скрине с QA всё же видно! В первом рекордсете у вас Diagnostics="Ok", что вы голову морочите.
Чтобы получить данные из второго рекордсета, нужно брать данные из rs.NextRecordset()
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610715
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но я бы в данном случае, раз вложенные процедуры возвращают какие-то свои рекордсеты, получал бы сообщение через @ErrorMessage, объявив его как output-параметр процедуры
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39610990
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заработало, как хотел. Добавил строку
Код: vbnet
1.
Set rst=rst.NextRecodrset

Shocker Pro, спасибо!
...
Рейтинг: 0 / 0
Запуск хранимой процедуры из Excel
    #39611026
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker Pro, может быть, подскажете, в чём дело?
Обычно я ввожу число, где разделителем служит точка - тогда ХП пишет "Успешно". Если поставить разделителем запятую и попытаться запустить ХП через QA, то анализер будет ругаться, а число не запишется - проверено. Если так же сделать, используя ексель, он выдаст сообщение "Успешно", хотя ХП ведь не выполнит запись! Даже если перезагрузить комп (чтобы исключить сохранение Recordset'ов), открыть книгу и сразу попытаться записать число с "неправильным"разделителем- всё равно пишет, что успешно. Меня вот это напрягает!
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Запуск хранимой процедуры из Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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