04/12/2023

AppDatos

Portal de Información – Rutificador

[C++] Conexión ADO.NET SQL Server en C++ Desarrollo en x64

3 minutos de lectura

Fuente para llamar un procedimiento almacenado en SQL2000, 2005, 2008, 2012 y procesar su resultado mostrándolo en Pantalla. El código esta compilado con /clr  y es un híbrido entre c# y c++, el ejecutable fue probado en Windows 7, 2012R2 y 10 funcionando sin problemas.

Se adjuntan las funciones de LTRIM, RTRIM y TRIM para C++ en variables std::String. Además de la función para parsear desde std::string hacia System::String.

Source Code for ADO.NET Connection, SQL Server and C++ x64.




//SQLWCHAR on 64Bits
#define UNICODE
#pragma warning(disable:4099)

#include 
#using 
#using 
#using 
#using 
	
//Decrypt Env Variables
std::string encryptDecrypt(std::string toEncrypt) {
	char key[3] = { 'K', 'C', 'Q' }; //Any chars will work
	std::string output = toEncrypt;

	for (int i = 0; i < toEncrypt.size(); i++)
		output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];

	return output;
}

//Trim
const std::string WHITESPACE = " \n\r\t\f\v";

std::string ltrim(const std::string& s)
{
	size_t start = s.find_first_not_of(WHITESPACE);
	return (start == std::string::npos) ? "" : s.substr(start);
}

std::string rtrim(const std::string& s)
{
	size_t end = s.find_last_not_of(WHITESPACE);
	return (end == std::string::npos) ? "" : s.substr(0, end + 1);
}

std::string trim(const std::string& s)
{
	return rtrim(ltrim(s));
}

//System::String to std::string
std::string stringNativo(System::String^ sysstr)
{
  using System::IntPtr;
  using System::Runtime::InteropServices::Marshal;
  
  IntPtr ip = Marshal::StringToHGlobalAnsi(sysstr);
  std::string outString = static_cast(ip.ToPointer());
  Marshal::FreeHGlobal(ip);
  return outString;  
}

//Connection Function
std::string SQL_PROCEDURE (std::string strConn, 
	std::string serviceStr,
	std::string rutStr,
	std::string montoStr,
	std::string monedaStr,
	std::string swiftStr,
	std::string cuentaStr,
	std::string referenciaStr,
	std::string traeabaStr
	){

	using namespace System;
	using namespace System::Data;
	using namespace System::Data::SqlClient;
	using namespace System::Configuration;
	
	String ^serviceStr1 = gcnew String(serviceStr.c_str());
	String ^rutStr1 = gcnew String(rutStr.c_str());
	String ^montoStr1 = gcnew String(montoStr.c_str());
	String ^monedaStr1 = gcnew String(monedaStr.c_str());
	String ^swiftStr1 = gcnew String(swiftStr.c_str());
	String ^cuentaStr1 = gcnew String(cuentaStr.c_str());
	String ^referenciaStr1 = gcnew String(referenciaStr.c_str());
	String ^traeabaStr1 = gcnew String(traeabaStr.c_str());
	
	
	//Connection
	String ^Salida = "";
	std::string salidaStr = "";
	String ^ConnectionString = gcnew String(strConn.c_str());
	SqlConnection ^conn = gcnew SqlConnection(ConnectionString);
	
	try{
	
	//Call Store Procedure and Open
	conn->Open();
	SqlCommand ^cmd = gcnew SqlCommand(L"Srv_Bicecomex_ValidaCoordenadas", conn);
	cmd->CommandType = CommandType::StoredProcedure;
	cmd->CommandTimeout = 30;
	
	//Parameters
    cmd->Parameters->Add(gcnew SqlParameter("@rut",SqlDbType::VarChar));
    cmd->Parameters["@rut"]->Value = rutStr1;
	cmd->Parameters->Add(gcnew SqlParameter("@monto",SqlDbType::VarChar));
    cmd->Parameters["@monto"]->Value = montoStr1;
	cmd->Parameters->Add(gcnew SqlParameter("@moneda",SqlDbType::VarChar));
    cmd->Parameters["@moneda"]->Value = monedaStr1;
	cmd->Parameters->Add(gcnew SqlParameter("@swift",SqlDbType::VarChar));
    cmd->Parameters["@swift"]->Value = swiftStr1;
	cmd->Parameters->Add(gcnew SqlParameter("@cuenta",SqlDbType::VarChar));
    cmd->Parameters["@cuenta"]->Value = cuentaStr1;
	cmd->Parameters->Add(gcnew SqlParameter("@referencia",SqlDbType::VarChar));
    cmd->Parameters["@referencia"]->Value = referenciaStr1;
	cmd->Parameters->Add(gcnew SqlParameter("@traeaba",SqlDbType::VarChar));
    cmd->Parameters["@traeaba"]->Value = traeabaStr1;
	
	//Exec
	SqlDataReader ^reader = cmd->ExecuteReader();

	//Reader
	while (reader->Read())
	{
		Salida = reader->GetString(0);
	}
	
	//Close reader and connection
	reader->Close();

    }
	catch (SqlException ^errorSql)
    {
        Salida =  gcnew String("999000" + errorSql->ToString());
	}
    catch (Exception ^errorApp)
    {
        Salida = gcnew String("999000" + errorApp->ToString());
    }
    finally
    {
        conn->Close();
    }
	
	salidaStr = stringNativo(Salida);
	return salidaStr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int  SQL_COMEX ()
{
	std::string strConn = "";

	//Buffer to Variables
	std::string serviceStr = "";
	std::string rutStr = "";
	std::string montoStr = "";
	std::string monedaStr = "";
	std::string swiftStr = "";
	std::string cuentaStr = "";
	std::string referenciaStr = "";
	std::string traeabaStr = "";
		
	strConn.assign("Server=" +  + ";Database=" + + ";User Id=" +  + ";Password=" + + ";Connection Timeout=60;");
	salida = SQL_PROCEDURE (strConn,serviceStr,rutStr,montoStr,monedaStr,swiftStr,cuentaStr,referenciaStr,traeabaStr);	



return 0;
  
}

Deja una respuesta