用VC操作数据库的问题,大家帮帮忙啊!!

时间:2022-03-06 20:39:06
CDatabase m_pDatabase;
BOOL a;
a = m_pDatabase.Open(NULL);
CRecordset m_pRecord;
m_pRecord.Open (AFX_DB_USE_DEFAULT_TYPE,NULL,CRecordset::none);


问题1:
如何在OPNE函数内设置数据源的路径?

问题2:
接下来该如何用GetDefaultSQL( )或者别的函数来操作数据库?

问题3:
接下来如何把VFP表里的的Qw字段的Memo(就是备注)里面的内容写到指定的文本文件中?






以上

28 个解决方案

#1


m_pDataBase = new CDaoDatabase;
m_pDataBase->Open("A.MDB");//可以设置绝对路径
m_pRecordSet = new CDaoRecordset(m_pDataBase);
//Set up SQL statement
m_pRecordSet->Open(dbOpenDynaset, "Select * from XXX");//Open recordset using SQL statement

#2


编译102个错误……

#3


给你一个例子:
#include "stdafx.h"
#import "C:\PROGRA~1\COMMON~1\System\ado\msado15.dll" rename( "EOF", "adoEOF" )
struct InitOle 
{
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;

int main(int argc, char* argv[])
{
printf("Create a adParamReturnValue for Command object to get return value of stored procedure\n");

ADODB::_ConnectionPtr Conn1;
ADODB::_CommandPtr Cmd1;
ADODB::_RecordsetPtr Rs1; 
ADODB::_ParameterPtr retParam= NULL;
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2 (DISP_E_PARAMNOTFOUND, VT_ERROR);
_bstr_t bstrConnect( L"driver={sql server};server=Cell;Database=zhg;UID=sa;PWD=;" ); 
// the following stored procedure return 12345 int value
_bstr_t bstrCreate ( L"create proc sp_AdoTest( @InParam int,@OutParam int OUTPUT ) "
L"as "
L"select @OutParam = @InParam + 10 "
L"return 12345" );
_bstr_t bstrSP ( L"sp_Adotest" );
try
{
// Establish connection.
Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
Conn1->ConnectionString = bstrConnect;
_bstr_t bstrEmpty;
Conn1->Open( bstrConnect, bstrEmpty, bstrEmpty, -1 );
// Open recordset.
Cmd1.CreateInstance( __uuidof( ADODB::Command ) );
Cmd1->ActiveConnection = Conn1;
Cmd1->CommandText = bstrSP;
Cmd1->CommandType = ADODB::adCmdStoredProc;
retParam=Cmd1->CreateParameter(_bstr_t("returncode"),ADODB::adInteger,ADODB::adParamReturnValue,sizeof(int));
Cmd1->Parameters->Append(retParam);
Cmd1->Parameters->Refresh();
Cmd1->Parameters->Item[ _variant_t( (long) 1 ) ]->Value =
_variant_t( (long) 10 );
Cmd1->Execute( &vtEmpty, &vtEmpty2,ADODB::adCmdUnknown );
// Get return value of the stored procedure.
TCHAR tcbuf[1024];
long retvalue=(long)Cmd1->Parameters->Item[_variant_t(0L)]->Value;
wsprintf(tcbuf,"retvalue:%d",retvalue);
MessageBox(NULL,tcbuf,"Output",MB_OK);
}
catch(...) 

MessageBox(NULL,"ERROR","ERROR",MB_OK);

return 0;

#4


还是不行啊~~~

#5


CDatabase* m_pDatabase = new CDatabase;
m_pDatabase->Open(NULL);//这儿设置绝对路径还是不行
CRecordset* m_pRecordSet  =  new CRecordset(m_pDatabase);
m_pRecordSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT Bt FROM ZX.DBF",CRecordset::none);
m_pDatabase->Close ();
m_pRecordSet->Close ();
}


编译能通过,但是结束时还是有错误

#6


102个错误,应该是要包含头文件吧

#7


在构造函数中 m_pDatabase=NULL;  m_pRecordSet=NULL;

#8


还是不清楚………

#9


wjt_6@263.net发给我试试

#10


up

#11


要发什么?
VFP里面设置个有Mome的就能实验
然后用Projects 里的WIN32 CONSOLE APPLICATION做

#12


首先,要包含头文件#include <AFXDB.H>
其次,设置数据源时因该这样:
      CDatabase database;
      database.OpenEx(_T("DSN=你的数据源名称),CDatabase::......);
      省略号表示你想要打开的模式。
再次,我本人觉得CRecordSet,不能直接用,用户应该使用继承与它的子类,因  为他本身没有字段数据成员。你可以使用insert菜单,添加一个新类,基类选择成CRecordSet,VC会然你输入数据源的名称和记录集所对应的表,等类生成了,就可以直接用了,例如:
          CYourSet   yourset;
          yourset.Open();注意:open的括号里什么也不用写。
最后,我觉得这样式正确地,百试不爽。

#13


同意 guanjinke(纶巾客) :

自己派生一个CRecordSet类,ClassWazard会自动为你添加代码,

#14



问题1解决了
1、那该如何操作数据库呢?操作的结果显示在哪儿呢?
2、接下来如何把VFP表里的的Qw字段的Memo(就是备注)里面的内容写到指定的文本文件中?

#15


假设我的数据源里有ZX.DBF这张表,如何操作这张表完成我上面的问题呢?
谢谢

#16


基本同意 howard(竹园丝音[住院死因  哈哈~~~~~~]) 
我做过很多这类程序,从没出问题,不知你的102个error从何而来。

#17


CDatabase不能打开绝对数据路径,只能用来打开数据源,推荐看微软出版社的类库参考

#18


其实这些问题很简单的,我也有现成的源码!
问题是,没有给分啊!

#19


………………
楼上的,不是我不想给,确实是我不会给啊~
告诉我给分的方法……

#20


好了,hoco(流星雨) ,你应该收到了吧?

#21


啊啊啊啊~~
没人知道了吗?
急了!!

#22


在你生成的数据集类里,VC自动生成了一些数据成员,你仔细观察他们的命名方式,只是在你的表中的字段名前加了一个m_,其实这里的每一个数据成员都对应表里的一个字段,不过这些数据成员都是CString,你可以直接使用它们,例如:
     CYourSet yourset;
     CString temp;
     yourset.Open();
     temp=yourset.your_want_field;//数据库里的内容已经到temp里了,your_want_field在 CRecordSet子类里
     //如果想读下一条那么
     yourset.MoveNext();
     temp+yourset.your_want_field;
就这么简单

#23


在你生成的数据集类里,VC自动生成了一些数据成员,你仔细观察他们的命名方式,只是在你的表中的字段名前加了一个m_


以上没有发现……


后来我用MSDN下GetFieldValue函数提供的例子可行
但是

CDatabase m_pDatabase;
m_pDatabase.OpenEx(_T("DSN=zx"),0);

CMyRecordset *m_pMyRecordset = new CMyRecordset;





CRecordset rs( &m_pDatabase );
rs.Open( CRecordset::forwardOnly, _T( "SELECT Qw FROM ZX.DBF") );//为什么这个SQL语句不能加WHERE 条件啊???

CString varValue;
short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
for( short index = 0; index < nFields; index++ )
{
rs.GetFieldValue( index, varValue );
}
rs.MoveNext( );
}

rs.Close( );


m_pDatabase.Close ();




rs.Open( CRecordset::forwardOnly, _T( "SELECT Qw FROM ZX.DBF") );//为什么这个SQL语句不能加WHERE 条件啊???

#24


你可以在过滤成员变量里加入条件。例如:
m_pMyRecordSet->m_strFilter="条件“;其中条件中不能出现WHERE,只需要写成如下形式:假设表中某个字段名为firstfield,需要让他的值大于20,写成
            m_pMyRecordSet->m_strFilter="firstfield>'20'";
如果,条件中有变量,那么应写成一下形式:
            m_pMyRecordSet->m_strFilter="firstfield>"+变量;
过滤条件写好以后再打开数据集:
            m_pMyRecordSet->Open();
我现在不知道成员变量m_strFileter的拼写形式对不对,你自己查查看。

#25


OK啦!!!
分先给你吧~
呵呵
还是有问题我再你吧~
谢谢~~

#26


如果,条件中有变量,那么应写成一下形式:
m_pMyRecordSet->  m_strFilter="firstfield>  "+变量

这个好象行不通啊



#27


fire_zxv(辉) 
不好意思,最近没有上
现在给出解答:
CString sql="select * from dict where chinese like '%"+str+"%'";
m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,sql,CRecordset::none); 

你可以通过这种方式来进行查询。
也可以通过设置m_strFilter
给一个例子吧!
m_pMyRecordSet->      m_strFilter="firstfield>      "+变量//你这个当然不对啦!格式不对马!呵呵
比如说你要查的字段名是:name
m_pMyRecordSet->      m_strFilter="name='"+m_name+"'";//其中m_name是变量!

#28


ft,没有分了啊!
:(,不爽!
fire_zxv(辉)  
问题给你解决了以后可要给我份啊!

#1


m_pDataBase = new CDaoDatabase;
m_pDataBase->Open("A.MDB");//可以设置绝对路径
m_pRecordSet = new CDaoRecordset(m_pDataBase);
//Set up SQL statement
m_pRecordSet->Open(dbOpenDynaset, "Select * from XXX");//Open recordset using SQL statement

#2


编译102个错误……

#3


给你一个例子:
#include "stdafx.h"
#import "C:\PROGRA~1\COMMON~1\System\ado\msado15.dll" rename( "EOF", "adoEOF" )
struct InitOle 
{
InitOle() { ::CoInitialize(NULL); }
~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;

int main(int argc, char* argv[])
{
printf("Create a adParamReturnValue for Command object to get return value of stored procedure\n");

ADODB::_ConnectionPtr Conn1;
ADODB::_CommandPtr Cmd1;
ADODB::_RecordsetPtr Rs1; 
ADODB::_ParameterPtr retParam= NULL;
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2 (DISP_E_PARAMNOTFOUND, VT_ERROR);
_bstr_t bstrConnect( L"driver={sql server};server=Cell;Database=zhg;UID=sa;PWD=;" ); 
// the following stored procedure return 12345 int value
_bstr_t bstrCreate ( L"create proc sp_AdoTest( @InParam int,@OutParam int OUTPUT ) "
L"as "
L"select @OutParam = @InParam + 10 "
L"return 12345" );
_bstr_t bstrSP ( L"sp_Adotest" );
try
{
// Establish connection.
Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
Conn1->ConnectionString = bstrConnect;
_bstr_t bstrEmpty;
Conn1->Open( bstrConnect, bstrEmpty, bstrEmpty, -1 );
// Open recordset.
Cmd1.CreateInstance( __uuidof( ADODB::Command ) );
Cmd1->ActiveConnection = Conn1;
Cmd1->CommandText = bstrSP;
Cmd1->CommandType = ADODB::adCmdStoredProc;
retParam=Cmd1->CreateParameter(_bstr_t("returncode"),ADODB::adInteger,ADODB::adParamReturnValue,sizeof(int));
Cmd1->Parameters->Append(retParam);
Cmd1->Parameters->Refresh();
Cmd1->Parameters->Item[ _variant_t( (long) 1 ) ]->Value =
_variant_t( (long) 10 );
Cmd1->Execute( &vtEmpty, &vtEmpty2,ADODB::adCmdUnknown );
// Get return value of the stored procedure.
TCHAR tcbuf[1024];
long retvalue=(long)Cmd1->Parameters->Item[_variant_t(0L)]->Value;
wsprintf(tcbuf,"retvalue:%d",retvalue);
MessageBox(NULL,tcbuf,"Output",MB_OK);
}
catch(...) 

MessageBox(NULL,"ERROR","ERROR",MB_OK);

return 0;

#4


还是不行啊~~~

#5


CDatabase* m_pDatabase = new CDatabase;
m_pDatabase->Open(NULL);//这儿设置绝对路径还是不行
CRecordset* m_pRecordSet  =  new CRecordset(m_pDatabase);
m_pRecordSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT Bt FROM ZX.DBF",CRecordset::none);
m_pDatabase->Close ();
m_pRecordSet->Close ();
}


编译能通过,但是结束时还是有错误

#6


102个错误,应该是要包含头文件吧

#7


在构造函数中 m_pDatabase=NULL;  m_pRecordSet=NULL;

#8


还是不清楚………

#9


wjt_6@263.net发给我试试

#10


up

#11


要发什么?
VFP里面设置个有Mome的就能实验
然后用Projects 里的WIN32 CONSOLE APPLICATION做

#12


首先,要包含头文件#include <AFXDB.H>
其次,设置数据源时因该这样:
      CDatabase database;
      database.OpenEx(_T("DSN=你的数据源名称),CDatabase::......);
      省略号表示你想要打开的模式。
再次,我本人觉得CRecordSet,不能直接用,用户应该使用继承与它的子类,因  为他本身没有字段数据成员。你可以使用insert菜单,添加一个新类,基类选择成CRecordSet,VC会然你输入数据源的名称和记录集所对应的表,等类生成了,就可以直接用了,例如:
          CYourSet   yourset;
          yourset.Open();注意:open的括号里什么也不用写。
最后,我觉得这样式正确地,百试不爽。

#13


同意 guanjinke(纶巾客) :

自己派生一个CRecordSet类,ClassWazard会自动为你添加代码,

#14



问题1解决了
1、那该如何操作数据库呢?操作的结果显示在哪儿呢?
2、接下来如何把VFP表里的的Qw字段的Memo(就是备注)里面的内容写到指定的文本文件中?

#15


假设我的数据源里有ZX.DBF这张表,如何操作这张表完成我上面的问题呢?
谢谢

#16


基本同意 howard(竹园丝音[住院死因  哈哈~~~~~~]) 
我做过很多这类程序,从没出问题,不知你的102个error从何而来。

#17


CDatabase不能打开绝对数据路径,只能用来打开数据源,推荐看微软出版社的类库参考

#18


其实这些问题很简单的,我也有现成的源码!
问题是,没有给分啊!

#19


………………
楼上的,不是我不想给,确实是我不会给啊~
告诉我给分的方法……

#20


好了,hoco(流星雨) ,你应该收到了吧?

#21


啊啊啊啊~~
没人知道了吗?
急了!!

#22


在你生成的数据集类里,VC自动生成了一些数据成员,你仔细观察他们的命名方式,只是在你的表中的字段名前加了一个m_,其实这里的每一个数据成员都对应表里的一个字段,不过这些数据成员都是CString,你可以直接使用它们,例如:
     CYourSet yourset;
     CString temp;
     yourset.Open();
     temp=yourset.your_want_field;//数据库里的内容已经到temp里了,your_want_field在 CRecordSet子类里
     //如果想读下一条那么
     yourset.MoveNext();
     temp+yourset.your_want_field;
就这么简单

#23


在你生成的数据集类里,VC自动生成了一些数据成员,你仔细观察他们的命名方式,只是在你的表中的字段名前加了一个m_


以上没有发现……


后来我用MSDN下GetFieldValue函数提供的例子可行
但是

CDatabase m_pDatabase;
m_pDatabase.OpenEx(_T("DSN=zx"),0);

CMyRecordset *m_pMyRecordset = new CMyRecordset;





CRecordset rs( &m_pDatabase );
rs.Open( CRecordset::forwardOnly, _T( "SELECT Qw FROM ZX.DBF") );//为什么这个SQL语句不能加WHERE 条件啊???

CString varValue;
short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
for( short index = 0; index < nFields; index++ )
{
rs.GetFieldValue( index, varValue );
}
rs.MoveNext( );
}

rs.Close( );


m_pDatabase.Close ();




rs.Open( CRecordset::forwardOnly, _T( "SELECT Qw FROM ZX.DBF") );//为什么这个SQL语句不能加WHERE 条件啊???

#24


你可以在过滤成员变量里加入条件。例如:
m_pMyRecordSet->m_strFilter="条件“;其中条件中不能出现WHERE,只需要写成如下形式:假设表中某个字段名为firstfield,需要让他的值大于20,写成
            m_pMyRecordSet->m_strFilter="firstfield>'20'";
如果,条件中有变量,那么应写成一下形式:
            m_pMyRecordSet->m_strFilter="firstfield>"+变量;
过滤条件写好以后再打开数据集:
            m_pMyRecordSet->Open();
我现在不知道成员变量m_strFileter的拼写形式对不对,你自己查查看。

#25


OK啦!!!
分先给你吧~
呵呵
还是有问题我再你吧~
谢谢~~

#26


如果,条件中有变量,那么应写成一下形式:
m_pMyRecordSet->  m_strFilter="firstfield>  "+变量

这个好象行不通啊



#27


fire_zxv(辉) 
不好意思,最近没有上
现在给出解答:
CString sql="select * from dict where chinese like '%"+str+"%'";
m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,sql,CRecordset::none); 

你可以通过这种方式来进行查询。
也可以通过设置m_strFilter
给一个例子吧!
m_pMyRecordSet->      m_strFilter="firstfield>      "+变量//你这个当然不对啦!格式不对马!呵呵
比如说你要查的字段名是:name
m_pMyRecordSet->      m_strFilter="name='"+m_name+"'";//其中m_name是变量!

#28


ft,没有分了啊!
:(,不爽!
fire_zxv(辉)  
问题给你解决了以后可要给我份啊!