钢铁雄心4航母超载惩罚:vc之ODBC篇
来源:百度文库 编辑:偶看新闻 时间:2024/05/04 17:43:27
1.打开数据库 CDatabase database;
database.OpenEx( _T( "DSN=zhuxue" ),CDatabase::noOdbcDialog);//zhuxue为数据源名称2.关联记录集CRecordset recset(&database);3.查询记录CString sSql1="";
sSql1 = "SELECT * FROM tablename" ;
recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly);int ti=0;
CDBVariant var;//var可以转换为其他类型的值while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("id",var);
jiangxiang[ti].id=var.m_iVal;
recset.GetFieldValue("name", jiangxiang[ti].name);
ti++;
recset.MoveNext();
}recset.Close();//关闭记录集4.执行sql语句CString sSql="";
sSql+="delete * from 院系审核";//清空表
database.ExecuteSQL(sSql);sSql也可以为Insert ,Update等语句5.读取字段名sSql = "SELECT * FROM Sheet1" ; //读取的文件有Sheet1表的定义,或为本程序生成的表.
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
int excelColCount=recset.GetODBCFieldCount();//列数
CString excelfield[30];
//得到记录集的字段集合中的字段的总个数
for( i=0;i {
CODBCFieldInfo fieldinfo;
recset.GetODBCFieldInfo(i,fieldinfo);
excelfield[i].name =fieldinfo.m_strName;//字段名
} 6.打开excel文件CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sSql,sExcelFile; //sExcelFile为excel的文件路径TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{//可以把excel作为一个数据库操作}}
catch(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
AfxMessageBox("读取失败,请检查是否定义数据区Sheet1");
}
/////////////////////////////////////////////////////////////////////////VC中的ODBC编程
发表:不详 阅读:190次 关键字: 字体:[大 中 小]
ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。下面给出用Visual C++ 进行ODBC 编程的具体方法及技巧。 1.关于ODBC ODBC 是一种使用SQL 的程序设计接口。使用ODBC 让应用程序的编写者避免了与数据源相联的复杂性。这项技术目前已经得到了大多数DBMS 厂商们的广泛支持。
Microsoft Developer Studio 为大多数标准的数据库格式提供了32 位ODBC 驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle 以及Microsoft Text。如果用户希望使用其他数据格式,用户需要相应的ODBC 驱动器及DBMS。
用户使用自己的DBMS 数据库管理功能生成新的数据库模式后,就可以使用ODBC 来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC 的联机帮助。 2. MFC 提供的ODBC 数据库类: Visual C++ 的MFC 基类库定义了几个数据库类。在利用ODBC 编程时,经常要使用到CDatabase( 数据库类),CRecordSet( 记录集类) 和CRecordView( 可视记录集类)。其中:
CDatabase 类对象提供了对数据源的连接,通过它你可以对数据源进行操作。
CRecordSet 类对象提供了从数据源中提取出的记录集。CRecordSet 对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能保持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。
CRecordView 类对象能以控制的形式显示数据库记录。这个视图是直接连到一个CRecordSet 对象的表视图。 3. 应用ODBC 编程 应用Visual C++ 的AppWizard 可以自动生成一个ODBC 应用程序框架。
方法是:
打开File 菜单的New 选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard 的提示进行操作。当AppWizard 询问是否包含数据库支持时,如果你想读写数据库,那么选定Database view with file support;而如果你想访问数据库的信息而不想回写所做的改变,那么选定Database view without file support 选项就比较合适了。选择了数据库支持之后Database Source 按钮会激活,选中它去调用Data Options 对话框。在Database Options 对话框中会显示已向ODBC 注册的数据库资源,选定你所要操作的数据库,如:Super_ES,单击OK 后会出现Select Database Tables 对话框,其中列举了你所选中的数据库中包含的全部表,选择你希望操作的表后,单击OK。在选定了数据库和数据表之后,你可以按照惯例继续进行AppWizard 操作。
需要指出的是:在生成的应用程序框架View 类(如:CSuper_ESView)中包含一个指向CSuper_ESSet 对象的指针m_pSet,该指针由AppWizard 建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。有关m_pSet 的详细用法可以参见Visual C++ Online Book。
程序与数据语言建立联系,使用CDatebase::OpenEx() 或CDatabase::Open() 函数来进行初始化。数据库对象必须在你使用它构造一个记录集对象之前被初始化。
4.下面举例说明在Visual C++ 环境中ODBC 的编程技巧: 1) 查询记录
查询记录使用CRecordSet::Open() 和CRecordSet::Requery() 成员函数。在使用CRecordSet 类对象之前,必须使用CRecordSet::Open() 函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery() 函数。
在调用CRecordSet::Open() 函数时,如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet 类对象的m_pDatabase 成员变量,则使用该数据库对象建立ODBC 连接;否则如果m_pDatabase 为空指针,就新建一个CDatabase 类对象并使其与缺省的数据源相连,然后进行CRecordSet 类对象的初始化。缺省数据源由GetDefault Connect() 函数获得。你也可以提供你所需要的SQL 语句,并以它来调用CRecordSet::Open() 函数,例如: Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果没有指定参数,程序则使用缺省的SQL 语句,即对在GetDefaultSQL() 函数中指定的SQL 语句进行操作:
CString CSuper_ESSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
对于GetDefaultSQL() 函数返回的表名,对应的缺省操作是SELECT 语句,即:
SELECT * FROM BasicData,MainSize
查询过程中也可以利用CRecordSet 的成员变量m_strFilter 和m_strSort 来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL 语句中WHERE 后的条件串;m_strSort 为排序字符串,存放着SQL 语句中ORDER BY 后的字符串。如:
Super_ESSet.m_strFilter="TYPE='电动机'";
Super_ESSet.m_strSort="VOLTAGE";
Super_ESSet.Requery();
对应的SQL语句为:
SELECT * FROM BasicData,MainSize
WHERE TYPE='电动机'
ORDER BY VOLTAGE
除了直接赋值给m_strFilter 以外,还可以使用参数化。利用参数化可以更直观,更方便地完成条件查询任务。使用参数化的步骤如下:
(1) 声明参变量:
CString p1;
float p2;
(2) 在构造函数中初始化参变量
p1=_T("");
p2=0.0f;
m_nParams=2;
(3) 将参变量与对应列绑定
pFX- >SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("P1"),p1);
RFX_Single(pFX,_T("P2"),p2);
完成以上步骤之后就可以利用参变量进行条件查询了:
m_pSet- >m_strFilter="TYPE=? AND VOLTAGE=?";
m_pSet- >p1=" 电动机";
m_pSet- >p2=60.0;
m_pSet- >Requery();
参变量的值按绑定的顺序替换查询字串中的"?" 适配符。
如果查询的结果是多条记录的话,可以用CRecordSet 类的函数Move(),MoveNext(),MovePrev(),Move First() 和MoveLast() 来移动光标。 2) 增加记录
增加记录使用AddNew() 函数,要求数据库必须是以允许增加的方式打开:
m_pSet- >AddNew(); //在表的末尾增加新记录
m_pSet- >SetFieldNull(&(m_pSet- >m_type), FALSE);
m_pSet- >m_type=" 电动机";
... //输入新的字段值
m_pSet- > Update(); //将新记录存入数据库
m_pSet- >Requery(); //重建记录集
3) 删除记录
直接使用Delete() 函数,并且在调用Delete() 函数之后不需调用Update() 函数:
m_pSet- >Delete();
if (!m_pSet- >IsEOF())
m_pSet- >MoveNext();
else
m_pSet- >MoveLast();
4) 修改记录
修改记录使用Edit() 函数:
m_pSet- >Edit(); //修改当前记录
m_pSet- >m_type="发电机";
//修改当前记录字段值
...
m_pSet- >Update(); //将修改结果存入数据库
m_pSet- >Requery();
5) 撤消操作
如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update() 函数之前调用:
CRecordSet::Move(AFX_MOVE_REFRESH);
来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中的参数AFX_MOVE_REFRESH 的值为零。
6) 数据库连接的复用
在CRecordSet 类中定义了一个成员变量m_pDatabase:
CDatabase* m_pDatabase;
它是指向对象数据库类的指针。如果在CRecordSet 类对象调用Open() 函数之前,将一个已经打开的CDatabase 类对象指针传给m_pDatabase,就能共享相同的CDatabase 类对象。如:
CDatabase m_db;
CRecordSet m_set1,m_set2;
m_db.Open(_T("Super_ES"));//建立ODBC连接
m_set1.m_pDatabase=&m_db;
//m_set1复用m_db对象
m_set2.m_pDatabse=&m_db;
// m_set2复用m_db对象
7) SQL 语句的直接执行
虽然通过CRecordSet 类,我们可以完成大多数的查询操作,而且在CRecordSet::Open() 函数中也可以提供SQL 语句,但是有的时候我们还想进行一些其他操作,例如建立新表,删除表,建立新的字段等等,这时就需要使用到CDatabase 类的直接执行SQL 语句的机制。通过调用CDatabase::ExecuteSQL() 函数来完成SQL 语句的直接执行:
BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
{
TRY
{
m_pdb- >ExecuteSQL(strSQL);//直接执行SQL语句
}
CATCH (CDBException,e)
{
CString strMsg;
strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
strMsg+=strSQL;
return FALSE;
}
END_CATCH
return TRUE;
}
应当指出的是,由于不同DBMS 提供的数据操作语句不尽相同,直接执行SQL 语句可能会破坏软件的DBMS 无关性,因此在应用中应当慎用此类操作。
8) 动态连接表
表的动态连接可以利用在调用CRecordSet::Open() 函数时指定SQL 语句来实现。同一个记录集对象只能访问具有相同结构的表,否则查询结果将无法与变量相对应。
void CDB::ChangeTable()
{
if (m_pSet- >IsOpen()) m_pSet- >Close();
switch (m_id)
{
case 0:
m_pSet- >Open(AFX_DB_USE_DEFAULT_TYPE,
"SELECT * FROM SLOT0"); //连接表SLOT0
m_id=1;
break;
case 1:
m_pSet- >Open(AFX_DB_USE_DEFAULT_TYPE,
"SELECT * FROM SLOT1"); //连接表SLOT1
m_id=0;
break;
}
}
9) 动态连接数据库
由于与数据库的连接是通过CDatabase 类对象来实现的,所以我们可以通过赋与CRecordSet 类对象参数m_pDatabase 以连接不同数据库的CDatabase 对象指针,就可以动态连接数据库。
void CDB::ChangeConnect()
{
CDatabase* pdb=m_pSet- >m_pDatabase;
pdb- >Close();
switch (m_id)
{
case 0:
if (!pdb- >Open(_T("Super_ES")))
//连接数据源Super_ES
{
AfxMessageBox("数据源Super_ES打开失败,"
"请检查相应的ODBC连接", MB_OK|MB_ICONWARNING);
exit(0);
}
m_id=1;
break;
case 1:
if (!pdb- >Open(_T("Motor")))
//连接数据源Motor
{
AfxMessageBox("数据源Motor打开失败,"
"请检查相应的ODBC连接", MB_OK|MB_ICONWARNING);
exit(0);
}
m_id=0;
break;
}
} 5.总结 Visual C++ 中的ODBC 类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC 技术使得程序员从具体的DBMS 中解脱出来,从而极大的减少了软件开发的工作量,缩短开发周期,提高了效率和软件的可靠性。本文总结笔者从事软件开发的一些经验心得希望对从事ODBC 开发的工作者有所帮助。 //=====================================================================
VC中的ODBC编程
东方网教育 2005年04月18日13:44 来源:IT人网络 ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。下面给出用Visual C++ 进行ODBC 编程的具体方法及技巧。 1.关于ODBC ODBC 是一种使用SQL 的程序设计接口。使用ODBC 让应用程序的编写者避免了与数据源相联的复杂性。这项技术目前已经得到了大多数DBMS 厂商们的广泛支持。
Microsoft Developer Studio 为大多数标准的数据库格式提供了32 位ODBC 驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle 以及Microsoft Text。如果用户希望使用其他数据格式,用户需要相应的ODBC 驱动器及DBMS。
用户使用自己的DBMS 数据库管理功能生成新的数据库模式后,就可以使用ODBC 来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC 的联机帮助。 2. MFC 提供的ODBC 数据库类: Visual C++ 的MFC 基类库定义了几个数据库类。在利用ODBC 编程时,经常要使用到CDatabase( 数据库类),CRecordSet( 记录集类) 和CRecordView( 可视记录集类)。其中:
CDatabase 类对象提供了对数据源的连接,通过它你可以对数据源进行操作。
CRecordSet 类对象提供了从数据源中提取出的记录集。CRecordSet 对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能保持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。
CRecordView 类对象能以控制的形式显示数据库记录。这个视图是直接连到一个CRecordSet 对象的表视图。 3. 应用ODBC 编程 应用Visual C++ 的AppWizard 可以自动生成一个ODBC 应用程序框架。
方法是:
打开File 菜单的New 选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard 的提示进行操作。当AppWizard 询问是否包含数据库支持时,如果你想读写数据库,那么选定Database view with file support;而如果你想访问数据库的信息而不想回写所做的改变,那么选定Database view without file support 选项就比较合适了。选择了数据库支持之后Database Source 按钮会激活,选中它去调用Data Options 对话框。在Database Options 对话框中会显示已向ODBC 注册的数据库资源,选定你所要操作的数据库,如:Super_ES,单击OK 后会出现Select Database Tables 对话框,其中列举了你所选中的数据库中包含的全部表,选择你希望操作的表后,单击OK。在选定了数据库和数据表之后,你可以按照惯例继续进行AppWizard 操作。
需要指出的是:在生成的应用程序框架View 类(如:CSuper_ESView)中包含一个指向CSuper_ESSet 对象的指针m_pSet,该指针由AppWizard 建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。有关m_pSet 的详细用法可以参见Visual C++ Online Book。
程序与数据语言建立联系,使用CDatebase::OpenEx() 或CDatabase::Open() 函数来进行初始化。数据库对象必须在你使用它构造一个记录集对象之前被初始化。
4.下面举例说明在Visual C++ 环境中ODBC 的编程技巧: 1) 查询记录
查询记录使用CRecordSet::Open() 和CRecordSet::Requery() 成员函数。在使用CRecordSet 类对象之前,必须使用CRecordSet::Open() 函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery() 函数。
在调用CRecordSet::Open() 函数时,如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet 类对象的m_pDatabase 成员变量,则使用该数据库对象建立ODBC 连接;否则如果m_pDatabase 为空指针,就新建一个CDatabase 类对象并使其与缺省的数据源相连,然后进行CRecordSet 类对象的初始化。缺省数据源由GetDefault Connect() 函数获得。你也可以提供你所需要的SQL 语句,并以它来调用CRecordSet::Open() 函数,例如: Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果没有指定参数,程序则使用缺省的SQL 语句,即对在GetDefaultSQL() 函数中指定的SQL 语句进行操作:
CString CSuper_ESSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
对于GetDefaultSQL() 函数返回的表名,对应的缺省操作是SELECT 语句,即:
SELECT * FROM BasicData,MainSize
查询过程中也可以利用CRecordSet 的成员变量m_strFilter 和m_strSort 来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL 语句中WHERE 后的条件串;m_strSort 为排序字符串,存放着SQL 语句中ORDER BY 后的字符串。如:
Super_ESSet.m_strFilter="TYPE='电动机'";
Super_ESSet.m_strSort="VOLTAGE";
Super_ESSet.Requery();
对应的SQL语句为:
SELECT * FROM BasicData,MainSize
WHERE TYPE='电动机'
ORDER BY VOLTAGE
除了直接赋值给m_strFilter 以外,还可以使用参数化。利用参数化可以更直观,更方便地完成条件查询任务。使用参数化的步骤如下:
(1) 声明参变量:
CString p1;
float p2;
(2) 在构造函数中初始化参变量
p1=_T("");
p2=0.0f;
m_nParams=2;
(3) 将参变量与对应列绑定
pFX- >SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("P1"),p1);
RFX_Single(pFX,_T("P2"),p2);
完成以上步骤之后就可以利用参变量进行条件查询了:
m_pSet- >m_strFilter="TYPE=? AND VOLTAGE=?";
m_pSet- >p1=" 电动机";
m_pSet- >p2=60.0;
m_pSet- >Requery();
参变量的值按绑定的顺序替换查询字串中的"?" 适配符。
如果查询的结果是多条记录的话,可以用CRecordSet 类的函数Move(),MoveNext(),MovePrev(),Move First() 和MoveLast() 来移动光标。 2) 增加记录
增加记录使用AddNew() 函数,要求数据库必须是以允许增加的方式打开:
m_pSet- >AddNew(); //在表的末尾增加新记录
m_pSet- >SetFieldNull(&(m_pSet- >m_type), FALSE);
m_pSet- >m_type=" 电动机";
... //输入新的字段值
m_pSet- > Update(); //将新记录存入数据库
m_pSet- >Requery(); //重建记录集
3) 删除记录
直接使用Delete() 函数,并且在调用Delete() 函数之后不需调用Update() 函数:
m_pSet- >Delete();
if (!m_pSet- >IsEOF())
m_pSet- >MoveNext();
else
m_pSet- >MoveLast();
4) 修改记录
修改记录使用Edit() 函数:
m_pSet- >Edit(); //修改当前记录
m_pSet- >m_type="发电机";
//修改当前记录字段值
...
m_pSet- >Update(); //将修改结果存入数据库
m_pSet- >Requery();
5) 撤消操作
如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update() 函数之前调用:
CRecordSet::Move(AFX_MOVE_REFRESH);
来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中的参数AFX_MOVE_REFRESH 的值为零。
6) 数据库连接的复用
在CRecordSet 类中定义了一个成员变量m_pDatabase:
CDatabase* m_pDatabase;
它是指向对象数据库类的指针。如果在CRecordSet 类对象调用Open() 函数之前,将一个已经打开的CDatabase 类对象指针传给m_pDatabase,就能共享相同的CDatabase 类对象。如:
CDatabase m_db;
CReco (你正在阅读“VC中的ODBC编程”更多教育资讯请访问东方网教育)
。。。。。。。。。。。。。初学数据库编程,请问要把CString对象插入表中,一般使用什么样的数据类型?谢谢
--------------------------------------------------------------------------------
答:在SQLserver2000中:如果你的CString的最大长度不超过8000,可以考虑用CHAR,VARCHAR,NCHAR,NVARCHAR;否则用TEXT,NTEXT.
--------------------------------------------------------------------------------
答:同意楼上
--------------------------------------------------------------------------------
答:怎样转换为varchartext呢?SQL语言中的char和C中的char是一个概念吗?
--------------------------------------------------------------------------------
答:SQL中的字符和C中的字符是不一样的,如果你的CString对象小于8K,可将表中的对应变量定义为varchar类型(变长)假设你的CString对象叫m_string,在写入数据库时,用_bstr_t(m_string)转型后即可向数据库中写入
--------------------------------------------------------------------------------
答:voidCMultiMediaSDlg::WriteLog(CStringstrLog){CStringSystemTime;SystemTime=GetCurrentTimestr();try{_variant_tra;m_pConnection->Execute("IFNOTEXISTS(SELECT*FROMLOG.dbo.sysobjectsWHEREname='日志')CREATETABLE日志(日期varchar(50),记录varchar(50))",&ra,adCmdText);m_pConnection->Execute("INSERTINTO日志(日期,信息)VALUES(_bstr_t(SystemTime),_bstr_t(strLog))",&ra,adCmdText);}catch(_com_errore)///捕捉异常{CStringerrormessage;errormessage.Format("错误信息:s",e.ErrorMessage());AfxMessageBox(errormessage);///显示错误信息}}代码就是这个样子,表能创建成功,就是插入那两个CString对象的时候弹出出错信息,出错信息error#3092
--------------------------------------------------------------------------------
答:_variant_t(SystemTime),_variant_t(strLog)试试_bstr_t是将数据库内容转换成CString的
database.OpenEx( _T( "DSN=zhuxue" ),CDatabase::noOdbcDialog);//zhuxue为数据源名称2.关联记录集CRecordset recset(&database);3.查询记录CString sSql1="";
sSql1 = "SELECT * FROM tablename" ;
recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly);int ti=0;
CDBVariant var;//var可以转换为其他类型的值while (!recset.IsEOF())
{
//读取Excel内部数值
recset.GetFieldValue("id",var);
jiangxiang[ti].id=var.m_iVal;
recset.GetFieldValue("name", jiangxiang[ti].name);
ti++;
recset.MoveNext();
}recset.Close();//关闭记录集4.执行sql语句CString sSql="";
sSql+="delete * from 院系审核";//清空表
database.ExecuteSQL(sSql);sSql也可以为Insert ,Update等语句5.读取字段名sSql = "SELECT * FROM Sheet1" ; //读取的文件有Sheet1表的定义,或为本程序生成的表.
// 执行查询语句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
int excelColCount=recset.GetODBCFieldCount();//列数
CString excelfield[30];
//得到记录集的字段集合中的字段的总个数
for( i=0;i
CODBCFieldInfo fieldinfo;
recset.GetODBCFieldInfo(i,fieldinfo);
excelfield[i].name =fieldinfo.m_strName;//字段名
} 6.打开excel文件CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sSql,sExcelFile; //sExcelFile为excel的文件路径TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);
// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{//可以把excel作为一个数据库操作}}
catch(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
AfxMessageBox("读取失败,请检查是否定义数据区Sheet1");
}
/////////////////////////////////////////////////////////////////////////VC中的ODBC编程
发表:不详 阅读:190次 关键字: 字体:[大 中 小]
ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。下面给出用Visual C++ 进行ODBC 编程的具体方法及技巧。 1.关于ODBC ODBC 是一种使用SQL 的程序设计接口。使用ODBC 让应用程序的编写者避免了与数据源相联的复杂性。这项技术目前已经得到了大多数DBMS 厂商们的广泛支持。
Microsoft Developer Studio 为大多数标准的数据库格式提供了32 位ODBC 驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle 以及Microsoft Text。如果用户希望使用其他数据格式,用户需要相应的ODBC 驱动器及DBMS。
用户使用自己的DBMS 数据库管理功能生成新的数据库模式后,就可以使用ODBC 来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC 的联机帮助。 2. MFC 提供的ODBC 数据库类: Visual C++ 的MFC 基类库定义了几个数据库类。在利用ODBC 编程时,经常要使用到CDatabase( 数据库类),CRecordSet( 记录集类) 和CRecordView( 可视记录集类)。其中:
CDatabase 类对象提供了对数据源的连接,通过它你可以对数据源进行操作。
CRecordSet 类对象提供了从数据源中提取出的记录集。CRecordSet 对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能保持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。
CRecordView 类对象能以控制的形式显示数据库记录。这个视图是直接连到一个CRecordSet 对象的表视图。 3. 应用ODBC 编程 应用Visual C++ 的AppWizard 可以自动生成一个ODBC 应用程序框架。
方法是:
打开File 菜单的New 选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard 的提示进行操作。当AppWizard 询问是否包含数据库支持时,如果你想读写数据库,那么选定Database view with file support;而如果你想访问数据库的信息而不想回写所做的改变,那么选定Database view without file support 选项就比较合适了。选择了数据库支持之后Database Source 按钮会激活,选中它去调用Data Options 对话框。在Database Options 对话框中会显示已向ODBC 注册的数据库资源,选定你所要操作的数据库,如:Super_ES,单击OK 后会出现Select Database Tables 对话框,其中列举了你所选中的数据库中包含的全部表,选择你希望操作的表后,单击OK。在选定了数据库和数据表之后,你可以按照惯例继续进行AppWizard 操作。
需要指出的是:在生成的应用程序框架View 类(如:CSuper_ESView)中包含一个指向CSuper_ESSet 对象的指针m_pSet,该指针由AppWizard 建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。有关m_pSet 的详细用法可以参见Visual C++ Online Book。
程序与数据语言建立联系,使用CDatebase::OpenEx() 或CDatabase::Open() 函数来进行初始化。数据库对象必须在你使用它构造一个记录集对象之前被初始化。
4.下面举例说明在Visual C++ 环境中ODBC 的编程技巧: 1) 查询记录
查询记录使用CRecordSet::Open() 和CRecordSet::Requery() 成员函数。在使用CRecordSet 类对象之前,必须使用CRecordSet::Open() 函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery() 函数。
在调用CRecordSet::Open() 函数时,如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet 类对象的m_pDatabase 成员变量,则使用该数据库对象建立ODBC 连接;否则如果m_pDatabase 为空指针,就新建一个CDatabase 类对象并使其与缺省的数据源相连,然后进行CRecordSet 类对象的初始化。缺省数据源由GetDefault Connect() 函数获得。你也可以提供你所需要的SQL 语句,并以它来调用CRecordSet::Open() 函数,例如: Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果没有指定参数,程序则使用缺省的SQL 语句,即对在GetDefaultSQL() 函数中指定的SQL 语句进行操作:
CString CSuper_ESSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
对于GetDefaultSQL() 函数返回的表名,对应的缺省操作是SELECT 语句,即:
SELECT * FROM BasicData,MainSize
查询过程中也可以利用CRecordSet 的成员变量m_strFilter 和m_strSort 来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL 语句中WHERE 后的条件串;m_strSort 为排序字符串,存放着SQL 语句中ORDER BY 后的字符串。如:
Super_ESSet.m_strFilter="TYPE='电动机'";
Super_ESSet.m_strSort="VOLTAGE";
Super_ESSet.Requery();
对应的SQL语句为:
SELECT * FROM BasicData,MainSize
WHERE TYPE='电动机'
ORDER BY VOLTAGE
除了直接赋值给m_strFilter 以外,还可以使用参数化。利用参数化可以更直观,更方便地完成条件查询任务。使用参数化的步骤如下:
(1) 声明参变量:
CString p1;
float p2;
(2) 在构造函数中初始化参变量
p1=_T("");
p2=0.0f;
m_nParams=2;
(3) 将参变量与对应列绑定
pFX- >SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("P1"),p1);
RFX_Single(pFX,_T("P2"),p2);
完成以上步骤之后就可以利用参变量进行条件查询了:
m_pSet- >m_strFilter="TYPE=? AND VOLTAGE=?";
m_pSet- >p1=" 电动机";
m_pSet- >p2=60.0;
m_pSet- >Requery();
参变量的值按绑定的顺序替换查询字串中的"?" 适配符。
如果查询的结果是多条记录的话,可以用CRecordSet 类的函数Move(),MoveNext(),MovePrev(),Move First() 和MoveLast() 来移动光标。 2) 增加记录
增加记录使用AddNew() 函数,要求数据库必须是以允许增加的方式打开:
m_pSet- >AddNew(); //在表的末尾增加新记录
m_pSet- >SetFieldNull(&(m_pSet- >m_type), FALSE);
m_pSet- >m_type=" 电动机";
... //输入新的字段值
m_pSet- > Update(); //将新记录存入数据库
m_pSet- >Requery(); //重建记录集
3) 删除记录
直接使用Delete() 函数,并且在调用Delete() 函数之后不需调用Update() 函数:
m_pSet- >Delete();
if (!m_pSet- >IsEOF())
m_pSet- >MoveNext();
else
m_pSet- >MoveLast();
4) 修改记录
修改记录使用Edit() 函数:
m_pSet- >Edit(); //修改当前记录
m_pSet- >m_type="发电机";
//修改当前记录字段值
...
m_pSet- >Update(); //将修改结果存入数据库
m_pSet- >Requery();
5) 撤消操作
如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update() 函数之前调用:
CRecordSet::Move(AFX_MOVE_REFRESH);
来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中的参数AFX_MOVE_REFRESH 的值为零。
6) 数据库连接的复用
在CRecordSet 类中定义了一个成员变量m_pDatabase:
CDatabase* m_pDatabase;
它是指向对象数据库类的指针。如果在CRecordSet 类对象调用Open() 函数之前,将一个已经打开的CDatabase 类对象指针传给m_pDatabase,就能共享相同的CDatabase 类对象。如:
CDatabase m_db;
CRecordSet m_set1,m_set2;
m_db.Open(_T("Super_ES"));//建立ODBC连接
m_set1.m_pDatabase=&m_db;
//m_set1复用m_db对象
m_set2.m_pDatabse=&m_db;
// m_set2复用m_db对象
7) SQL 语句的直接执行
虽然通过CRecordSet 类,我们可以完成大多数的查询操作,而且在CRecordSet::Open() 函数中也可以提供SQL 语句,但是有的时候我们还想进行一些其他操作,例如建立新表,删除表,建立新的字段等等,这时就需要使用到CDatabase 类的直接执行SQL 语句的机制。通过调用CDatabase::ExecuteSQL() 函数来完成SQL 语句的直接执行:
BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
{
TRY
{
m_pdb- >ExecuteSQL(strSQL);//直接执行SQL语句
}
CATCH (CDBException,e)
{
CString strMsg;
strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
strMsg+=strSQL;
return FALSE;
}
END_CATCH
return TRUE;
}
应当指出的是,由于不同DBMS 提供的数据操作语句不尽相同,直接执行SQL 语句可能会破坏软件的DBMS 无关性,因此在应用中应当慎用此类操作。
8) 动态连接表
表的动态连接可以利用在调用CRecordSet::Open() 函数时指定SQL 语句来实现。同一个记录集对象只能访问具有相同结构的表,否则查询结果将无法与变量相对应。
void CDB::ChangeTable()
{
if (m_pSet- >IsOpen()) m_pSet- >Close();
switch (m_id)
{
case 0:
m_pSet- >Open(AFX_DB_USE_DEFAULT_TYPE,
"SELECT * FROM SLOT0"); //连接表SLOT0
m_id=1;
break;
case 1:
m_pSet- >Open(AFX_DB_USE_DEFAULT_TYPE,
"SELECT * FROM SLOT1"); //连接表SLOT1
m_id=0;
break;
}
}
9) 动态连接数据库
由于与数据库的连接是通过CDatabase 类对象来实现的,所以我们可以通过赋与CRecordSet 类对象参数m_pDatabase 以连接不同数据库的CDatabase 对象指针,就可以动态连接数据库。
void CDB::ChangeConnect()
{
CDatabase* pdb=m_pSet- >m_pDatabase;
pdb- >Close();
switch (m_id)
{
case 0:
if (!pdb- >Open(_T("Super_ES")))
//连接数据源Super_ES
{
AfxMessageBox("数据源Super_ES打开失败,"
"请检查相应的ODBC连接", MB_OK|MB_ICONWARNING);
exit(0);
}
m_id=1;
break;
case 1:
if (!pdb- >Open(_T("Motor")))
//连接数据源Motor
{
AfxMessageBox("数据源Motor打开失败,"
"请检查相应的ODBC连接", MB_OK|MB_ICONWARNING);
exit(0);
}
m_id=0;
break;
}
} 5.总结 Visual C++ 中的ODBC 类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC 技术使得程序员从具体的DBMS 中解脱出来,从而极大的减少了软件开发的工作量,缩短开发周期,提高了效率和软件的可靠性。本文总结笔者从事软件开发的一些经验心得希望对从事ODBC 开发的工作者有所帮助。 //=====================================================================
VC中的ODBC编程
东方网教育 2005年04月18日13:44 来源:IT人网络 ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API)。下面给出用Visual C++ 进行ODBC 编程的具体方法及技巧。 1.关于ODBC ODBC 是一种使用SQL 的程序设计接口。使用ODBC 让应用程序的编写者避免了与数据源相联的复杂性。这项技术目前已经得到了大多数DBMS 厂商们的广泛支持。
Microsoft Developer Studio 为大多数标准的数据库格式提供了32 位ODBC 驱动器。这些标准数据格式包括有:SQL Server、Access、Paradox、dBase、FoxPro、Excel、Oracle 以及Microsoft Text。如果用户希望使用其他数据格式,用户需要相应的ODBC 驱动器及DBMS。
用户使用自己的DBMS 数据库管理功能生成新的数据库模式后,就可以使用ODBC 来登录数据源。对用户的应用程序来说,只要安装有驱动程序,就能注册很多不同的数据库。登录数据库的具体操作参见有关ODBC 的联机帮助。 2. MFC 提供的ODBC 数据库类: Visual C++ 的MFC 基类库定义了几个数据库类。在利用ODBC 编程时,经常要使用到CDatabase( 数据库类),CRecordSet( 记录集类) 和CRecordView( 可视记录集类)。其中:
CDatabase 类对象提供了对数据源的连接,通过它你可以对数据源进行操作。
CRecordSet 类对象提供了从数据源中提取出的记录集。CRecordSet 对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能保持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。
CRecordView 类对象能以控制的形式显示数据库记录。这个视图是直接连到一个CRecordSet 对象的表视图。 3. 应用ODBC 编程 应用Visual C++ 的AppWizard 可以自动生成一个ODBC 应用程序框架。
方法是:
打开File 菜单的New 选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard 的提示进行操作。当AppWizard 询问是否包含数据库支持时,如果你想读写数据库,那么选定Database view with file support;而如果你想访问数据库的信息而不想回写所做的改变,那么选定Database view without file support 选项就比较合适了。选择了数据库支持之后Database Source 按钮会激活,选中它去调用Data Options 对话框。在Database Options 对话框中会显示已向ODBC 注册的数据库资源,选定你所要操作的数据库,如:Super_ES,单击OK 后会出现Select Database Tables 对话框,其中列举了你所选中的数据库中包含的全部表,选择你希望操作的表后,单击OK。在选定了数据库和数据表之后,你可以按照惯例继续进行AppWizard 操作。
需要指出的是:在生成的应用程序框架View 类(如:CSuper_ESView)中包含一个指向CSuper_ESSet 对象的指针m_pSet,该指针由AppWizard 建立,目的是在视表单和记录集之间建立联系,使得记录集中的查询结果能够很容易地在视表单上显示出来。有关m_pSet 的详细用法可以参见Visual C++ Online Book。
程序与数据语言建立联系,使用CDatebase::OpenEx() 或CDatabase::Open() 函数来进行初始化。数据库对象必须在你使用它构造一个记录集对象之前被初始化。
4.下面举例说明在Visual C++ 环境中ODBC 的编程技巧: 1) 查询记录
查询记录使用CRecordSet::Open() 和CRecordSet::Requery() 成员函数。在使用CRecordSet 类对象之前,必须使用CRecordSet::Open() 函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery() 函数。
在调用CRecordSet::Open() 函数时,如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet 类对象的m_pDatabase 成员变量,则使用该数据库对象建立ODBC 连接;否则如果m_pDatabase 为空指针,就新建一个CDatabase 类对象并使其与缺省的数据源相连,然后进行CRecordSet 类对象的初始化。缺省数据源由GetDefault Connect() 函数获得。你也可以提供你所需要的SQL 语句,并以它来调用CRecordSet::Open() 函数,例如: Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果没有指定参数,程序则使用缺省的SQL 语句,即对在GetDefaultSQL() 函数中指定的SQL 语句进行操作:
CString CSuper_ESSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
对于GetDefaultSQL() 函数返回的表名,对应的缺省操作是SELECT 语句,即:
SELECT * FROM BasicData,MainSize
查询过程中也可以利用CRecordSet 的成员变量m_strFilter 和m_strSort 来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL 语句中WHERE 后的条件串;m_strSort 为排序字符串,存放着SQL 语句中ORDER BY 后的字符串。如:
Super_ESSet.m_strFilter="TYPE='电动机'";
Super_ESSet.m_strSort="VOLTAGE";
Super_ESSet.Requery();
对应的SQL语句为:
SELECT * FROM BasicData,MainSize
WHERE TYPE='电动机'
ORDER BY VOLTAGE
除了直接赋值给m_strFilter 以外,还可以使用参数化。利用参数化可以更直观,更方便地完成条件查询任务。使用参数化的步骤如下:
(1) 声明参变量:
CString p1;
float p2;
(2) 在构造函数中初始化参变量
p1=_T("");
p2=0.0f;
m_nParams=2;
(3) 将参变量与对应列绑定
pFX- >SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("P1"),p1);
RFX_Single(pFX,_T("P2"),p2);
完成以上步骤之后就可以利用参变量进行条件查询了:
m_pSet- >m_strFilter="TYPE=? AND VOLTAGE=?";
m_pSet- >p1=" 电动机";
m_pSet- >p2=60.0;
m_pSet- >Requery();
参变量的值按绑定的顺序替换查询字串中的"?" 适配符。
如果查询的结果是多条记录的话,可以用CRecordSet 类的函数Move(),MoveNext(),MovePrev(),Move First() 和MoveLast() 来移动光标。 2) 增加记录
增加记录使用AddNew() 函数,要求数据库必须是以允许增加的方式打开:
m_pSet- >AddNew(); //在表的末尾增加新记录
m_pSet- >SetFieldNull(&(m_pSet- >m_type), FALSE);
m_pSet- >m_type=" 电动机";
... //输入新的字段值
m_pSet- > Update(); //将新记录存入数据库
m_pSet- >Requery(); //重建记录集
3) 删除记录
直接使用Delete() 函数,并且在调用Delete() 函数之后不需调用Update() 函数:
m_pSet- >Delete();
if (!m_pSet- >IsEOF())
m_pSet- >MoveNext();
else
m_pSet- >MoveLast();
4) 修改记录
修改记录使用Edit() 函数:
m_pSet- >Edit(); //修改当前记录
m_pSet- >m_type="发电机";
//修改当前记录字段值
...
m_pSet- >Update(); //将修改结果存入数据库
m_pSet- >Requery();
5) 撤消操作
如果用户选择了增加或者修改记录后希望放弃当前操作,可以在调用Update() 函数之前调用:
CRecordSet::Move(AFX_MOVE_REFRESH);
来撤消增加或修改模式,并恢复在增加或修改模式之前的当前记录。其中的参数AFX_MOVE_REFRESH 的值为零。
6) 数据库连接的复用
在CRecordSet 类中定义了一个成员变量m_pDatabase:
CDatabase* m_pDatabase;
它是指向对象数据库类的指针。如果在CRecordSet 类对象调用Open() 函数之前,将一个已经打开的CDatabase 类对象指针传给m_pDatabase,就能共享相同的CDatabase 类对象。如:
CDatabase m_db;
CReco (你正在阅读“VC中的ODBC编程”更多教育资讯请访问东方网教育)
。。。。。。。。。。。。。初学数据库编程,请问要把CString对象插入表中,一般使用什么样的数据类型?谢谢
--------------------------------------------------------------------------------
答:在SQLserver2000中:如果你的CString的最大长度不超过8000,可以考虑用CHAR,VARCHAR,NCHAR,NVARCHAR;否则用TEXT,NTEXT.
--------------------------------------------------------------------------------
答:同意楼上
--------------------------------------------------------------------------------
答:怎样转换为varchartext呢?SQL语言中的char和C中的char是一个概念吗?
--------------------------------------------------------------------------------
答:SQL中的字符和C中的字符是不一样的,如果你的CString对象小于8K,可将表中的对应变量定义为varchar类型(变长)假设你的CString对象叫m_string,在写入数据库时,用_bstr_t(m_string)转型后即可向数据库中写入
--------------------------------------------------------------------------------
答:voidCMultiMediaSDlg::WriteLog(CStringstrLog){CStringSystemTime;SystemTime=GetCurrentTimestr();try{_variant_tra;m_pConnection->Execute("IFNOTEXISTS(SELECT*FROMLOG.dbo.sysobjectsWHEREname='日志')CREATETABLE日志(日期varchar(50),记录varchar(50))",&ra,adCmdText);m_pConnection->Execute("INSERTINTO日志(日期,信息)VALUES(_bstr_t(SystemTime),_bstr_t(strLog))",&ra,adCmdText);}catch(_com_errore)///捕捉异常{CStringerrormessage;errormessage.Format("错误信息:s",e.ErrorMessage());AfxMessageBox(errormessage);///显示错误信息}}代码就是这个样子,表能创建成功,就是插入那两个CString对象的时候弹出出错信息,出错信息error#3092
--------------------------------------------------------------------------------
答:_variant_t(SystemTime),_variant_t(strLog)试试_bstr_t是将数据库内容转换成CString的
VC++ ,ODBC,ACESS
VC SQL sever ODBC的问题!~
VC里如何用ODBC API存储BLOB字段?
MFC ODBC是VC的一项技术吗?
用VC++做数据库编程,用ODBC接口,怎样进行程序打包
VC开发数据库能同时应用odbc和ado技术吗?
VC开发数据库能同时应用odbc和ado技术吗?
vc++下使用odbc对sql server查询后,查询结果怎么输出?
ODBC是什么
odbc设定
ODBC数据库
jdbc-odbc???
ODBC是怎么回事?
ODBC测试
[Microsoft][ODBC
关于ODBC
ODBC教程
能不能帮忙做个基与VC++和ODBC的简单的学生管理系统啊?高手20半个小时就能解决
安装VC++6.0时候,提示“ODBC's SQLInstallDriverManager failed”最后安装失败。求救啊!试过N张盘了!
安装VC++6.0时候,提示“ODBC's SQLInstallDriverManager failed”最后安装失败。求救啊!试过N张盘了!
喜之郎果冻是零食还是可增加VC
各位,水果中的VC之王是什么啊
刺梨真的是VC之王,SOD之冠吗?
ODBC 安装包