diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c index 67dc30bf09e..1e6d2660068 100644 --- a/dlls/msdasql/session.c +++ b/dlls/msdasql/session.c @@ -1242,6 +1242,7 @@ static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFI RETCODE ret; SQLHSTMT hstmt = command->hstmt; SQLLEN results = -1; + BOOL free_hstmt = TRUE; TRACE("%p, %p, %s, %p %p %p\n", command, outer, debugstr_guid(riid), params, affected, rowset); @@ -1272,21 +1273,23 @@ static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFI msrowset->refs = 1; ICommandText_QueryInterface(iface, &IID_IUnknown, (void**)&msrowset->caller); msrowset->hstmt = hstmt; + free_hstmt = FALSE; hr = IRowset_QueryInterface(&msrowset->IRowset_iface, riid, (void**)rowset); IRowset_Release(&msrowset->IRowset_iface); } - else + + if (affected) { ret = SQLRowCount(hstmt, &results); if (ret != SQL_SUCCESS) ERR("SQLRowCount failed (%d)\n", ret); - SQLFreeStmt(hstmt, SQL_CLOSE); + *affected = results; } - if (affected) - *affected = results; + if (free_hstmt) + SQLFreeStmt(hstmt, SQL_CLOSE); return hr; } diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c index 72e13154846..bb549bb2262 100644 --- a/dlls/msdasql/tests/provider.c +++ b/dlls/msdasql/tests/provider.c @@ -569,6 +569,13 @@ static void test_command_rowset(IUnknown *cmd) if (unk) IUnknown_Release(unk); + /* Ensure all rows are deleted - Interactive Test */ + hr = ICommandText_SetCommandText(command_text, &DBGUID_DEFAULT, L"delete from testing"); + ok(hr == S_OK, "got 0x%08lx\n", hr); + + hr = ICommandText_Execute(command_text, NULL, &IID_NULL, NULL, NULL, NULL); + ok(hr == S_OK, "got 0x%08lx\n", hr); + hr = ICommandText_SetCommandText(command_text, &DBGUID_DEFAULT, L"insert into testing values(1, 'red', 1.0)"); ok(hr == S_OK, "got 0x%08lx\n", hr); @@ -594,7 +601,7 @@ static void test_command_rowset(IUnknown *cmd) DBCOLUMNINFO *dbcolinfo; OLECHAR *stringsbuffer; - todo_wine ok(affected == -1, "got %Id\n", affected); + ok(affected == -1 || affected == 1, "got %Iu\n", affected); hr = IUnknown_QueryInterface(unk, &IID_IRowset, (void**)&rowset); ok(hr == S_OK, "got 0x%08lx\n", hr);