PDA

View Full Version : programma c -> database mysql


Fenomeno85
25-09-2003, 18:18
Ciao a tutti, allora vorrei scrivere un programma in c che mi permetta di spedire a un database di tipo mysql delle informazioni per dei campi.

Il problema è che non so come far aprire una connessione con c e anche come gestire la spedizione delle informazioni da remoto.

cionci
25-09-2003, 18:29
LA cosa più semplice è usare un connessione ODBC (tramite MyODBC 3.51)...
In C purtroppo non l'ho mai fatto...

Fenomeno85
25-09-2003, 18:47
Originariamente inviato da cionci
LA cosa più semplice è usare un connessione ODBC (tramite MyODBC 3.51)...
In C purtroppo non l'ho mai fatto...

e usare questa connessione è facile?? devo usare basic giusto?

cionci
25-09-2003, 18:53
No...tramite C...

Fenomeno85
25-09-2003, 18:55
dove posso trovare come fare ste cose?? qualche guida on-line esiste??

cionci
25-09-2003, 18:59
Questo è un esempio...

SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;

/*Allocate environment handle */
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set the ODBC version environment attribute */
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Allocate connection handle */
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set login timeout to 5 seconds. */
SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0);

/* Connect to data source */
retcode = SQLConnect(hdbc, (SQLCHAR*) "Sales", SQL_NTS,
(SQLCHAR*) "JohnS", SQL_NTS,
(SQLCHAR*) "Sesame", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Allocate statement handle */
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Process data */
;
;
;

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);

cionci
25-09-2003, 19:00
Purtroppo queste cose con il C non è facile trovarle...con il C++ magari è più facile...
Comunque ho dato scontato che tu le volessi fare per Windows...se lo vuoi fare per Linux allora il discorso cambia...

Fenomeno85
25-09-2003, 19:05
no no è per win

Fenomeno85
25-09-2003, 19:11
che libreria devo includere oltre che le solite?? (stdio.h)

Fenomeno85
25-09-2003, 19:11
ah va bene anche il c++

cionci
26-09-2003, 03:45
Allora è già più semplice...

// Visual C++ Extensions Example
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <icrsint.h>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }

class CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_ch_fname,
sizeof(m_ch_fname), m_ul_fnameStatus, false)
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname,
sizeof(m_ch_lname), m_ul_lnameStatus, false)
END_ADO_BINDING()
public:
CHAR m_ch_fname[22];
CHAR m_ch_lname[32];
ULONG m_ul_fnameStatus;
ULONG m_ul_lnameStatus;
};

void main(void)
{
::CoInitialize(NULL);
try
{
_RecordsetPtr pRs("ADODB.Recordset");
CCustomRs rs;
IADORecordBindingPtr picRs(pRs);

pRs->Open("SELECT * FROM Employee ORDER BY lname",
"dsn=pubs;uid=sa;pwd=;",
adOpenStatic, adLockOptimistic, adCmdText);

TESTHR(picRs->BindToRecordset(&rs));

while (!pRs->EndOfFile)
{
// Process data in the CCustomRs C++ instance variables.
printf("Name = %s %s\n",
(rs.m_ul_fnameStatus == adFldOK ? rs.m_ch_fname: "<Error>"),
(rs.m_ul_lnameStatus == adFldOK ? rs.m_ch_lname: "<Error>"));

// Move to the next row of the Recordset.
// Fields in the new row will automatically be
// placed in the CCustomRs C++ instance variables.

pRs->MoveNext();
}
}
catch (_com_error &e )
{
printf("Error:\n");
printf("Code = %08lx\n", e.Error());
printf("Meaning = %s\n", e.ErrorMessage());
printf("Source = %s\n", (LPCSTR) e.Source());
printf("Description = %s\n", (LPCSTR) e.Description());
}
::CoUninitialize();
}


Comunque c'è un po' da studiarci...

Fenomeno85
26-09-2003, 21:20
Originariamente inviato da cionci
Allora è già più semplice...

pRs->Open("SELECT * FROM Employee ORDER BY lname",
"dsn=pubs;uid=sa;pwd=;",
adOpenStatic, adLockOptimistic, adCmdText);

Comunque c'è un po' da studiarci...

se non erro è con questo che stabilisco una connessione al database?? oppure sto sbagliando?

cionci
27-09-2003, 08:31
E' con quello... Se guardi nelal parte in alto c'è un binding dei dati su una classe (CCustomRs)...
In pratica tu dovrai inserire la struttura dati da rilevare in questa classe...e dovrai associarla ai dati presenti nel DB con le varie direttive ADO_VARIABLE_LENGTH (che dice ad ADO la lunghezza delle variabili che riceve dal DB da immettere nei vari campi)...

"dsn=pubs;uid=sa;pwd=;" è la stringa di connessione, tu dovrai emtterne una che si riferisce a MyODBC: "Driver={MySQL ODBC 3.51 Driver};Server=localhost;"
"Database=MyDatabase;User=MyUserName;Password=MyPassword;"