数据库:连接字符串,操作等

博客围绕数据库展开,涉及 SQL Server、Access 等数据库,还提及了 null、string 等相关内容,聚焦信息技术领域数据库方面的知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T:ADO访问数据库问题 
Q:我的Oracle8.17数据库访问代码如下:

std::string strSQL="Select PosID, SensorID, PLaneNo, SLaneNo From PosSensor Order by SensorID";

_RecordsetPtr pRecord;
try
{
 pRecord.CreateInstance( "ADODB.Recordset" );
 pRecord->Open(strSQL.c_str(), m_pConnect.GetInterfacePtr(),
     adOpenDynamic, adLockOptimistic, adCmdText);
}
catch ( _com_error &e )
{
 std::ostringstream oss;
 oss << "数据库打开PosSensor表错误:" << e.ErrorMessage();
 g_sysLog.AddLog(102, oss.str());
 return false;
}
catch (...)
{
 g_sysLog.AddLog(102, "数据库打开PosSensor表错误:未知类型");
 return false;
}

结果出错,由catch(...)捕获

把SQL语句中的Order by部分去掉就没问题。但是将此语句放到SQLPlus中运行却没问题。

每招了,望哪位大大能指点一下。
A:这样试一下

std::string strSQL="Select PosID, SensorID, PLaneNo, SLaneNo From PosSensor";

_RecordsetPtr pRecord;
try
{
 pRecord.CreateInstance( "ADODB.Recordset" );
         pRecord->CursorLocation = adUseClient;
 pRecord->Open(strSQL.c_str(), m_pConnect.GetInterfacePtr(),
     adOpenDynamic, adLockOptimistic, adCmdText);
         pRecord->Sort = "SensorID";

}
catch ( _com_error &e )
{
 std::ostringstream oss;
 oss << "数据库打开PosSensor表错误:" << e.ErrorMessage();
 g_sysLog.AddLog(102, oss.str());
 return false;
}
catch (...)
{
 g_sysLog.AddLog(102, "数据库打开PosSensor表错误:未知类型");
 return false;
}



会解决问题的
T:如何用ADO连接带有密码的ACCESS数据库 
Q:_ConnectionPtr p_Connection
p_Connection.CreateInstance("ADODB.Connection");//创建Connection对象
p_Connection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","Admin","fff",adModeUnknown);///连接数据库

////////// 上述代码连接数据库失败 请教应如何填写_ConnectionPtr 的Open 函数
A:p_Connection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","Admin","fff",adModeUnknown);///
改成
p_Connection->Open(Provider=Microsoft.Jet.OLEDB.4.0;data Source=xxx.mdb;Jet OLEDB:Database Password=XXX,"","",NULL);
T:谁能告诉我这是怎么回事啊?急!在线等,分不够在加,马上解决马上结恬!
Q:本人在MDI视图中打开一表
_bstr_t query  = strQuery;
_bstr_t source = m_strSource;
m_pUserSet->Open(query,source,adOpenDynamic,adLockOptimistic,adCmdText);
并把此表记录显示在视图的list中;
然后在右击list时打开一对话框用于添加或更改记录:
dialogtrhead.m_pUserSet     = this->m_pUserSet;
dialogtrhead.m_CurRecordPos = this->m_CurRecordPos;
if(dialogtrhead.DoModal()==IDOK)
{
    AfxMessageBox("添加记录!");
 //ASSERT(dialog1.m_hWnd);
}
然后我在dialogtrhead的OnInitDialog中取数据显示没问题:
var = m_pUserSet->GetCollect("SEQ_NO");
if(var.vt != VT_NULL) m_seqNO = (LPCSTR)_bstr_t(var);
但我在更新记录时用:
m_pUserSet->PutCollect("SEQ_NO", _variant_t(m_seqNO));
或:
pField = m_pUserSet->Fields->GetItem(_variant_t("SEQ_NO"));
pField->Value = _bstr_t("dyx");
都不行,用bOk = m_pUserSet->Supports(adUpdate);查得bOk 为0
请问这是怎么回事,我打开时用的可是adOpenDynamic啊,请各位帮我想想办法
更新记录不用_CommandPtr,这问题搞了我一个多星期了,本来都转用CommandPtr但对整个系统操作不便,一定要用recordset。
A:open打开之前要设置m_pUserSet->CursorLocation = adUseClient;

adUseClient    使用客户端游标。
T:请问高手:不用SQL server企业管理器不配置ODBC数据源,怎样直接在程序中新建数据库
Q:最好给个例子,谢谢

