Проблемы с выполнением хранимой процедуры на ms sql

Программирование на Visual Basic for Applications
Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Проблемы с выполнением хранимой процедуры на ms sql

Сообщение Sotnikovsa » 14.11.2006 (Вт) 15:22

Здравствуйте, проблема следующая , пытаюсь вызвать ХП с помощью ADODB.Command, она мне также должна вернуть параметры диагностики выполнения запроса, т.е. вызывая ХП, я к тому же указываю 3 переменные для возврата в них состояния выполнения ХП, подключение к базе проходит на ура, а вот дальше плохо,
вот мой код :

Код: Выделить всё
Sub rec_GKPZ(con As ADODB.Connection)
Dim T_start As String
Dim T_end As String
Dim A_start As String
Dim A_end As String
Dim rst As ADODB.Recordset
Dim MSP As MSProject.Application
Const AllStation = "Все станции"

Dim ErrCode As Integer
Dim msg As String
Dim msgType As Integer

Dim cmd As ADODB.Command
Dim cpr As ADODB.Parameter

  Set MSP = New MSProject.Application
UsernmPrServ = MSP.UserName

Set cmd = New ADODB.Command
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "repGKPZ"

Set cpr = cmd.CreateParameter("@login_name", adVarChar, adParamInput, [255], UsernmPrServ)
cmd.Parameters.Append cpr
Set cpr = cmd.CreateParameter("@Msg", adVarChar, adParamInputOutput, [255], msg)
cmd.Parameters.Append cpr
Set cpr = cmd.CreateParameter("@MsgType", adInteger, adParamInputOutput, [10], msgType)
cmd.Parameters.Append cpr
Set cpr = cmd.CreateParameter("@ErrCode", adInteger, adParamInputOutput, [10], ErrCode)
cmd.Parameters.Append cpr



Set rst = New ADODB.Recordset

With frm1
   If CB_Podrazd.Text = "Все станции" Then
   sqlstring = sqlstring & "NULL ,"
   Set cpr = cmd.CreateParameter("@station", adVarChar, adParamInput, [20])
cmd.Parameters.Append cpr
   Else
   office = CB_Podrazd.Text
   sqlstring = sqlstring & " '" & office & "', "
   Set cpr = cmd.CreateParameter("@station", adVarChar, adParamInput, [20], CB_Podrazd.Text)
    cmd.Parameters.Append cpr
   End If
   Checkdate1 = False
   Checkdate2 = False
   If (Not DTP_R_New_click) And (Not DTP_R_New_Sel) Then
     sqlstring = sqlstring & "NULL ,"
     Set cpr = cmd.CreateParameter("@tender_start", adDate, adParamInput)
cmd.Parameters.Append cpr
   Else
     T_start = Format$(DTP_Razmesh_new.Value, "yyyy-mm-dd")
     Set cpr = cmd.CreateParameter("@tender_start", adDate adParamInput, [], T_start)
    cmd.Parameters.Append cpr
   End If


End With

cmd.ActiveConnection = con' Con это connection уже настроенное, и в данный момент подключенный к базе, ждет выполнения запроса
Set rst = cmd.Execute

If office <> "Все станции" Then
Proc_one_station rst, con
Else
Proc_All_Station rst, con, cmd
End If
frm1.Hide
exithere:
Exit Sub
NOOFFICE:
MsgBox (NO_Office)
Exit Sub
NODATE:
MsgBox No_date
Exit Sub
OLDDATE:
MsgBox Old_date
Exit Sub
End Sub


при попытке выполнить получаю следующую ошибку
run-time error '-2147217887 (80040e21)': [Microsoft][ODBC SQL Server Drivers]:
Дополнительная возможность не реализована

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.11.2006 (Вт) 15:45

Во-первых, зачем квадратные скобки?
Во-вторых, для кода возврата процедуры есть adParamReturnValue, а для OUTPUT-параметров есть adParamOutput (или adParamInputOutput).
А в-третьих, код ужасный. Объясни словами, что этот код должен делать?
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.11.2006 (Вт) 15:47

CreateParameter("@login_name", adVarChar, adParamInput, [255], UsernmPrServ)

Это, простите, что? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Сообщение Sotnikovsa » 14.11.2006 (Вт) 16:15

Хочу вызвать вот эту процедуру


