15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Calling Stored Procedure ??

Kim -- t9521601@munsu.ulsan.ac.kr
Wednesday, May 15, 1996

Environment : Visual C++ 2.0 ,
              WinNT 3.5 , 
              SQL Server 4.21,
              ODBC 2.0

I want call "Stored Procedure" of SQL server database in my program.
Stored Procedure is following in my database.
  ---------------------------------------------
  CREATE PROC SHIPPARAM (@SHIP CHAR(5)) AS
  SELECT SHIP,MIS,ABLK FROM ABLK
  WHERE ABLK.SHIP = @SHIP
  ORDER BY ABLK.ABLK
  ---------------------------------------------
then  
   SHIPPARAM H903
   
This procedure's result is following.
 SHIP  MIS   ABLK
------------------
 H903  1010  A110S
 H903  1020  A120P
 H903  1020  A120S

I want this result in my program.
my test program code is following. 

class SPset : public CRecordset
{
public:
	SPset(CDatabase* pDatabase = NULL);
	DECLARE_DYNAMIC(SPset)

// Field/Param Data
	
	//{{AFX_FIELD(SPset, CRecordset)
	CString	m_SHIP;
	long	m_MIS;
	CString	m_ABLK;
	//}}AFX_FIELD
	CString m_paramship;


	//{{AFX_VIRTUAL(SPset)
	public:
	virtual CString GetDefaultConnect();    // Default connection string
	virtual CString GetDefaultSQL();    // Default SQL for Recordset
	virtual void DoFieldExchange(CFieldExchange* pFX);  // RFX support
	//}}AFX_VIRTUAL
};

///////////////////////////////////////////////////////////
// spset.cpp : implementation file
//

#include "stdafx.h"
#include "testSP.h"
#include "spset.h"


IMPLEMENT_DYNAMIC(SPset, CRecordset)

SPset::SPset(CDatabase* pdb)
	: CRecordset(pdb)
{
	//{{AFX_FIELD_INIT(SPset)
	m_SHIP = _T("");
	m_MIS = 0;
	m_ABLK = _T("");
	m_nFields = 3;
	//}}AFX_FIELD_INIT
	m_nParams = 1;
	m_paramship = _T("");
}


CString SPset::GetDefaultConnect()
{
        // this is my datasource.
	return _T("ODBC;DSN=sql server data;");
}

CString SPset::GetDefaultSQL()
{
        //this is my default database table
	return _T("dbo.ABLK");
}

void SPset::DoFieldExchange(CFieldExchange* pFX)
{
	
	//{{AFX_FIELD_MAP(SPset)
	pFX->SetFieldType(CFieldExchange::outputColumn);
	RFX_Text(pFX, "SHIP", m_SHIP);
	RFX_Long(pFX, "MIS", m_MIS);
	RFX_Text(pFX, "ABLK", m_ABLK);
	//}}AFX_FIELD_MAP
	pFX->SetFieldType(CFieldExchange::param);
	RFX_Text(pFX,"@SHIP",m_paramship);
}

///////////////////////////////////////////////////////////
// testSdoc.cpp : implementation of the CtestSPDoc class
//

#include "stdafx.h"
#include "testSP.h"

#include "testSdoc.h"
#include "spset.h"


/////////////////////////////////////////////////////////////////////////////
// CtestSPDoc

IMPLEMENT_DYNCREATE(CtestSPDoc, CDocument)

BEGIN_MESSAGE_MAP(CtestSPDoc, CDocument)
	//{{AFX_MSG_MAP(CtestSPDoc)
		
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CtestSPDoc construction/destruction

CtestSPDoc::CtestSPDoc()
{
	// TODO: add one-time construction code here

}

CtestSPDoc::~CtestSPDoc()
{
}

BOOL CtestSPDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	SPset db(NULL);
	CString strSQL = "{CALL SHIPPARAM (?)}";
	db.m_paramship = "H903";
	if(db.Open(CRecordset::snapshot,strSQL))
	db.MoveFirst();
	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CtestSPDoc serialization

void CtestSPDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

When running this program,get follwing error message.
 : Implicit conversion from datatype 'real' to 'char'
   is not allowed. Use the CONVERT function to run this query.

please. tell me the way.

                        Seon Geun Kim. in University of Ulsan.




Mike Blaszczak -- mikeblas@msn.com
Friday, May 17, 1996

----------
From: 	owner-mfc-l@netcom.com on behalf of Seon Geun, Kim
Sent: 	Tuesday, May 14, 1996 19:26

> Environment : Visual C++ 2.0 ,
>              WinNT 3.5 , 
>              SQL Server 4.21,
>              ODBC 2.0

> I want call "Stored Procedure" of SQL server database in my program.
> Stored Procedure is following in my database.

>  CREATE PROC SHIPPARAM (@SHIP CHAR(5)) AS

 > I want this result in my program.
 > my test program code is following. 

> CString SPset::GetDefaultSQL()
> {
>        //this is my default database table
>	return _T("dbo.ABLK");
> }


 > When running this program,get follwing error message.
 >  : Implicit conversion from datatype 'real' to 'char'
 >  is not allowed. Use the CONVERT function to run this query.

You've changed all the parameters in the DoFieldExchange(), but your 
GetDefaultSql() function just returns the name of a table. The columns you're 
binding don't match the columns from the table.  Since you said you want to 
execute the stored procedure, why are you returning a SQL Statement that 
retrieves all columns from a table?  You should edit your GetDefaultSql() 
function to return an ODBC command that will execute the stored procedure.

.B ekiM
TCHAR sz[] = _T("These words are my own.");




| Вернуться в корень Архива |