我在VCKBASE和优快云没有找到……
A:连接字串这么写
_ConnectionPtr pMyConnect=NULL;
 HRESULT hr=pMyConnect.CreateInstance(__uuidof(Connection)));
 if(FAILED(hr))return;

_bstr_t strConnect="Provider=SQLOLEDB; Server=server_name;"
  "Database=database_name; uid=user_name; pwd=password;";
//connecting to the database server now:
 try{pMyConnect->Open(strConnect,"","",NULL);}
 catch (_com_error &e)
 {
  ::MessageBox(NULL,e.Description(),"警告",MB_OK | MB_ICONWARNING);
 }


然后

 _RecordsetPtr m_pRecordset;
 if(!FAILED(m_pRecordset.CreateInstance( __uuidof( Recordset )))
 {
  m_pDoc->m_initialized=FALSE;
  return;
 }

 try{
  m_pRecordset->Open(_variant_t("mytable"),
            _variant_t((IDispatch *)pMyConnect,true), adOpenKeyset,
            adLockOptimistic, adCmdTable);
 }
 catch (_com_error &e)
 {
  ::MessageBox(NULL,"错误。","提示",
MB_OK | MB_ICONWARNING);
 }


Recordset对象的Open方法非常重要,它的第一个参数可以是一个SQL语句、一个表的名字或一个命令对象等等;第二个参数就是前面建立的连接对象的指针。
把Open方法的参数换一下即可
T:关于RichEdit中超过几万字的文本存入ACCESS数据库的问题!
Q:有人说过用Blob或OLEDB存。但我看到的代码都是将某个“文本文件”以这种方式存入数据库,但没看到过前台RichEdit中几万字的文本如何直接存入后台ACCESS数据库中!

我知道ACCESS中有个备注,但我须要存汉字几万个,备注也装不下!
大家谁有好办法或相关代码!帮帮我!谢谢了!
A:11. 访问长数据
在Microsoft SQL中的长数据包括text、image等这样长类型的数据,作为二进制字节来对待。
可以用Field对象的GetChunk和AppendChunk方法来访问。每次可以读出或写入全部数据的一部分,它会记住上次访问的位置。但是如果中间访问了别的字段后,就又得从头来了。
请看下面的例子:
//写入一张照片到数据库:
VARIANT varChunk;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];

//VT_ARRAY | VT_UI1
CFile f("h://aaa.jpg",CFile::modeRead);
BYTE  bVal[ChunkSize+1];
UINT uIsRead=0;
//Create a safe array to store the array of BYTES 
while(1)
{
 uIsRead=f.Read(bVal,ChunkSize);
 if(uIsRead==0)break;
 rgsabound[0].cElements =uIsRead;
    rgsabound[0].lLbound = 0;
 psa = SafeArrayCreate(VT_UI1,1,rgsabound);
 for(long index=0;index<uIsRead;index++)         
 {
  if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
  ::MessageBox(NULL,"啊,又出毛病了。","提示",MB_OK | MB_ICONWARNING);
 }
 varChunk.vt = VT_ARRAY|VT_UI1;
 varChunk.parray = psa;
 try{
  m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk);
 }
 catch (_com_error &e)
 {
  CString str=(char*)e.Description();
  ::MessageBox(NULL,str+"/n又出毛病了。","提示",MB_OK | MB_ICONWARNING);
 }
 ::VariantClear(&varChunk);
 ::SafeArrayDestroyData( psa);
 if(uIsRead<ChunkSize)break;
}//while(1) 
f.Close();

//从数据库读一张照片:
CFile f;
f.Open("h://bbb.jpg",CFile::modeWrite|CFile::modeCreate);
long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize; 
long lIsRead=0;

_variant_t varChunk;
BYTE buf[ChunkSize];
while(lPhotoSize>0)
{
 lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize;
 varChunk = m_pRecordset->Fields->
                  Item["photo"]->GetChunk(lIsRead);
 for(long index=0;index<lIsRead;index++)        
 {          
  ::SafeArrayGetElement(varChunk.parray,&index,buf+index);  
 }
 f.Write(buf,lIsRead);
 lPhotoSize-=lIsRead;
}//while()
f.Close();
T:谁敢看看我的问题给高分 
Q:
怎么样把一个照片保存在数据库中
又怎么样从数据库中提出一个照片
A://写入一张照片到数据库:
VARIANT varChunk;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];

