读书人

何位给个ODBC连接数据库用并把数据库里

发布时间: 2013-04-20 19:43:01 作者: rapoo

哪位给个ODBC连接数据库用并把数据库里的表完全的显示在MFC中的list control控件中,这个迷茫很久了。求指点
我被这个问题困扰一周了。我主要想做一个学生管理系统。输入到数据库的问题都解决了可是就是把数据库里的表显示在list control失败。百度找了很多都没成功。单文档的会了。我要的是在dailog中的。
真心希望哪位会的给我指点下。给个例子吧。我才学MFC不久。
新人再次感谢
[解决办法]
推荐使用Xproer.OleDb类库。
过去对于开发人员来说在VC中进行数据库开发是一件并不轻松的事情,就算是一个简单的添加或者是删除操作都需要开发人员编写大量的代码。由于VC操作数据库需要使用一些特殊的语法和类型,这些类型没有统一的规范文档和示例,导致开发人员不能深理解。从而使得开发人员编写的代码不能简单高效。随着时间的推移这些代码最终将会变成产品的负担。因为它将影响产品的后续开发工作。
现在Xproer.OleDb类库采用全新的设计理念为VC数据库开发带来了革命性的变化。采用Xproer.OleDb类库将使得VC数据库开发工作变得比以往任何时侯都要简单。对于常用的增删改查功能开发人员再也不需要编写大量的代码了,甚至有时侯只需要编写一行代码就能实现删除功能。
由于良好的构架设计,开发人员能够根据业务需求来对Xproer.OleDb进行扩展和修改。借助于一些代码生成器,开发人员能够在10秒钟内实现对一张包含30个字段的数据表的所有操作(增,删,改,查)。对于信息管理系统的开发商来讲,这些改进将会成倍的提高公司的开发效率。新的设计为后期的维护工作节省了成本,对于系统后期的维护人员来讲,不再需要理解复杂的数据库操作代码,只需要关心业务逻辑,而且即便是调试代码也将会变得前所未有的轻松。
无论是VC数据库开发新手,还是一个拥有多年VC数据库开发经验的人都能够在10分钟内掌握Xproer.OleDb类库的使用。Xproer.OleDb类库为开发人员带来的不仅是开发工作效率的提升,更是为解决更复杂的业务需求提供了最佳的解决方案。

以下示例演示如何从数据表中删除一条数据


#include "stdafx.h"
#include "XproerDataDef.h"
#include "OleDb/OleDbCommand.h"
#include "OleDb/OleDbConnection.h"
#include "OleDb/OleDbDataReader.h"
#include "OleDb/DataTable.h"
#include "OleDb/DataRow.h"
#include "OleDb/DataValue.h"

using namespace Xproer::OleDb;

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
OleDbConnection con;
//设置Access数据库,兼容Access 97,Access 2000,Access 2003,Access 2007,Access 2010
con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
con.Open();

OleDbCommand cmd(&con);
//设置SQL命令
cmd.SetCommandText(L"delete from xdb_news where id=1");
cmd.ExecuteNonQuery();

con.Close();//关闭数据库连接

::CoUninitialize();
system("pause");
return 0;
}


以下示例演示对数据库的多种操作:

#include "stdafx.h"
#include "XproerDataDef.h"
#include "OleDb/OleDbCommand.h"
#include "OleDb/OleDbConnection.h"
#include "OleDb/OleDbDataReader.h"
#include "OleDb/DataTable.h"
#include "OleDb/DataRow.h"
#include "OleDb/DataValue.h"

using namespace Xproer::OleDb;

//获取DataTable的示例
void ADODataTable(OleDbCommand& cmd)
{
int count = 0;
cmd.ExecuteScalar(L"select count(*) from xdb_news",count);
auto_ptr<DataTable> table;
table.reset(cmd.ExecuteDataTable(L"select top 10 IsTop from xdb_news"));

size_t rowCount = table->GetRowsCount();
for (int i = 0 ; i < rowCount ; ++i)
{
DataRow* row = table->GetRow(i);
DataValue* val = row->GetCel(0);

printf("时间:%d \r\n", val->ToBoolean() );
}
}

//使用OleDbDataReader快速读取数据的示例
void ADORead(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
USES_CONVERSION;
wstring title;
while(r->Read())
{
//r->GetString(0,title);
//printf("标题:%s \r\n",W2A(title.c_str()));
printf("ID:%f \r\n", r->GetFloat(0) );
}
r->Close();
}

//通过变量向数据库安全添加数据的示例
void ADOAdd(OleDbCommand& cmd)
{
cmd.SetCommandText(L"insert into xdb_about(VDouble) values(@VDouble)");
cmd.AddDoubleParam(L"@VDouble",125022.3180);


cmd.ExecuteNonQuery();
}