Код: Выделить всё
create procedure repGKPZ
@station        T_sname, -- филиал или ЦО
@tender_start    T_datetime,-- дата размещения (старт)
@tender_end      T_datetime,-- дата размещения  (финиш)
@agreement_start    T_datetime,-- дата заключения договора(старт)
@agreement_end      T_datetime,-- дата заключения договора (финиш)
@login_name           T_name,     -- логин пользователя MSP, для определения доступности данных
@Msg T_infomsg out,
@MsgType T_int out,
@ErrCode T_int out
AS

Begin


Если бы хранимая процедура не несла в себе параметров OUTPUT, то все прошло бы просто , я так уже делал, но вся проблема в том, что мне необходимо проанализировать ErrCode

И еще, если не трудно, укажите мне на мои недостатки при написании кода, чтобы в будущем я их исправлял

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Проблемы с выполнением хранимой процедуры на ms sql

Сообщение alibek » 14.11.2006 (Вт) 16:54

Код: Выделить всё
Sub rec_GKPZ(con As ADODB.Connection)
Const AllStation As String = "Все станции"
Dim MSP As MSProject.Application
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Set MSP = New MSProject.Application
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "repGKPZ"
If CB_Podrazd.Text = AllStation Then
  cmd.Parameters.Append cmd.CreateParameter(@station, adBSTR, adParamInput, , Null)
Else
  cmd.Parameters.Append cmd.CreateParameter(@station, adBSTR, adParamInput, , CB_Podrazd.Text)
End If
If Not(IsNull(DTP_R_New_click.Value) Or IsNull(Not DTP_R_New_Sel.Value)) Then
  cmd.Parameters.Append cmd.CreateParameter("@tender_start", adDate, adParamInput, ,DTP_R_New_click.Value)
  cmd.Parameters.Append cmd.CreateParameter("@tender_end", adDate, adParamInput, ,DTP_R_New_Sel.Value)
End If
cmd.Parameters.Append cmd.CreateParameter("@agreement_start", adDate, adParamInput, ,Null)
cmd.Parameters.Append cmd.CreateParameter("@agreement_end", adDate, adParamInput, ,Null)
cmd.Parameters.Append cmd.CreateParameter("@login_name", adBSTR, adParamInput, , MSP.UserName)
cmd.Parameters.Append cmd.CreateParameter("@Msg", adBSTR, adParamInput, , msg)
cmd.Parameters.Append cmd.CreateParameter("@MsgType", adInteger, adParamOutput, , msgType)
cmd.Parameters.Append cmd.CreateParameter("@ErrCode", adInteger, adParamOutput, , ErrCode)
On Error Resume Next
Set rst = cmd.Execute
If Err.Number = 0 Then
  If CB_Podrazd.Text = AllStation Then
    Proc_All_Station rst, con, cmd
  Else
    Proc_one_station rst, con
  End If
Else
  MsgBox "Ошибка #" & Err.Number & " - " & Err.Description
End If
On Error GoTo 0
End Sub
Lasciate ogni speranza, voi ch'entrate.

Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Сообщение Sotnikovsa » 14.11.2006 (Вт) 16:59

спасибо, попробую сейчас

Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Сообщение Sotnikovsa » 14.11.2006 (Вт) 21:48

alibek большое спасибо еще раз,Ваш пример мне очень пригодился!!!
Но проблема не исчезла, вываливается та же ошибка


Код: Выделить всё
run-time error '-2147217887 (80040e21)': [Microsoft][ODBC SQL Server Drivers]:
Дополнительная возможность не реализована


подключение к базе я делаю следующим образом

Код: Выделить всё
Sub connect(zapros As Boolean)

Dim space As ADODB.Connection
Const sdatabase = "MSP"
Const sUser = "UserMSP"
Const spwd = "pas"

Set space = New ADODB.Connection
space.ConnectionString = "Driver={SQL Server};Server=(local); Database=" & sdatabase & ";Uid=" & sUser & ";Pwd=" & spwd & ";"   space.Open

   rec_GKPZ space

End Sub

Просто мне нужно обязательно через источник данных ODBC, и в случае простых запросов, в том числе и вызов хранимых процедур, которые не возвращают никаких параметров, данное подключение хорошо работает, не могли бы мне подсказать в чем ошибка.
За ранее благодарен за любую помощь!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.11.2006 (Вт) 22:36

А чем не подходит провайдер OLEDB (sqloledb)?
Но причина скорее всего не в этом. Либо не указывается один из обязательных аргументов (@agreement_start, @agreement_end), либо какой-то из аргументов ХП имеет тип, несовместимый с провайдером. Что значит T_sname? Я не знаю такого типа данных. Также возможно, что вместо adDate надо использовать adDBDate, уже точно не помню.
Lasciate ogni speranza, voi ch'entrate.

Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Сообщение Sotnikovsa » 14.11.2006 (Вт) 22:47

