OLE DB Consumer SQL native Client
-
Hu Hu,
ein paar Fragen zu Ole DB Consumern.
Wenn ich mit dem Assistenten ein Atl Ole DB Consumer hinzufüge und als Treiber den SQL Native Client auswähle kann ich keine stored procedur auswhählen, bei der Auswahl bricht der Assistent mit einer Fehlermeldung ab. Mit dem Ole DB Sql Server Treiber gehts. Wo liegt der Fehler? Sind beim Treiber gesonderte Einstellungen notwendig?
VS 2010 / SQL Express 2008 / x32
Verwende ich den Ole DB SQL Server Treiber bekomme ich bei einigen Sp´s mit Resultset keine Columnmap Variablen. Lege ich die Variablen per Hand an hängt sich das Programm genau bei Begin Column Map auf( Haltepunkt gesetzt vor der ersten Variable). Die SP ist vom ASPnet in der ASpnetdb vom System angelegt, Aspnet_Membership geht all User.
Benutzerrechte sind ausreichend.
Einer Ideen ?
Danke vorab.
-
Zeig mal ein Stück Code.
Der Code für BEGIN_COLUMN_MAP ist ein Witz, da wird nur eine Accessor Struktur aufgebaut. In diesem Moment erfolgt kein Zugriff auf den Treiber.Warum der Wizard nicht geht habe ich keine Ahnung. Ich benutze den aber nie, ich schreibe das immer von Hand.
-
Hier die SP auf die zugegriffen werden soll, vom Asp.net System erstellt und wird von ASP Formularauth genutzt.
Verwende ich den Treiber Ole DB für Sql Server und nicht den Client, enthält die vom Assistenten generierte Vorlage keine ROW Parameter, nur die Aufrufparameter.
Habe dann (weiter unten) mit dem Assi eine Querry auf eine in der SP am meisten genutzten Tabelle erstellt und editiert.
USE [aspnetdb] GO /****** Object: StoredProcedure [dbo].[aspnet_Membership_GetAllUsers] Script Date: 10/09/2011 20:24:47 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[aspnet_Membership_GetAllUsers] @ApplicationName nvarchar(256), @PageIndex int, @PageSize int AS BEGIN DECLARE @ApplicationId uniqueidentifier SELECT @ApplicationId = NULL SELECT @ApplicationId = ApplicationId FROM dbo.aspnet_Applications WHERE LOWER(@ApplicationName) = LoweredApplicationName IF (@ApplicationId IS NULL) RETURN 0 -- Set the page bounds DECLARE @PageLowerBound int DECLARE @PageUpperBound int DECLARE @TotalRecords int SET @PageLowerBound = @PageSize * @PageIndex SET @PageUpperBound = @PageSize - 1 + @PageLowerBound -- Create a temp table TO store the select results CREATE TABLE #PageIndexForUsers ( IndexId int IDENTITY (0, 1) NOT NULL, UserId uniqueidentifier ) -- Insert into our temp table INSERT INTO #PageIndexForUsers (UserId) SELECT u.UserId FROM dbo.aspnet_Membership m, dbo.aspnet_Users u WHERE u.ApplicationId = @ApplicationId AND u.UserId = m.UserId ORDER BY u.UserName SELECT @TotalRecords = @@ROWCOUNT SELECT u.UserName, m.Email, m.PasswordQuestion, m.Comment, m.IsApproved, m.CreateDate, m.LastLoginDate, u.LastActivityDate, m.LastPasswordChangedDate, u.UserId, m.IsLockedOut, m.LastLockoutDate FROM dbo.aspnet_Membership m, dbo.aspnet_Users u, #PageIndexForUsers p WHERE u.UserId = p.UserId AND u.UserId = m.UserId AND p.IndexId >= @PageLowerBound AND p.IndexId <= @PageUpperBound ORDER BY u.UserName RETURN @TotalRecords END
Hier die Klasse zur Übersicht ohne Kommentare :
// aspnet_Users.h: Deklaration von Caspnet_Users #pragma once // Code generiert auf Samstag, 8. Oktober 2011, 17:39 class Caspnet_UsersAccessor { public: //parameter LONG m_RETURN_VALUE; TCHAR m_ApplicationName[257]; LONG m_Rowstart; LONG m_RowSize; //collumn TCHAR m_UserName[257]; TCHAR m_Email[257]; TCHAR m_PasswordQuestion[257]; TCHAR m_Comment[8000]; LONG m_IsApproved; DBTIMESTAMP m_CreateDate; DBTIMESTAMP m_LastLoginDate; DBTIMESTAMP m_LastActivityDate; DBTIMESTAMP m_LastPasswordChangedDate; GUID m_UserId; LONG m_IsLockedOut; DBTIMESTAMP m_LastLockoutDate; DBSTATUS m_dwUserNameStatus; DBSTATUS m_dwEmailStatus; DBSTATUS m_dwPasswordQuestionStatus; DBSTATUS m_dwCommentStatus; DBSTATUS m_dwIsApprovedStatus; DBSTATUS m_dwCreateDateStatus; DBSTATUS m_dwLastLoginDateStatus; DBSTATUS m_dwLastActivityDateStatus; DBSTATUS m_dwLastPasswordChangedDateStatus; DBSTATUS m_dwUserIdStatus; DBSTATUS m_dwIsLockedOutStatus; DBSTATUS m_dwLastLockoutDateStatus; DBLENGTH m_dwUserNameLength; DBLENGTH m_dwEmailLength; DBLENGTH m_dwPasswordQuestionLength; DBLENGTH m_dwCommentLength; DBLENGTH m_dwIsApprovedLength; DBLENGTH m_dwCreateDateLength; DBLENGTH m_dwLastLoginDateLength; DBLENGTH m_dwLastActivityDateLength; DBLENGTH m_dwLastPasswordChangedDateLength; DBLENGTH m_dwUserIdLength; DBLENGTH m_dwIsLockedOutLength; DBLENGTH m_dwLastLockoutDateLength; void GetRowsetProperties(CDBPropSet* pPropSet) { pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL); pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL); } HRESULT OpenDataSource() { CDataSource _db; HRESULT hr; hr = _db.OpenFromInitializationString(L"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=aspnetdb;Data Source=localhost\\SQLEXPRESS;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=LAPPI;Use Encryption for Data=False;Tag with column collation when possible=False"); if (FAILED(hr)) { #ifdef _DEBUG AtlTraceErrorRecords(hr); #endif return hr; } return m_session.Open(_db); } void CloseDataSource() { m_session.Close(); } operator const CSession&() { return m_session; } CSession m_session; DEFINE_COMMAND_EX(Caspnet_UsersAccessor, _T(" { ? = CALL aspnet_Membership_GetAllUsers(?,?,?) }")) BEGIN_COLUMN_MAP(Caspnet_UsersAccessor) COLUMN_ENTRY_LENGTH_STATUS(1, m_UserName, m_dwUserNameLength,m_dwUserNameStatus) COLUMN_ENTRY_LENGTH_STATUS(2,m_Email, m_dwEmailLength,m_dwEmailStatus) COLUMN_ENTRY_LENGTH_STATUS(3, m_PasswordQuestion, m_dwPasswordQuestionLength,m_dwPasswordQuestionStatus) COLUMN_ENTRY_LENGTH_STATUS(4, m_Comment,m_dwCommentLength,m_dwCommentStatus) _COLUMN_ENTRY_CODE(5, DBTYPE_BOOL, _SIZE_TYPE(m_IsApproved), 0, 0, offsetbuf(m_IsApproved), offsetbuf(m_dwIsApprovedLength), offsetbuf(m_dwIsApprovedStatus)) COLUMN_ENTRY_LENGTH_STATUS(6,m_CreateDate,m_dwCreateDateLength,m_dwCreateDateStatus) COLUMN_ENTRY_LENGTH_STATUS(7, m_LastLoginDate,m_dwLastLoginDateLength,m_dwLastLoginDateStatus) COLUMN_ENTRY_LENGTH_STATUS(8, m_LastActivityDate,m_dwLastActivityDateLength,m_dwLastActivityDateStatus) COLUMN_ENTRY_LENGTH_STATUS(9, m_LastPasswordChangedDate,m_dwLastPasswordChangedDateLength,m_dwLastPasswordChangedDateStatus) COLUMN_ENTRY_LENGTH_STATUS(10, m_UserId,m_dwUserIdLength, m_dwUserIdStatus) _COLUMN_ENTRY_CODE(11, DBTYPE_BOOL, _SIZE_TYPE(m_IsLockedOut), 0, 0, offsetbuf(m_IsLockedOut), offsetbuf(m_dwIsLockedOutLength), offsetbuf(m_dwIsLockedOutStatus)) COLUMN_ENTRY_LENGTH_STATUS(12, m_LastLockoutDate,m_dwLastLockoutDateLength,m_dwLastLockoutDateStatus); END_COLUMN_MAP() BEGIN_PARAM_MAP(Caspnet_UsersAccessor) SET_PARAM_TYPE(DBPARAMIO_OUTPUT) COLUMN_NAME(_T("@RETURN_VALUE"), m_RETURN_VALUE) SET_PARAM_TYPE(DBPARAMIO_INPUT) COLUMN_NAME(_T("@ApplicationName"), m_ApplicationName) SET_PARAM_TYPE(DBPARAMIO_INPUT) COLUMN_NAME(_T("@PageIndex"),m_Rowstart) SET_PARAM_TYPE(DBPARAMIO_INPUT) COLUMN_NAME(_T("@PageSize"),m_RowSize) END_PARAM_MAP() };
Hier die Assesor Aufrufklasse:
[cpp]
class Caspnet_Users : public CCommand<CAccessor<Caspnet_UsersAccessor> >
{public:
HRESULT OpenAll()
{
HRESULT hr;
hr = OpenDataSource();
if (FAILED(hr))
return hr;
__if_exists(GetRowsetProperties)
{
CDBPropSet propset(DBPROPSET_ROWSET);
__if_exists(HasBookmark)
{
if( HasBookmark() )
propset.AddProperty(DBPROP_IRowsetLocate, true);
}
GetRowsetProperties(&propset);
return OpenRowset(&propset);
}
__if_not_exists(GetRowsetProperties)
{
__if_exists(HasBookmark)
{
if( HasBookmark() )
{
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetLocate, true);
return OpenRowset(&propset);
}
}
}
return OpenRowset();
}HRESULT OpenRowset(DBPROPSET *pPropSet = NULL)
{
HRESULT hr = Open(m_session, NULL, pPropSet);
#ifdef _DEBUG
if(FAILED(hr))
AtlTraceErrorRecords(hr);
#endif
return hr;
}void CloseAll()
{
Close();
ReleaseCommand();
CloseDataSource();
}
};
-
Und wo bleibt er nun hängen? Du kannst doch da hinein Debuggen.
-
Bei beginn Column Map, ich habe testweise vor jeden Eintrag und beginn C Map einen Haltepunkt gesetzt. Sobald er den beginn Column Map Eintrag passiert hat bleibts hängen. Läuft aber alles sauber durch den Compiler.
-
Steppe doch mal hinein in den Code...