[可以通过][接口][数据库]vc++中可以通过哪些接口连接到sql数据库

09月 11th, 2008 by admin
Posted in VC/MFC | No Comments »

如题,我知道比如 ado 和dao 可以连接,但是这可能并不是操作数据库最快的效率,所以我想问下还有没有其他可用的接口,效率最高的

sql数据库?? sqlserver吗???
用ole db的方法连接应该是速度最快的,但比较难掌握..其实用ADO可以了,它是对ole db的封装..
参考:
http://dev.21tx.com/2002/09/29/10096.html

恩  谢谢了 tks

Tags: , , ,

[数据库][登陆][拈]ADO 关于数据库登陆拈

08月 30th, 2008 by admin
Posted in VC/MFC | No Comments »

我想用ADO的方式访问数据库,并验证帐户和密码是否与user表中的UserID和PassWord一致,数据库的连接是没有问题的,但是总是打不开记录集,不知道是不是open语句的参数有错误?

void CLoginDlg::OnLogin()
{
UpdateData(TRUE);
_RecordsetPtr pRecord;
HRESULT hr;
_ConnectionPtr pConn;

try
{
_bstr_t Conn="DSN=sc;";
pConn.CreateInstance(_uuidof(Connection));
hr=pConn->Open(Conn,_bstr_t(""),_bstr_t(""),adModeUnknown);
}
catch(_com_error *e)
{
MessageBox(e->ErrorMessage());
}

try
{
//生成Recordset实例
pRecord.CreateInstance("ADODB.Recordset");
CString sql;
sql.Format("SELECT * FROM USER WHERE UserID=%s,m_sUserID);
//打开记录集

pRecord->Open(sql.GetBuffer(0),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

if(!pRecord->State)
{
MessageBox("不存在该用户");
}
else
{
sql+=" AND PassWord=";
sql+=m_sPassWord;
pRecord->Open(sql.GetBuffer(0),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
if(!pRecord->State)
{
MessageBox("密码不正确");
}
else
{
CMainDlg dlg; //打开主对话框
dlg.DoModal();
}
}
pRecord->Close();
pRecord=NULL;

}
catch(_com_error *e)
{
MessageBox(e->ErrorMessage());
}

}

%s 用一对单引号括起来

'%s'

字符型变量的话,要用单引号围起来.. 另外,做数据库的程序,有问题时,可以调试,把SQL语句放到数据库查询分析器中执行无误后再放到程序中.

楼主在做OLE Provider程序啊,如果只是客户端程序,就不要用VC啦,VC熟练了,其它的工具没有问题的,何必的用憋足的工具开发MIS呢。

果然SQL语句本身有问题,少加了单引号,而且表User没加方括号。
我把sql字符串改回来了,第一个open语句是没问题了,但是第二个open还是不能执行。。

那用什么工具好? delphi吗?还是c#?

sql+=" AND PassWord=";
sql+=m_sPassWord;
改成:
sql+=" AND PassWord='";
sql+=m_sPassWord + "'";
同样的问题,字符串值在SQL语句中要用单括号引起来。

用什么语言工具没关系,用熟了就好,除非特殊应用或者有特殊要求。

我加了单引号之后还是一样不能执行

学习了,还不好用吗,是不是要把sc改称sc.udl

问题好像不是出在数据库的连接上面吧

引用 9 楼 fingerplay 的回复:
我加了单引号之后还是一样不能执行

有catch到错误吗?还是程序流程不对?
//为什么用pRecord->State?应该用pRecord->IsEof && pRecord->IsBof来判断是否空记录集。

LZ你Catch到错误之后,那个错误的e.Description()返回的是什么信息呀?

引用 12 楼 lfchen 的回复:
引用 9 楼 fingerplay 的回复:
我加了单引号之后还是一样不能执行

有catch到错误吗?还是程序流程不对?
//为什么用pRecord->State?应该用pRecord->IsEof && pRecord->IsBof来判断是否空记录集。

确实是应该改成pRecord->IsEof ,这里是我的错误

就是返回一个RuntimeError的对话框,点“确定”之后又是一个应用程序错误的对话框

Tags: , , ,

[利用][创建][数据库]利用ADO DLL创建数据库应用程序出现的错误

08月 21st, 2008 by admin
Posted in VC/MFC | No Comments »

Deleting intermediate files and output files for project 'MyVC83 - Win32 Debug'.
——————–Configuration: MyVC83 - Win32 Debug——————–
Compiling resources…
Compiling…
StdAfx.cpp
e:c++myvc83debugmsado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type,
E:C++MyVC83Adodll.cpp(59) : error C2059: syntax error : '('
E:C++MyVC83Adodll.cpp(62) : error C2181: illegal else without matching if
E:C++MyVC83Adodll.cpp(64) : error C2039: 'AfxMessageBox' : is not a member of '_Recordset'
        e:c++myvc83debugmsado15.tlh(1697) : see declaration of '_Recordset'
E:C++MyVC83Adodll.cpp(67) : error C2039: 'm_pRecordset' : is not a member of '_Recordset'
        e:c++myvc83debugmsado15.tlh(1697) : see declaration of '_Recordset'
E:C++MyVC83Adodll.cpp(67) : fatal error C1903: unable to recover from previous error(s); stopping
执行 cl.exe 时出错.

MyVC83.exe - 1 error(s), 0 warning(s)

报错地方:
// Adodll.cpp : implementation file
//

#include "stdafx.h"
#include "MyVC83.h"
#include "Adodll.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAdodll dialog

CAdodll::CAdodll(CWnd* pParent /*=NULL*/)
: CDialog(CAdodll::IDD, pParent)
{
//{{AFX_DATA_INIT(CAdodll)
m_name = _T("");
m_factory = _T("");
//}}AFX_DATA_INIT
}

void CAdodll::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdodll)
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Text(pDX, IDC_NAME, m_name);
DDX_Text(pDX, IDC_FACTORY, m_factory);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAdodll, CDialog)
//{{AFX_MSG_MAP(CAdodll)
ON_BN_CLICKED(IDC_READ, OnRead)
ON_BN_CLICKED(IDC_APPEND, OnAppend)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
ON_BN_CLICKED(IDC_EDIT, OnEdit)
ON_WM_DESTROY()
ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAdodll message handlers

void CAdodll::OnRead()
{
_variant_t name,factory;
m_list.ResetContent();
try
{
if(!m_pRecordset->EOF)                //报错误地方
m_pRecordset->MoveFirst();

else                                      //报错误地方
{
AfxMessageBox("表内数据为空");      //  //报错误地方
return;
}
while(!m_pRecordset->adoEOF)                          ///  //报错误地方
{
name=m_pRecordset->GetCollect("NAME");
        factory=m_pRecordset->GetCollect("FACTORY");
if(name.vt!=VT_NULL)
m_list.AddString((LPCSTR)_bstr_t(name));
m_pRecordset->MoveNext();
}
m_list.SetCurSel(0);
OnSelchangeList1();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}

// Created by Microsoft (R) C/C++ Compiler Version 12.00.8168.0 (66642423).
//
// e:c++myvc83debugmsado15.tlh
//
// C++ source equivalent of Win32 type library C:Program FilesCommon FilesSystemadomsado15.dll
// compiler-generated file created 05/05/08 at 22:17:21 - DO NOT EDIT!

#pragma once
#pragma pack(push, 8)

#include <comdef.h>

//
// Forward references and typedefs
//

/////////////////

struct __declspec(uuid("00000556-0000-0010-8000-00aa006d2ea4"))
_Recordset : Recordset21                  //报错误地方

{
    //
    // Wrapper methods for error-handling
    //

    HRESULT Save (
        const _variant_t & Destination,
        enum PersistFormatEnum PersistFormat );

    //
    // Raw methods provided by interface
    //

    virtual HRESULT __stdcall raw_Save (
        VARIANT Destination,
        enum PersistFormatEnum PersistFormat ) = 0;
};

看编译报错信息应该是命名空间的冲突。

void CAdodll::OnRead() 
{
_variant_t name,factory;
m_list.ResetContent();
try
{
if(!m_pRecordset->adoEOF)                //报错误地方
m_pRecordset->MoveFirst();
else                                      //报错误地方
{
AfxMessageBox("表内数据为空");      //  //报错误地方
return;
}
while(!m_pRecordset->adoEOF)                          ///  //报错误地方
{
name=m_pRecordset->GetCollect("NAME");
factory=m_pRecordset->GetCollect("FACTORY");
if(name.vt!=VT_NULL)
m_list.AddString((LPCSTR)_bstr_t(name));
m_pRecordset->MoveNext();
}
m_list.SetCurSel(0);
OnSelchangeList1();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}

看信息,有两个可能:
1,类库的权限设置错误.
2,类库里面的类成员定义与系统有过成员保留名称重名,还有就是没定义,像'm_pRecordset' ,应该在dll里面没有定义!

Tags: , , ,

[依赖][数据库][RecordSet]不依赖于数据库的RecordSet对象的创建,大家来抢分

08月 19th, 2008 by admin
Posted in VC/MFC | No Comments »

如何手工创建一个RecordSet对象,不依赖于数据库,,

手工创建他的结构与插入数据,

我现在需要2张表对比,把一张表里有的数据,在另外一张表里全找出来,

大家速度抢分

没看明白

不依赖于数据库

什么意思?

是ODBC还是ADO啊?? 用SQL语句打开记录集不就行了???
ADO的方法:
m_pRs->Open("select * from test",_variant_t((IDispatch*)m_pConn,true),
adOpenDynamic,adLockOptimistic,adCmdUnknown);

ODBC的方法:
rs.Open( CRecordset::forwardOnly,_T( "SELECT * FROM test" ) );

不依赖于数据库那就写在文件里比如XML

不依赖数据库?那应该不叫recordset了…….

….还是我自己找到了,,,

C/C++ code
CoInitialize(NULL); try { _variant_t varNull; CoInitialize(NULL); _RecordsetPtr pRs(__uuidof(Recordset)); pRs->Fields->Append("rsMainkeyID",adBSTR, 50, adFldUnspecified, varNull); pRs->Open(vtMissing,vtMissing,adOpenUnspecified,adLockUnspecified,adCmdUnspecified); pRs->AddNew(); pRs->Fields->Item["rsMainkeyID"]->Value = "ssss"; CoUninitialize(); } catch(_com_error& e) { cout << e.Description() << endl; }

Tags: , , ,

[访问][服务器][数据库]关于VC用ADO访问服务器数据库遇到的防火墙问题

08月 7th, 2008 by admin
Posted in VC/MFC | No Comments »

我今天编了一个访问服务器的测试程序,此程序在不启动防火墙的情况下好使,但是启动了防火墙就不好使了,请问怎样才能透过防火墙啊?!
请大家多多指教!
我的代码如下:
void CADODlg::OnButton1()
{
// TODO: Add your control notification handler code here
try
{
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));

//远程链接
pConn->ConnectionString="driver={sql server};server=ibm;uid=sa;pwd=sa;database=pubs";

pConn->Open(_bstr_t(pConn->ConnectionString),"","",adModeUnknown);
pRst=pConn->Execute("select * from authors",NULL,adCmdText);
while(!pRst->adoEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
(_bstr_t)pRst->GetCollect("au_lname"));
pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
CoUninitialize();
}
catch (_com_error &e)
{
CString errormessage;
errormessage.Format("错误信息:
%s
%s",e.ErrorMessage(),e.Description());
AfxMessageBox(errormessage);///显示错误信息

}
}

接分是王道!

有问题请先GOOGLE,BAIDU

支持搂主,收藏

Tags: , , ,

[何在][引用][数据库]如何在VC里引用SQL数据库文件

08月 4th, 2008 by admin
Posted in VC/MFC | No Comments »

将数据库文件放在程序里,使程序在没有安数据库的电脑上也能运行,可不可以呢。

引用 1 楼 pcwe2002 的回复:
access,asa可以

sqlserver,oracle,sybase不行

什么数据库都不可以。

Access 可以,是因为 Windows2000 以后的操作系统自带了数据库引擎。

Sybase ASA 也必须附带引擎文件。

数据库 和 文件是存储的两种不同的方式;

理论上来说,应用程序读写数据库,不需要关心数据的存储方式等问题;

而文件需要关心。

原因就是因为读写数据库必须通过数据库引擎实现。

看你是什么数据库而定.. 微软的库的话,一般只要数据库文件即可,其它公司的库则需要安装相应环境..

不都是Microsoft SQL Server 2000吗,可以吗。

应该不需要,ODBC的话肯定可以,ADO的话,你可以找台没有装的机器试试..

怎么弄呢,在其他机子不行啊

你是准备在别人的电脑上用你的程序访问他电脑上面的本地数据库文件吗?? 如果是这样,你必须在他的电脑上面安装sql server2000并启动你程序所访问的数据库才行..

只好这样了,谢谢

Tags: , , ,

[访问][access][数据库]ado访问access数据库得到的数据集如何进行分页处理

08月 4th, 2008 by admin
Posted in VC/MFC | No Comments »

要将记录分页显示在clistctrl控件中,那位大狭指点一下,最好有源代码,多谢了

用listctrl显示记录集数据的话,可以使用ado分页的方法: 

用Recordset的PageSize指定每页记录数 
操作AbsolutePage属性设置当前的页面。 
PageCount得到总页数。 

演示代码: 
int  CurrentPage=1;  //全局变量,用于判断当前页面。初始为1 
m_pRecordset->PageSize=10;                                      //限制每一页10条记录 
m_pRecordset->CursorLocation  =  adUseClient;    //使用客户端游标 
m_pRecordset->Open("SELECT  *  FROM  Test",//  查询表中所有字段 
                      _variant_t((IDispatch*)m_pConn,true),adOpenStatic,adLockOptimistic,adCmdUnknown); 

添加4个按钮,填写消息处理 
void  CAdoRWAccessDlg::OnFirst()  //第一页 

                PositionEnum  page; 
          page=(PositionEnum)1; 
                m_pRecordset->AbsolutePage=page; 
           
          CurrentPage=1; 
                OnReadAccess();    //自定义的函数,表示输出记录到控件 

void  CAdoRWAccessDlg::OnPrepage()  //上一页 

          if((int)CurrentPage==1) 
          { 
                      MessageBox("当前已经在第一页"); 
                      return  ; 
          } 
          else 
          { 
                      PositionEnum  page; 
                      –CurrentPage; 
                      page=(PositionEnum)CurrentPage; 
                      m_pRecordset->AbsolutePage=page; 
          } 
          OnReadAccess(); 

void  CAdoRWAccessDlg::OnLastpage()  //最后一页 

          PositionEnum  page; 
          page=(PositionEnum)m_pRecordset->PageCount; 
                m_pRecordset->AbsolutePage=page; 

          CurrentPage=page; 

                OnReadAccess();             

void  CAdoRWAccessDlg::OnNextpage()  //下一页 

            if(CurrentPage==m_pRecordset->PageCount) 
          { 
                      MessageBox("已经是最后一页"); 
                      return  ; 
          } 
          else 
          { 
                      PositionEnum  page; 
                      ++CurrentPage; 
                      page=(PositionEnum)CurrentPage; 
                      m_pRecordset->AbsolutePage=page; 
          } 
          OnReadAccess(); 

void  XXX::OnReadAccess()    //输出到ListCtrl 

….. 
for(int  i=1;((i <=m_pRecordset->PageSize)&&(!m_pRecordset->adoEOF));i++) 

                ….      //关于ListCtrl的操作省略 
          m_pRecordset->MoveNext(); 

}

Tags: , , ,

[数据库]关于数据库的问题,用VC做的

08月 3rd, 2008 by admin
Posted in VC/MFC | No Comments »

现在我用VC+Access做一个人事薪资管理系统,就是不知道用什么来做才有利于系统的稳定.我个人打算是用ODBC + CRecordset类.说说你们的看法

系统稳定?? 不知道你具体是指什么.. 把要求说详细点… 作为ODBC程序,建议使用如下代码包住你数据库操作的代码,捕获可能的数据库操作异常:
try
{
    //你数据数据库操作的代码
}
catch(CDBException *e)
{
    AfxMessageBox("连接数据库失败,请检查数据库连接情况!
" + e->m_strError);
}

考虑多种情况

现在决定用ADO,大家有没有ADO这方面的知识共享一下

Tags: ,

[数据库][记录][内容]vc 数据库 获取表中记录的内容

07月 24th, 2008 by admin
Posted in VC/MFC | No Comments »

我想问的是能不能一次获取一行记录(这一行记录中有很多数据项,象什么ID,NAEM,…),注意不是独个获取后综合。不要没看清问题就回哦,这样不给分哦.

引用楼主 oceanbin 的帖子:
我想问的是能不能一次获取一行记录(这一行记录中有很多数据项,象什么ID,NAEM,…),注意不是独个获取后综合。

//我承认我还是没看懂问题。

我也没读懂!

我大概明白楼主什么意思了。

答案是没有。

各字段的数据类型可能都不一样,只能一个一个获取,然后转换成字符串,连接起来。

如果是按上面理解的话,只能感叹:楼主的想法真好~~

确实有点难道,不同类型的数据,只能分开取,而且这样也不难啊!

如果一张表数据很庞大,这样取,效率岂不很低?

楼主认为自己的想法怎么样

数据再庞大,既然分了字段,就是想分开表示不同内容的,你难道想一长串数据显示在一块郁闷死用户??

既然只能这样,那就没办法了。结帖去……

Tags: , , ,

[数据库][access][崩溃]MFC 连接数据库 access 开表就崩溃 100分 在线等

07月 22nd, 2008 by admin
Posted in VC/MFC | No Comments »

BOOL CaccessApp::InitInstance()
我在这个函数里面开库

if(!AfxOleInit())
{
AfxMessageBox(TEXT("初始化COM库失败,应用程序关闭"));
return FALSE;
}

///创建ADO 数据库连接指针和操纵记录集指针实例
conn.CreateInstance(__uuidof(Connection));
res.CreateInstance(__uuidof(Recordset));
///连接数据库打开数据库
conn->Open(TEXT("provider=microsoft.jet.oledb.4.0;data source=1.mdb"),
TEXT(""),TEXT(""),adModeUnknown);

在另一个对话框里 开表 只要一开表 马上就崩溃 不知道是为啥
#define res  theApp.res
#define conn theApp.conn

BOOL CaccessDlg::OnInitDialog()

res->Open("select * from s1",conn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
res->Close();

楼上的方法不行 还是崩溃

连接数据库是否成功?这个不知道你判断了没有?

这里有个完整的例子,照着写吧:

http://www.vckbase.com/document/viewdoc/?id=1215

1、确保对话框也是属于主线程
2、在崩溃的地方使用try-catch块来捕获错误信息

引用 4 楼 jameshooo 的回复:
1、确保对话框也是属于主线程
2、在崩溃的地方使用try-catch块来捕获错误信息

我已经用 TRY 的方法了
  就是崩溃
一点反映都没有改变
我建立的是基于对话框的
一定是主线程的‘

难道一点出错提示都没有?直接退出?

断点,追踪看看你的数据库连接指针传递到对话框了吗?

conn->Open(TEXT("provider=microsoft.jet.oledb.4.0;data source=1.mdb"),
TEXT(""),TEXT(""),adModeUnknown);

最后一个参数改成adConnectUnspecified 或 adAsyncConnect 试试

_ConnectionPtr->Open 方法最后那个参数好像只是

enum ConnectOptionEnum
{
  adConnectUnspecified = -1,
  adAsyncConnect      = 16
}

1. 你单步调试一下定位出错代码行.
2. 在你的对话框里面直接定义,初始化connection , recordset等变量再试试..

记录集指针在用的地方定义

inline HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) {
    HRESULT _hr = raw_Open(Source, ActiveConnection, CursorType, LockType, Options);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return _hr;

提示到这里有错误 10楼的什么意思
谁方便的话 QQ 指导一下 100 分送上
QQ 46655550

有没有人帮帮忙哦

微软ADO的例子有很多,到这里看看,对照自己哪儿写得欠妥:
http://msdn.microsoft.com/en-us/library/ms677563.aspx

看起来是打开记录集的错误
而没有你的代码

你不是把access文件里的表自己打开了吧。。。


res->Open("select * from s1",conn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
res->Close();
放到InitInstance的
conn->Open(TEXT("provider=microsoft.jet.oledb.4.0;data source=1.mdb"),
TEXT(""),TEXT(""),adModeUnknown);
下面
看看有没有错误

google搜索"ado.h"

去掉那宏
用theapp.xxx

res->Open("select * from s1",conn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

换成试试,
res=conn->Execute("select * from s1",NULL,adCmdText);

引用 16 楼 Elysium 的回复:

res->Open("select * from s1",conn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
res->Close();
放到InitInstance的
conn->Open(TEXT("provider=microsoft.jet.oledb.4.0;data source=1.mdb"),
TEXT(""),TEXT(""),adModeUnknown);
下面
看看有没有错误

这样就不会有错误
把开表和开库放一起就没有错误
请问是什么原因呢?

执行顺序错误

楼上的 啥意思 解释一下 谢谢

//#define res  theApp.res
//#define conn theApp.conn
BOOL CaccessDlg::OnInitDialog()

res->Open("select * from s1",theApp.conn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
res->Close();

res => theApp.res
或者
extern _ConnectionPtr conn;
extern _RecordsetPtr res;

老大们 详细点好么 谢谢

你发给我好了
shakaqrj@yahoo.com.cn

Tags: , , ,