2010-11-24 1 views
0

Мне нужно вызвать хранимую процедуру, созданную в Access 2007 из программы в VB 6.0.Вызов хранимой процедуры в Access 2007 от VB 6.0

Это работает хранимой процедуры на доступ к базе данных, когда вы щелкните правой кнопкой мыши -> Дизайн Вид:

PARAMETERS prodCode Text (255), orderNum Text (255); 
SELECT Sum(FullPrice) AS Expr1 
FROM Transacs 
WHERE (((Transacs.prodcode)=[prodCode]) AND ((Transacs.ordernum)=[orderNum]) AND ((Transacs.Type)='R')); 

Это код, который нуждается в установке в VB 6.0:

Set TransRs = New ADODB.Recordset 
Dim transcommQuery As String 
transcommQuery = "execute SP_SumOfTransComm " & prodcode & " " & orderNum 

TransRs.Open transcommQuery, db, adOpenDynamic, adLockBatchOptimistic 

линия 3 : transcommQuery = "выполнить SP_SumOfTransComm" & selProdcode & "" & selPolNo - это тот, который мне нужен для фиксации. Как правильно вызвать Хранимую процедуру?

ответ

2

Вы можете использовать объекты Command для вызова хранимых процедур. Для получения более подробной информации вы можете посмотреть here.

Ваш код будет выглядеть примерно так:

Dim Cmd1 As ADODB.Command 
Set Cmd1 = New ADODB.Command 
Cmd1.ActiveConnection = db 
Cmd1.CommandText = "SP_SumOfTransComm" 
Cmd1.CommandType = adCmdStoredProc 
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarWChar, , 255, prodcode) 
Cmd1.Parameters.Append Cmd1.CreateParameter(, adVarWChar, , 255, orderNum) 
Dim TransRs As ADODB.Recordset 
Set TransRs = Cmd1.Execute() 
+0

Это появляется * почти * право, но вызова Execute на объект Command всегда возвращает только для чтения, только вперед курсор. Я считаю, что вам нужно создать новый объект Recordset и вызвать Open on, передавая объект Command в качестве параметра Source (без параметра Connection, поскольку вы уже установили ActiveConnection). Это позволяет запросить конкретные типы блокировки и курсора. – Bob77 2010-11-26 16:20:44

0

Ваши параметры должны быть заключены в кавычки и разделены запятыми, например,

transcommQuery = "EXECUTE SP_SumOfTransComm '@prodcode', '@orderNum';" 
transcommQuery = Replace$(transcommQuery, "@prodcode", prodcode) 
transcommQuery = Replace$(transcommQuery, "@orderNum", orderNum) 

... но тогда вам нужно беспокоиться об ускользающих цитатах и ​​других подобных гадости.

Лучше использовать объект Command с сильно типизированными объектами Parameter и позволить поставщику OLE DB обрабатывать дезинфицирующие значения. См. Ответ @ MicSim для примера кода.

0

Это работает для меня теперь, выполнив следующие действия:

Set TransRs = New ADODB.Recordset 
Dim transcommQuery As String 

transcommQuery = "{ call SP_SumOfTransComm('" & prodcode & "','" & orderNum & "') }" 

TransRs.Open transcommQuery, db, adOpenDynamic, adLockBatchOptimistic 
Смежные вопросы