//高性能向数据库插入数据的示例
void ADOParam(OleDbCommand& cmd)
{
cmd.SetCommandText(L"delete from xdb_news where ID=@ID;");
cmd.AddInt32Param(L"@ID",886);
cmd.SetPrepared(true);

_variant_t index = (short)0;
_ParameterPtr param = cmd.GetCommand()->Parameters->GetItem(index);
param->Value = 887;
cmd.ExecuteNonQuery();
param->Value = 888;
cmd.ExecuteNonQuery();
param->Value = 889;
cmd.ExecuteNonQuery();
param->Value = 890;
cmd.ExecuteNonQuery();
param->Value = 891;
cmd.ExecuteNonQuery();
}

//向数据库添加实数的示例
void NumericScaleX(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
_RecordsetPtr& rs = r->GetRecordsetPtr();
rs->MoveFirst();

_variant_t vi = (short)0;
FieldPtr fd = rs->Fields->GetItem(vi);
unsigned char numeri = fd->GetNumericScale();
unsigned char precision = fd->GetPrecision();

printf("GetNumericScale:%d\r\n", fd->GetNumericScale() );
printf("GetPrecision:%d\r\n", fd->GetPrecision() );
printf("Value:%f\r\n", (float)fd->Value );
r->Close();
}

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
OleDbConnection con;
con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
con.Open();

OleDbCommand cmd(&con);

ADORead(cmd);

con.Close();

::CoUninitialize();
//printf("总数:%d",count);
system("pause");
return 0;
}



[解决办法]
ado的可以么
这有例子
http://blog.csdn.net/xianglitian/article/details/5617173
[解决办法]
我刚写了一个ODBC连接mysql的注册/登录小程序,贴出来希望对你有帮助
#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include "resource.h"
#include "MainDlg.h"

#define LOGIN_TIMEOUT 30
#define MAXBUFLEN 255
#define CHECKDBSTMTERROR(hwnd,result,hstmt) if(SQL_ERROR == result) {ShowDBStmtError (hwnd, hstmt); return ;}

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}

return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}
void DBLogin (HWND hwnd);
void DBRegister (HWND hwnd);
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_BUTTONENTER:
{


DBLogin (hwnd);
}
break;
case IDC_BUTTONREGISTER:
{
DBRegister(hwnd);
}
break;

default:
break;
}
}

void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}

void ShowDBError (HWND hwnd, SQLSMALLINT type, SQLHANDLE sqlHandle)
{
char pStatus[10], pMsg[101];
SQLSMALLINT SQLmsglen;
char error[200] = {0};
SQLINTEGER SQLerr;
long erg2 = SQLGetDiagRec (type, sqlHandle, 1,
(SQLCHAR *)pStatus, &SQLerr,
(SQLCHAR *)pMsg, 100, &SQLmsglen);
wsprintf(error, "%s (%d)\n", pMsg, (int)SQLerr);
MessageBox (hwnd, error, TEXT("数据库执行错误"), MB_ICONERROR
[解决办法]
MB_OK);
}

void ShowDBConnError (HWND hwnd, SQLHDBC hdbc)
{
ShowDBError (hwnd, SQL_HANDLE_DBC, hdbc);
}

void ShowDBStmtError (HWND hwnd, SQLHSTMT hstmt)
{
ShowDBError (hwnd, SQL_HANDLE_STMT, hstmt);
}

void DBLogin (HWND hwnd)
{
SQLHENV henv = NULL;//环境句柄
SQLHDBC hdbc = NULL;//连接句柄
SQLHSTMT hstmt = NULL;//一个SQL语句句柄
SQLRETURN result;//执行结果
SQLCHAR ConnStrIn[MAXBUFLEN]="DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=ddj;CharSet=gbk;";
SQLCHAR ConnStrOut[MAXBUFLEN];

//分配环境句柄
result = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);//申请环境句柄
//设置环境属性
result = SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
//FZ分配连接句柄
result = SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
result = SQLSetConnectAttr (hdbc, SQL_LOGIN_TIMEOUT, (void *)LOGIN_TIMEOUT, 0);
//连接数据库
result = SQLDriverConnect (hdbc, NULL, ConnStrIn, SQL_NTS, ConnStrOut, MAXBUFLEN,
(SQLSMALLINT *)0, SQL_DRIVER_NOPROMPT);
if(SQL_ERROR == result)
{
ShowDBConnError (hwnd, hdbc);
return;
}

