软件的要求就是动态读取一个ACCESS数据库中的各个表,让用户来选择所需要连接的表单,连接后,根据需要进行Sort排序(就是设置sort属性的关键词)。问题是: 如果不调用排序的操作,用户动态切换数据表的连接,一切正常;可是如果调用了排序操作之后,在进行切换表单的连接,就会产生错误,错误就处在 m_pRecordset ->open(),这一句上,究竟为什么呢?????我的设计思路以及部分代码如下:统一创建对象实例
BOOL CRecorderDBDlg::createParam(void)
{ HRESULT hr;
try
{
hr=m_pConnection.CreateInstance(__uuidof(Connection));
hr=m_pRecordset.CreateInstance(__uuidof(Recordset));
return 1;
}
catch(_com_error e)
{
return 0;
}
}//动态连接数据表单
BOOL CRecorderDBDlg::connectTable(CString strTableName)
{
HRESULT hr; try
{
//以下可以确保如果数据集连接为空,以便重新获取数据;
if(m_pRecordset->State)
{
m_pRecordset->Close();
}
m_pRecordset->CursorLocation=adUseClient; //这句话能够保证程序可以通过设置数据库的sort属性对数据记录进行排序 hr=m_pRecordset->Open( _variant_t("select * from "+strTableName),
_variant_t((IDispatch *) m_pConnection),
adOpenDynamic,
adLockOptimistic,
adCmdText);
return 1;
}然后在进行排序操作
m_pRecordset->Sort=colName;
请问高手,错误在那里:??已经困扰了2个星期了。救救我把。。
BOOL CRecorderDBDlg::createParam(void)
{ HRESULT hr;
try
{
hr=m_pConnection.CreateInstance(__uuidof(Connection));
hr=m_pRecordset.CreateInstance(__uuidof(Recordset));
return 1;
}
catch(_com_error e)
{
return 0;
}
}//动态连接数据表单
BOOL CRecorderDBDlg::connectTable(CString strTableName)
{
HRESULT hr; try
{
//以下可以确保如果数据集连接为空,以便重新获取数据;
if(m_pRecordset->State)
{
m_pRecordset->Close();
}
m_pRecordset->CursorLocation=adUseClient; //这句话能够保证程序可以通过设置数据库的sort属性对数据记录进行排序 hr=m_pRecordset->Open( _variant_t("select * from "+strTableName),
_variant_t((IDispatch *) m_pConnection),
adOpenDynamic,
adLockOptimistic,
adCmdText);
return 1;
}然后在进行排序操作
m_pRecordset->Sort=colName;
请问高手,错误在那里:??已经困扰了2个星期了。救救我把。。
// SortX Function //
//////////////////////////////////////////////////////////
void SortX(void)
{
HRESULT hr = S_OK; // Initialize pointers on define.
// These are in the ADODB:: namespace.
_ConnectionPtr pConnection = NULL;
_RecordsetPtr pRstAuthors = NULL; // Define string variables.
_bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
"Initial Catalog='pubs';Integrated Security='SSPI';"); try
{
TESTHR(pConnection.CreateInstance(__uuidof(Connection))); TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset))); pRstAuthors->CursorLocation = adUseClient;
pConnection->Open (strCnn, "", "", adConnectUnspecified);
pRstAuthors->Open("SELECT * FROM authors",
_variant_t((IDispatch *) pConnection),
adOpenStatic, adLockReadOnly, adCmdText); SortXprint(" Initial Order ", pRstAuthors); //Clear the screen for the next display.
printf("\nPress any key to continue...");
getch();
system("cls");
pRstAuthors->Sort = "au_lname ASC, au_fname ASC";
SortXprint("Last Name Ascending", pRstAuthors);
//Clear the screen for the next display.
printf("\nPress any key to continue...");
getch();
system("cls"); pRstAuthors->Sort = "au_lname DESC, au_fname ASC";
SortXprint("Last Name Descending", pRstAuthors);
}
catch(_com_error &e)
{
PrintProviderError(pConnection);
PrintComError(e);
} // Clean up objects before exit.
if (pRstAuthors)
if (pRstAuthors->State == adStateOpen)
pRstAuthors->Close();
if (pConnection)
if (pConnection->State == adStateOpen)
pConnection->Close();
}http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdprosortxvc.asp
CString sql;
sql.Format(("select * from '%S'",strTableName); hr=m_pRecordset->Open( _variant_t(sql),
_variant_t((IDispatch *) m_pConnection),
adOpenDynamic,
adLockOptimistic,
adCmdText);
SQL语句最好在外面完成
xindao_wang(小日本都是猪) :
产生的错误是:(编译室没有错误,在运行时出错)
RecorderDB.exe 中的 0x7c81eb33 处未处理的异常:Microsoft C++ exception: _com_error @ 0x0012e988 。 laiyiling(【陌生人 V2.0】):
你给的代码的排序方法基本上和我的思路是一致的。差别就是你重新产生的connectioin 和recordset的实例对象(CreateInstance()),而我的程序中,是紧紧在窗体初始化的时候产生一次,其他地方紧紧是变换一下连接,难道错误就出现在这里?!!!yeedward(无知者无畏,无知者无罪。) :
你的“sql.Format(("select * from '%S'",strTableName);”,这句话无法得到正确的sql语句
这样产生的sql语句是:select * from ,strTableName没有加入进来。laker_tmj(laker):
我的软件是将数据动态的加载到listCtrl中,当用户点击列头自动在数据库中进行排序,然后重新加载到listCtrl中。你说的“你的排序可以在SQL語句中進行啊!”当然也可一,可是现在是遇到了这样一个问题,出错总归有原因,所以我想找出这个错误的原因,可以帮助更好的理解这一块亚。
' Step 2
Set cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * from authors"
' Step 3
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenStatic, adLockBatchOptimistic
' Step 4
rs("au_lname").Properties("Optimize") = True
rs.Sort = "au_lname"
rs.Filter = "phone LIKE '415 5*'"
rs.MoveFirst
Do While Not rs.EOF
Debug.Print "Name: " & rs("au_fname") & " "; rs("au_lname") & _
"Phone: "; rs("phone") & vbCr
rs("phone") = "777" & Mid(rs("phone"), 5, 11)
rs.MoveNext
Loop
pRs->Sort = "au_lname ASC";
pRs->Filter = "phone LIKE '415 5*'"; pRs->MoveFirst();
while (VARIANT_FALSE == pRs->EndOfFile)
{
printf("\a\tName: %s\t %s\tPhone: %s\n",
(rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
(rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""),
(rs.lphoneStatus == adFldOK ? rs.m_szphone : "")); if (rs.lphoneStatus == adFldOK)
memcpy(rs.m_szphone, "777", 3);
if (FAILED(hr = picRs->Update(&rs)))
_com_issue_error(hr); // Change the current row of the Recordset.
// Recordset data for the new current row will automatically be
// extracted and placed in the CCustomRs C++ instance variables.
pRs->MoveNext();
}
pRs->Filter = (long) adFilterNone;