Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Call a Stored Procedure!

Posted on 2001-08-23
12
Medium Priority
?
413 Views
Last Modified: 2013-11-20
Hi,

Now I am using the CDatabase & CRecordSet classes to manipulate the database.

How can I call a stored procedure in MSSQL server in MFC?

Also, from calling that procedure, a string will be returned! How can I get this string?

Thanks!
0
Comment
Question by:cplau
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 3
  • +2
12 Comments
 
LVL 4

Expert Comment

by:jtwine100697
ID: 6417542
Using the MSDN Library (or using the search on MS' site), search for "CRecordset AND stored AND procedure".  That should give you all of the details that you need.  (And will not cost you points!)

-=- James.
0
 
LVL 30

Expert Comment

by:SteveGTR
ID: 6417978
You've got to check out the stored procedure wizard on Code Projects. It's great for working with stored procedures in VC++/MFC:

http://www.codeproject.com/database/spcw.asp
0
 

Expert Comment

by:ranmanor
ID: 6418728
you can call a stored procedure like this:

db.ExecuteSQL("Stored_Procedure_Name Param1, Param2,....");

db is an open CDatabase variable.

I don't know how to get the returned value, sorry.

0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 49

Expert Comment

by:DanRollins
ID: 6418921
Here is a useful piece of code.  It obtains one value from any SQL statement.  This turns out to be useful in all kinds of situations where you don't want to define a formal recordset using the ClassWizard.

//=-=-=-=-=-=-=-=-=-=-=--=-= class Definition
#include <afxdb.h>
class CRsGetOneValue : public CRecordset
{
     public:
     CRsGetOneValue(CDatabase* pDatabase, LPCSTR szSQL );
     CString     m_sSQL;
     CString     m_sRetValue;
     virtual void DoFieldExchange(CFieldExchange* pFX);
     CString GetDefaultSQL() {return m_sSQL;};
};
//=-=-=-=-=-=-=-=-=-=-=--=-= class Implementation

CRsGetOneValue::CRsGetOneValue(CDatabase* pdb, LPCSTR szSQL )
: CRecordset(pdb), m_sSQL(szSQL)
{
     m_sRetValue="";
     m_nFields= 1;
     m_nDefaultType= snapshot;
}
void CRsGetOneValue::DoFieldExchange(CFieldExchange* pFX)
{
     pFX->SetFieldType(CFieldExchange::outputColumn);
     RFX_Text(pFX, "", m_sRetValue);
}

//=-=-=-=-=-=-=-=-=-=-=--=-= typical usage
void CD10WebDlg::OnButton1()
{
    CDatabase db;
    BOOL fRet= db.Open( "", FALSE, FALSE, "ODBC;DSN=MyDSN;UID=USER;PWD=PASSWORD", TRUE);
   
//    CString sSQL= "SELECT sNameLast FROM Inquiry";
//    CString sSQL= "SELECT COUNT(*) FROM Inquiry";
    CString sSQL= "{call OverDueAccts}";

    CRsGetOneValue rs( &db, sSQL );
    rs.Open( AFX_DB_USE_DEFAULT_TYPE, 0, CRecordset::executeDirect );

    TRACE( rs.m_sRetValue + "\r\n" );
}

=-=-=-=-=-=-=-=-=-=-=-

As you can see, to execute a stored procedure, just pass
   "{call spName}"
in the ctor (no spaces between { and call).  You can also use any SELECT statement.  The single returned value will be a string.  If you need an int, just use (for instance):

   int nRet= atoi( rs.m_sRetValue );

One other note: If you expect the return value to be larger than 255 bytes, then you need to modify the RFX_Text call:

   RFX_Text(pFX, "", m_sRetValue, 2048);

-- Dan
0
 
LVL 49

Expert Comment

by:DanRollins
ID: 6443812
hi ranmanor,
Do you have any additional questions?  Do any comments need clarification?

-- Dan
0
 

Expert Comment

by:ranmanor
ID: 6444292
no, thanks.
0
 
LVL 4

Expert Comment

by:jtwine100697
ID: 6444642
> no, thanks.

Just a thought: now might be the time to accept DanRollins' comment as an answer... :)

-=- James.
0
 

Expert Comment

by:ranmanor
ID: 6444752
true.
tell it to cplau .
0
 
LVL 4

Expert Comment

by:jtwine100697
ID: 6444834
D'oh!

Got confused for a second there...! :O

-=- James.
0
 
LVL 49

Expert Comment

by:DanRollins
ID: 6446453
hi ranmanor,
Sorry!
hi jtwine,
Sorry!

hi cplau,
Do you have any additional questions?  Do any comments need clarification?

-- Dan
0
 
LVL 49

Accepted Solution

by:
DanRollins earned 400 total points
ID: 6480644
hi cplau,
Do you have any additional questions?  Do any comments need clarification?

-- Dan
0
 
LVL 1

Expert Comment

by:Computer101
ID: 6703244
Comment from DanRollins accepted as answer.

Thank you
Computer101
Community Support Moderator
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction: Dialogs (1) modal - maintaining the database. Continuing from the ninth article about sudoku.   You might have heard of modal and modeless dialogs.  Here with this Sudoku application will we use one of each type: a modal dialog …
Introduction: Dialogs (2) modeless dialog and a worker thread.  Handling data shared between threads.  Recursive functions. Continuing from the tenth article about sudoku.   Last article we worked with a modal dialog to help maintain informat…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In response to a need for security and privacy, and to continue fostering an environment members can turn to for support, solutions, and education, Experts Exchange has created anonymous question capabilities. This new feature is available to our Pr…

610 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question