【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3508|回复: 2

[数据库] [分享]通过ODBC连接Mysql数据库~~

[复制链接]
发表于 2009-5-3 22:24:45 | 显示全部楼层 |阅读模式

这篇是接着上面一篇 通过Socket实现flash与C++服务器通信  的服务器端部分。

 

我们前几天已经测试通过了flash客户端通过Socket实现了向服务器端信息的发送。现在我们要做的是,当服务器端接收到信息以后,把它作为数据保存在Mysql数据库中,做试验,我们依然是使用当前坐标作为数据发送。

 

首先,我们需要安装Mysql数据库,为了简单,我下载的是MyPHP组件(搜索一下,到处都有下载),这里面包含了Apache+PHP+MySQL服务器搭建套件,这样可以很方便的查看修改数据库中的数据,构建数据表等工作。

 

下载地址 http://www.52z.com/soft/15340.html

 

MyPHP组件安装非常方便,基本上是傻瓜式的,不过他要求必须放在C盘根目录是有点不够人性化。在下载包里有安装手册,照着安装,完成以后,我们的右下角会出现Apache服务器的图标,然后我们在浏览器中输入 http://127.0.0.1/phpmyadmin/  这个网址就可以登入我们的数据库了,开始的时候没有密码,为了方便起见,我们登陆以后,在权限管理里面更改登录密码,如54321.

 

我们先在数据库中创建一个表,加入这个表的名字叫 coord~就是用来记录位置的。然后在表里添加一个项 Point 属性设置成文本。设置成int也可以,我这里仅仅是为了说明问题,文本比较方便。为了确保安全,最好你用phpmyadmin 给数据库里面追加一下数据,确保你的数据能够正确存入。比如给数据库里保存一个'a' , phpmyadmin有个好处,你通过它的界面增加数据以后,他会在执行完毕的时候,显示刚才你的操作的SQL语句,要是你对你自己的SQL语句不太放心,你可以参考它。

 

[分享]通过ODBC连接Mysql数据库~~

[分享]通过ODBC连接Mysql数据库~~

 

好了确保你的MyPHP运行正常,数据可以正确添加以后,我们开始配置我们自己的服务器和Mysql的连接。如果这块搞不清楚,就去网上查资料。

 

下来我们安装Mysql数据库的ODBC驱动。建议去下载MyODBC-3.51.11-2-win这个版本的,目前3.51好像是最稳定的版本。文件不是很大,直接安装,一路next。安装完成以后,我们打开电脑的控制面板--->管理工具-->数据源 (ODBC)  在驱动程序选项卡里面,我们可以看到驱动已经装好了。

下载地址:http://www.skycn.com/soft/2141.html

 

[分享]通过ODBC连接Mysql数据库~~

[分享]通过ODBC连接Mysql数据库~~

 

我们用户DNS选项卡,添加一个我们自己的ODBC数据 

 

[分享]通过ODBC连接Mysql数据库~~

[分享]通过ODBC连接Mysql数据库~~

 

选择我门安装的驱动开始设置连接

 

 

[分享]通过ODBC连接Mysql数据库~~

[分享]通过ODBC连接Mysql数据库~~

 

添加完毕以后,我们就填写连接数据,先是给DNS解析一个名字,我们就叫做mysql ,然后填入用户名 密码,很多地方我们可以不填,他有默认值。如果你的连接是正常的,填写完用户名密码,后面的下拉菜单里就会出现你的数据库里面的表~~,看到我们添加的test这个表了,选他~

 

[分享]通过ODBC连接Mysql数据库~~

[分享]通过ODBC连接Mysql数据库~~
 

点测试。到此为之我们完成了ODBC的设置,下来我们进入我们的C++服务器,写代码来连接数据库。


 楼主| 发表于 2009-5-3 22:51:30 | 显示全部楼层

服务器放弃了开始使用的ADO方式,改用了ODBC;调试了很久,不知道是因为什么原因,ADO方式始终连接不正常,后来改用API方式连接Mysql,也遇到了你问题。总之,才用ODBC方式连接也是不得已选择了我还在后面继续调试API方式直连,希望能够尽快完成。

 

我选择了MFC中 CDatabase 和 CRecordset 来完成数据库的连接。

为此写了一个类:

 

------------------------CMySQLReader.h----------------------------

#pragma once

#include <afxdb.h>
#include <odbcinst.h>

class CMySQLReader
{
public:
 CMySQLReader(void);
 ~CMySQLReader(void);

 VOID  OpenConn(LPCSTR pstrfilename);
 void  ReleaseData();
 CRecordset* Execute(LPCSTR sql);


protected:
 CDatabase m_Database; 
 CRecordset m_Recset;
};

------------------------------------------------------------------

 

这个类负责了整个MYsql数据库的连接和命令的执行。期中 负责连接的函数是

 

 