//分配语句句柄
result = SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt);
result = SQLPrepare (hstmt, (SQLCHAR *)"Select Fname, Fpassword from T_person", SQL_NTS);
CHECKDBSTMTERROR (hwnd, result, hstmt);
result = SQLExecute (hstmt);
//获得用户输入的用户名与密码
TCHAR UserName[20];
GetDlgItemText (hwnd, IDC_EDITUSER, UserName, sizeof(UserName) / sizeof(TCHAR));
TCHAR UserPassword[20];
GetDlgItemText (hwnd, IDC_EDITPASSWORD, UserPassword, sizeof(UserPassword) / sizeof(TCHAR));

bool found = false;
//取出数据库中的用户名与密码与用户输入的数据对照
SQLINTEGER cbsatid = SQL_NTS;
while(SQLFetch(hstmt) != SQL_NO_DATA_FOUND)
{
TCHAR name[20];
SQLGetData (hstmt, 1, SQL_C_CHAR, name, sizeof(name) / sizeof(TCHAR), &cbsatid);
TCHAR password[20];


SQLGetData (hstmt, 2, SQL_C_CHAR, password, sizeof(password) / sizeof(TCHAR), &cbsatid);

if(0 == strcmp(UserName, name) && 0 == strcmp(UserPassword, password))
{
MessageBox (hwnd, TEXT("登录成功!"), TEXT("提示"), MB_OK);
found = true;
break;
}
}

if(found == false)
{
MessageBox (hwnd, TEXT("登录失败!"), TEXT("提示"), MB_OK);
}

CHECKDBSTMTERROR (hwnd, result, hstmt);
SQLFreeStmt(hstmt, SQL_CLOSE);//释放语句句柄
SQLDisconnect (hdbc);//断开连接
SQLFreeHandle (SQL_HANDLE_DBC, hdbc);//释放连接句柄
SQLFreeHandle (SQL_HANDLE_ENV, henv);//释放环境句柄
}

void DBRegister (HWND hwnd)
{
SQLHENV henv = NULL;//环境句柄
SQLHDBC hdbc = NULL;//连接句柄
SQLHSTMT hstmt = NULL;//一个SQL语句句柄
SQLRETURN result;//执行结果
SQLCHAR ConnStrIn[MAXBUFLEN]="DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=ddj;CharSet=gbk;";
SQLCHAR ConnStrOut[MAXBUFLEN];

//分配环境句柄
result = SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);//申请环境句柄
//设置环境属性
result = SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
//FZ分配连接句柄
result = SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
result = SQLSetConnectAttr (hdbc, SQL_LOGIN_TIMEOUT, (void *)LOGIN_TIMEOUT, 0);
//连接数据库
result = SQLDriverConnect (hdbc, NULL, ConnStrIn, SQL_NTS, ConnStrOut, MAXBUFLEN,
(SQLSMALLINT *)0, SQL_DRIVER_NOPROMPT);
if(SQL_ERROR == result)
{
ShowDBConnError (hwnd, hdbc);
return;
}

//获取注册的用户名跟密码
TCHAR UserName[20];
GetDlgItemText (hwnd, IDC_EDITUSER, UserName, sizeof(UserName) / sizeof(TCHAR));
TCHAR UserPassword[20];
GetDlgItemText (hwnd, IDC_EDITPASSWORD, UserPassword, sizeof(UserPassword) / sizeof(TCHAR));

TCHAR sql[100];
wsprintf(sql, "Insert InTo T_person(Fname, Fpassword) value('%s', '%s')", UserName, UserPassword);

//分配语句句柄
result = SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt);
result = SQLPrepare (hstmt, (SQLCHAR *)sql, SQL_NTS);
CHECKDBSTMTERROR (hwnd, result, hstmt);
result = SQLExecute (hstmt);

CHECKDBSTMTERROR (hwnd, result, hstmt);
SQLFreeStmt(hstmt, SQL_CLOSE);//释放语句句柄
SQLDisconnect (hdbc);//断开连接
SQLFreeHandle (SQL_HANDLE_DBC, hdbc);//释放连接句柄
SQLFreeHandle (SQL_HANDLE_ENV, henv);//释放环境句柄
MessageBox (hwnd, TEXT("注册成功"), TEXT(" "), MB_OK);

//清空文本框
SetDlgItemText(hwnd, IDC_EDITUSER, NULL);
SetDlgItemText(hwnd, IDC_EDITPASSWORD, NULL);
}
[解决办法]
http://blog.sina.com.cn/s/blog_62dabfa30100h7y6.html
ODBC连接数据库

得到数据以后利用CListCtrl::InsertItem/SetItemText()插入数据即可。

读书人网 >VC/MFC

热点推荐