[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;
}