vc中的adodc气死我了!

蓝鹰 2012-04-08 05:42:47
void CCardViewDlog::OnBnClickedOk()
{
MainData.UpdateData(true);

CString InID;
CString InName;
CString InMoney;

this->GetDlgItem(IDC_ID)->GetWindowTextW(InID);
this->GetDlgItem(IDC_NAME)->GetWindowTextW(InName);
this->GetDlgItem(IDC_MONEY)->GetWindowTextW(InMoney);

MainData.CommandTypeEnum=CAdodc1::adCmdText;
MainData.ConnectStringTypeEnum=CAdodc1::adConnectTypeOledb;
MainData.put_RecordSource(
L"insert into T_FCAccount(姓名,身份证号,状态,金额,办理日期)values('"+InName+
"','"+InID+"','正常','"+InMoney+"',GETDATE())");

MainData.Refresh();
MainGrid.Refresh();
}


为什么会报错:对象关闭时,无法进行此操作!麻烦大侠们帮帮忙啊
...全文
181 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-04-14
  • 打赏
  • 举报
回复
这里有个操作access的例子你或许可以参考一下
http://blog.csdn.net/xianglitian/article/details/5617173
hdg3707 2012-04-14
  • 打赏
  • 举报
回复
你看我这个回复的,问题和你的一样:
CString str,str1,str2,str3;
str.Empty();
str="INSERT INTO Name (ID,Name) values ('";
m_ID.GetWindowText(str2);//m_ID的变量一定是组合框的类变量,不是数据类型,比如:int ,CStrig等
str1.Format("%s','",str2);
str+=str1;
m_Name.GetWindowText(str2);//m_Name的变量一定是组合框的类变量,不是数据类型,比如:int ,CStrig等
str1.Format("%s','",str2);
str+=str1;
这样,str的值就是"INSERT INTO Name (ID,Name) values ('ID值','名字值')";
hdg3707 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 的回复:

MainData.put_RecordSource(
L"insert into T_FCAccount(姓名,身份证号,状态,金额,办理日期)values('"+InName+
"','"+InID+"','正常','"+InMoney+"',GETDATE())");
这句不对吧,你这么改试试:
CString str;
str.Format("inse……
[/Quote]
你再仔细看看语句,我没说是L的问题,我改得和你的语句是不一样的,你的语句是把变量当成值传给插入字符串了,我是把变量的值取出来传给插入字符
蓝鹰 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

MainData未建立数据库连接或者连接已经关闭。
[/Quote]

数据库连接我在类的构造函数中就建立了,而且这个连接指针是类的成员变量,所以不存在这回事情
蓝鹰 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

要访问什么数据库
[/Quote]access

jet 4.0
蓝鹰 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

MainData.put_RecordSource(
L"insert into T_FCAccount(姓名,身份证号,状态,金额,办理日期)values('"+InName+
"','"+InID+"','正常','"+InMoney+"',GETDATE())");
这句不对吧,你这么改试试:
CString str;
str.Format("insert into T_FCAc……
[/Quote]

问题不在这里,我加L是因为我的程序用的是unicode。
woshidzze0 2012-04-10
  • 打赏
  • 举报
回复
// adoDemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "XproerDataDef.h"
#include "OleDb/OleDbCommand.h"
#include "OleDb/OleDbConnection.h"
#include "OleDb/OleDbDataReader.h"
#include "OleDb/DataTable.h"
#include "OleDb/DataRow.h"
#include "OleDb/DataValue.h"

using namespace Xproer::OleDb;

void ADODataTable(OleDbCommand& cmd)
{
int count = 0;
cmd.ExecuteScalar(L"select count(*) from xdb_news",count);
auto_ptr<DataTable> table;
table.reset(cmd.ExecuteDataTable(L"select top 10 IsTop from xdb_news"));

size_t rowCount = table->GetRowsCount();
for (int i = 0 ; i < rowCount ; ++i)
{
DataRow* row = table->GetRow(i);
DataValue* val = row->GetCel(0);

printf("时间:%d \r\n", val->ToBoolean() );
}
}

void ADORead(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
USES_CONVERSION;
wstring title;
while(r->Read())
{
//r->GetString(0,title);
//printf("标题:%s \r\n",W2A(title.c_str()));
printf("ID:%f \r\n", r->GetFloat(0) );
}
r->Close();
}

void ADOAdd(OleDbCommand& cmd)
{
cmd.SetCommandText(L"insert into xdb_about(VDouble) values(@VDouble)");
cmd.AddDoubleParam(L"@VDouble",125022.3180);

cmd.ExecuteNonQuery();
}

void ADOParam(OleDbCommand& cmd)
{
cmd.SetCommandText(L"delete from xdb_news where ID=@ID;");
cmd.AddInt32Param(L"@ID",886);
cmd.SetPrepared(true);

_variant_t index = (short)0;
_ParameterPtr param = cmd.GetCommand()->Parameters->GetItem(index);
param->Value = 887;
cmd.ExecuteNonQuery();
param->Value = 888;
cmd.ExecuteNonQuery();
param->Value = 889;
cmd.ExecuteNonQuery();
param->Value = 890;
cmd.ExecuteNonQuery();
param->Value = 891;
cmd.ExecuteNonQuery();
}

void NumericScaleX(OleDbCommand& cmd)
{
OleDbDataReader* r = cmd.ExecuteReader(L"select ProductPrice from xdb_news");
_RecordsetPtr& rs = r->GetRecordsetPtr();
rs->MoveFirst();

_variant_t vi = (short)0;
FieldPtr fd = rs->Fields->GetItem(vi);
unsigned char numeri = fd->GetNumericScale();
unsigned char precision = fd->GetPrecision();

printf("GetNumericScale:%d\r\n", fd->GetNumericScale() );
printf("GetPrecision:%d\r\n", fd->GetPrecision() );
printf("Value:%f\r\n", (float)fd->Value );
r->Close();
}

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
OleDbConnection con;
con.SetAccessConStr(L"F:\\vc9\\adoDemo\\Debug\\db.mdb");
con.Open();

OleDbCommand cmd(&con);

ADORead(cmd);

con.Close();

::CoUninitialize();
//printf("总数:%d",count);
system("pause");
return 0;
}

hdg3707 2012-04-10
  • 打赏
  • 举报
回复
MainData.put_RecordSource(
L"insert into T_FCAccount(姓名,身份证号,状态,金额,办理日期)values('"+InName+
"','"+InID+"','正常','"+InMoney+"',GETDATE())");
这句不对吧,你这么改试试:
CString str;
str.Format("insert into T_FCAccount(姓名,身份证号,状态,金额,办理日期)values('%s','%s','正常','%s','%s'",InName,InID,InMoney,GETDATA());
MainData.put_RecordSource(str);
zyq5945 2012-04-10
  • 打赏
  • 举报
回复
MainData未建立数据库连接或者连接已经关闭。
Kaile 2012-04-10
  • 打赏
  • 举报
回复
要访问什么数据库
蓝鹰 2012-04-09
  • 打赏
  • 举报
回复
我换了种方法,就是把命令类型改为存储过程,然后调用存储过程,可掉存储过程的时候又没办法传递参数!真痛苦啊!
蓝鹰 2012-04-09
  • 打赏
  • 举报
回复
我看了许多地方都没有解决办法,如果这种方法不行,是否有别的追加数据的方法?不要说用adodb,那个我用的时候老是出现com err

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