alibek
Прошу прощения но мне необходимо вызвать проедуру так:
Код: Выделить всё
declare @Msg T_infoMsg,
@MsgType    T_int,
@ErrCode    T_int


exec repGKPZ
'Имя филиала' ,-- филиал или ЦО
--null,
null,-- дата размещения (старт)
null,-- дата размещения  (финиш)
null,-- дата заключения договора(старт)
null,-- дата заключения договора (финиш),
'Логин',
@Msg  out,
@MsgType  out,
@ErrCode  out

Это мне дали пример использования процедуры!

кстати только что пробовал подключиться так
Код: Выделить всё

space.ConnectionString = "Provider = SQLOLEDB.1;Password=pas;Persist Security Info=True;User ID=login;Initial Catalog=Nameserver;Data Source=(local)"

вот тогда выдало ошибку

Код: Выделить всё
Ошибка #2147217904  - Procedure 'RepGKPZ' expects parameter '@Msg', which was not supplied

Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Сообщение Sotnikovsa » 14.11.2006 (Вт) 22:48

т.е. получается что в один запрос необходимо выполнить и
Код: Выделить всё
declare @Msg T_infoMsg,
@MsgType    T_int,
@ErrCode    T_int

и
Код: Выделить всё
exec repGKPZ
'Имя филиала' ,-- филиал или ЦО
--null,
null,-- дата размещения (старт)
null,-- дата размещения  (финиш)
null,-- дата заключения договора(старт)
null,-- дата заключения договора (финиш),
'Логин',
@Msg  out,
@MsgType  out,
@ErrCode  out

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.11.2006 (Ср) 9:14

Sotnikovsa писал(а):
Код: Выделить всё
Ошибка #2147217904  - Procedure 'RepGKPZ' expects parameter '@Msg', which was not supplied

Процедура RepGKZP имеет параметр @Msg, который не поддерживается.

Что за @Msg T_infoMsg ? Я такого типа (T_infoMsg) не знаю.
Lasciate ogni speranza, voi ch'entrate.

Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Сообщение Sotnikovsa » 15.11.2006 (Ср) 9:28

тип T_infoMsg это varchar(204) он определен вручную

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.11.2006 (Ср) 9:33

Ну тогда попробовать cmd.Parameters.Append cmd.CreateParameter("@Msg", adVarChar, adParamInput, 204, msg)
Lasciate ogni speranza, voi ch'entrate.

Sotnikovsa
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 15.09.2006 (Пт) 11:26
Откуда: Рязань

Сообщение Sotnikovsa » 15.11.2006 (Ср) 10:05

alibek писал(а):Ну тогда попробовать cmd.Parameters.Append cmd.CreateParameter("@Msg", adVarChar, adParamInput, 204, msg)

Так тоже выдает ошибку несовместимость типов, подскажите, а можно выпаолнить запрос ХП с помощью обычного запроса и посмотреть параметры возврата, не используя объект Command,
потому что если следовать примеру вызова процедуры , то перед вызовом мне переменные нужно объявить

Код: Выделить всё
declare @Msg T_infoMsg,
@MsgType    T_int,
@ErrCode    T_int


exec repGKPZ
'Имя филиала' ,-- филиал или ЦО
--null,
null,-- дата размещения (старт)
null,-- дата размещения  (финиш)
null,-- дата заключения договора(старт)
null,-- дата заключения договора (финиш),
'Логин',
@Msg  out,
@MsgType  out,
@ErrCode  out


если делать так
Код: Выделить всё
Sub sqlzap(con As ADODB.Connection)

Dim MSP As MSProject.Application
Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset
rst.ActiveConnection = con
rst.Open "declare @Msg T_infoMsg,@MsgType T_int,@ErrCode T_int   exec RepGKPZ NULL,NULL,NULL,NULL,NULL,'Sotnikovsa@mail.ru', @Msg out,@MsgType  out,@ErrCode  out"

End Sub

то все работает, но я не могу проанализировать возвращаемые параметры

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.11.2006 (Ср) 10:10

Sotnikovsa, чесслово, задолбал мантрическим повторением фразы "переменные нужно объявить".
Переменные "объявляются" в объекте Command, так, как тебе показано в коде.
Ошибка несовпадения типов? Подбирай нужные типы. Объект Command тут ни при чём, равно как сам принцип передачи параметров через него.
Не можешь подобрать? Удали код создания параметров и вставь вместо него cmd.Parameters.Refresh.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 85

    TopList