VOID CMySQLReader::OpenConn( LPCSTR pstrfilename )
{

 CString sSql;
 CString strConnection;

 // 创建进行存取的字符串

 strConnection="Provider=MSDASQL.1;DSN=mysqlassword=54321ersist Security Info=True;User ID=root;Data Source=test";

 TRY  
 {
  m_Database.Open(NULL, false, false, strConnection);
 } 

 CATCH(CDBException, e)
 {
  // 数据库操作产生异常时...
  AfxMessageBox("数据库连接出错: " + e->m_strError,MB_ICONERROR|MB_OK);
 }
 END_CATCH;

}

 

 

 

 这样,我们通过ODBC和Mysql数据库进行了连接。

在这里,遇到了第一个难题,就是使用CDatabase连接数据库,用CRecordset 获取数据查询的时候,发现CRecordset ::Open()函数,只能进行查询操作,其他的操作,都会视为非法操作,这个地方很不理解,因为刚刚接触Mysql数据库编程,好多的地方都不是很明白,也许是我建立的数据库格式,或者别的问题吧。总之,在这里我大约卡了近8个小时,写了至少5种不同的与MySQL的连接方式,都不凑效,到后来一直没有找合适的解决方案,再次返回到CDatabase方式。 如果有这方面的大虾有幸看到了这行代码,请指点一二~小老鼠在此不胜感激!

后来,我放弃了CRecordset 方式查询,直接才用了CDatabase 的.ExecuteSQL(sql);方法,实现了插入,更新的操作,抬头看看窗外,正好看到一缕早晨的阳光柔柔的照进来,项目终于看到曙光了~

 

 

经过测试,这个类数据的插入都很正常。

 

 

下来,就是我们第二项要做的事情,建立我们的socket服务器;因为我们用的数据库CDatabase类是在FMC环境下的,所以我就采用了MFC里面的CAsyncSocket作为SOCKET。

这个类对于大多数人来说没有什么难的地方,我们把它放入一个基于对话框的MFC项目组中

这个类如下:

 

 

-------------------------MyEchoSocket .h---------------------------------

#pragma once

class MyEchoSocket : public CAsyncSocket
{
public:
 MyEchoSocket(void);
 virtual ~MyEchoSocket(void);

 void SetParentDlg(CDialog *pDlg);

 virtual void OnAccept(int nErrorCode);
 virtual void OnClose(int nErrorCode);
 virtual void OnConnect(int nErrorCode);
 virtual void OnReceive(int nErrorCode);
 virtual void OnSend(int nErrorCode);
private:
 CDialog * m_pDlg;
};

 -----------------------------------------------------------------------------

  

eAoSozjz.jpg

 

类很好用,不过对于很多不太用MFC的人来说,数据写在什么地方是一个难题,我们这里列举几个主要的函数。

 

 

BOOL CMySQL_serverDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
 //  执行此操作
 SetIcon(m_hIcon, TRUE);   // 设置大图标
 SetIcon(m_hIcon, FALSE);  // 设置小图标

 // TODO: 在此添加额外的初始化代码
 m_DataRecord.OpenConn("test");                    //设置数据库源
 m_sockListener.SetParentDlg(this);                  //设置SOCKET
 m_sockConnected.SetParentDlg(this);
 SetWindowText("Flash_Game Server V0.1");     //设置标题
 
 return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

 

 

void CMySQL_serverDlg::OnBnClickedOk()
{
 // TODO: 在此添加控件通知处理程序代码
 // 服务器启动
 UpdateData(TRUE);
 m_sockListener.Create(5050);
 if(m_sockListener.Listen()==FALSE)
 {
  AfxMessageBox("服务器启动失败");
  m_sockListener.Close();
  return;   
 }
 m_status = _T("运行中..");
 UpdateData(FALSE);
 SetWindowText("服务器已经启动");
 
}

void CMySQL_serverDlg::OnAccept()
{
 if(m_sockListener.Accept(m_sockConnected))
 {
  SetWindowText("用户连接成功..等待输入数据");
  UpdateData(FALSE);
 }

 else
 {
  AfxMessageBox("用户连接失败");
 }
}

void CMySQL_serverDlg::OnClose()
{
  AfxMessageBox("用户断开连接");
}

void CMySQL_serverDlg::OnReceive()
{
 char *pBuf =new char [1025];
 CString strData;
 int iLen;
 iLen=m_sockConnected.Receive(pBuf,1024);
 if(iLen==SOCKET_ERROR)
 {
  AfxMessageBox("无法接收数据");
 }
 else
 {
  strData = "INSERT INTO coord ( Point ) VALUES ('";
  strData = strData + pBuf;
  strData = strData + "');";
  m_DataRecord.Execute(strData);
  strData = "存入数据库" ;
  strData +=pBuf;
  SetWindowText(strData);
  delete pBuf;
 }
}

 

服务器的源码放在里QQ群里面,如果有疑问的下载源码看。

 

发表于 2009-5-3 22:53:21 | 显示全部楼层
如何建表,说明一下,最好。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 09:43

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表