//VT_ARRAY | VT_UI1
CFile f("h://aaa.jpg",CFile::modeRead);
BYTE  bVal[ChunkSize+1];
UINT uIsRead=0;
//Create a safe array to store the array of BYTES 
while(1)
{
 uIsRead=f.Read(bVal,ChunkSize);
 if(uIsRead==0)break;
 rgsabound[0].cElements =uIsRead;
    rgsabound[0].lLbound = 0;
 psa = SafeArrayCreate(VT_UI1,1,rgsabound);
 for(long index=0;index<uIsRead;index++)         
 {
  if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
  ::MessageBox(NULL,"啊,又出毛病了。","提示",MB_OK | MB_ICONWARNING);
 }
 varChunk.vt = VT_ARRAY|VT_UI1;
 varChunk.parray = psa;
 try{
  m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk);
 }
 catch (_com_error &e)
 {
  CString str=(char*)e.Description();
  ::MessageBox(NULL,str+"/n又出毛病了。","提示",MB_OK | MB_ICONWARNING);
 }
 ::VariantClear(&varChunk);
 ::SafeArrayDestroyData( psa);
 if(uIsRead<ChunkSize)break;
}//while(1) 
f.Close();

//从数据库读一张照片:
CFile f;
f.Open("h://bbb.jpg",CFile::modeWrite|CFile::modeCreate);
long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize; 
long lIsRead=0;

_variant_t varChunk;
BYTE buf[ChunkSize];
while(lPhotoSize>0)
{
 lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize;
 varChunk = m_pRecordset->Fields->
                  Item["photo"]->GetChunk(lIsRead);
 for(long index=0;index<lIsRead;index++)        
 {          
  ::SafeArrayGetElement(varChunk.parray,&index,buf+index);  
 }
 f.Write(buf,lIsRead);
 lPhotoSize-=lIsRead;
}//while()
f.Close();
T:请问unicode显示的问题
Q:
‘哈’的unicode编码是54C8
我用下面的代码:
 test[0]= 0xc8;
 test[1]= 0x54;
 test[2]= 0;
 printf("%s/n",test);
却出来了‘萒’字,它的unicode编码是8412
请问在C下面,如何知道unicode以后,把他正确的显示出来?
请大家帮忙啊~~~
T:求各种数据库的连接字符串格式! 
Q:谢谢!!!
A:.数据库连接字符串的写法:

以下就是进行数据库的连接,由于ADO支持的数据库种类繁多,因此连接也相当复杂。从连接类型可以分为两种:1.采用连接字符串;2.使用UDL文件。对于每种方法又有不同的写法。

①.连接字符串

===>Access Connect String

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbtest.mdb

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb;Jet OLEDB:Database Password=********;");

===>SQLServer Connect String

Driver=SQL Server;Database=fwbmk;Server=127.0.0.1;UID=sa;PWD=xx; (自带)

使用标准安全级别:

strConnect = _T("Provider=sqloledb;Data Source=MyServerName;Initial Catalog=MyDatabaseName;User Id=MyUsername;Password=MyPassword;");

使用信任连接:

strConnect = _T("Provider=sqloledb;Data Source=MyServerName;Initial Catalog=MyDatabaseName;Integrated Security=SSPI;");

指定SQLServer实例:

strConnect = _T("Provider=sqloledb;Data Source=MyServerName/MyInstanceName;Initial Catalog=MyDatabaseName;User Id=MyUsername;Password=MyPassword;");

本地数据库:

strConnect = _T("Provider=sqloledb;Data Source=(local);Initial Catalog=myDatabaseName;User ID=myUsername;Password=myPassword;");

网络数据库:

strConnect = _T("Provider=sqloledb;Network Library=DBMSSOCN;Data Source=130.120.110.001,1433;Initial Catalog=MyDatabaseName;User

3

计算机软件技术《数据库部分》——ADO开发应用程序ID=MyUsername;Password=MyPassword;");

===>Oracle Connect String

微软提供的Oracle标准连接是:

strConnect = _T("Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;");

Oracle公司提供的连接方式:

使用标准安全级别:

strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;");

使用信任连接

1.strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=/;Password=;"); UID为'/'

2.strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1;");使用OSAuthent=1

对于连接字符串可以参考以下网页: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdreforacleprovspec.asp?frame=true

http://download-west.oracle.com/otndoc/oracle9i/901_doc/win.901/a90171/using.htm

===>ODBC 配置数据源

strConnect = _T("DSN=ADOTest");

http://www.able-consulting.com/ado_conn.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值