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.


  • Mod

    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();
    }
    };


  • Mod

    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.


  • Mod

    Steppe doch mal hinein in den Code...


Anmelden zum Antworten