ICreateRow::CreateRow
Creates and binds to an object named by a URL and returns the requested interface pointer.
Syntax
HRESULT CreateRow(
IUnknown * pUnkOuter,
LPCOLESTR pwszURL,
DBBINDURLFLAG dwBindURLFlags,
REFGUID rguid,
REFIID riid,
IAuthenticate * pAuthenticate,
DBIMPLICITSESSION * pImplSession,
DBBINDURLSTATUS * pdwBindStatus,
LPOLESTR * ppwszNewURL,
IUnknown ** ppUnk
);
Parameters
pUnkOuter
[in] If the returned object is to be aggregated, pUnkOuter is an interface pointer to the controlling IUnknown. Otherwise, it is a null pointer.pwszURL
[in] The canonical URL naming the object to be created. If DBPROP_GENERATEURL is DBPROPVAL_GU_SUFFIX, this string defines the path to the new object and the provider will generate the URL suffix.dwBindURLFlags
[in] Bitmask of bind flags that control how the object is to be bound. For more information, see the dwBindURLFlags value table in the reference entry for IBindResource::Bind.Note
Creating a row requires DBBINDURLFLAG_WRITE be set. This is independent of whether a row, rowset, or stream view of the resource is requested.
The flag values listed in the following table are also available on ICreateRow::CreateRow, in addition to the bind flags defined in IBindResource::Bind.
Flags
Meaning
DBBINDURLFLAG_COLLECTION
Creates the object as a collection.
DBBINDURLFLAG_ISSTRUCTUREDDOCUMENT
Creates the object as a structured document.
DBBINDURLFLAG_OPENIFEXISTS
If the resource exists and is not a collection, it is opened and S_OK is returned. If it exists and is a collection, DB_E_RESOURCEEXISTS is returned. If the resource does not exist, it is created.
This flag may not be used with DBBINDURLFLAG_OVERWRITE.
NoteAll implementers of ICreateRow must support this flag.DBBINDURLFLAG_OVERWRITE
Deletes and re-creates a named object if it exists. This flag may not be used with DBBINDURLFLAG_OPENIFEXISTS.
DBBINDURLFLAG_COLLECTION | DBBINDURLFLAG_OPENIFEXISTS
If the resource is not a collection, DB_E_NOTCOLLECTION is returned. If the resource exists and is a collection, it is opened and S_OK is returned. If the resource does not exist, it is created.
Not all bind flags may be used with all object types (as specified in the rguid parameter). The following table describes the restrictions. If a client does not adhere to these restrictions, the bind will fail with E_INVALIDARG.
Object type
Restrictions
DBGUID_ROW
All flags are allowed.
DBBINDURLFLAG_OPENIFEXISTS and DBBINDURLFLAG_OVERWRITE may not be used together.
DBGUID_ROWSET
DBBINDURLFLAG_COLLECTION must be specified.
DBBINDURLFLAG_OPENIFEXISTS and DBBINDURLFLAG_OVERWRITE may not be used together.
In addition, the following flags are disallowed:
DBBINDURLFLAG_DELAYFETCHCOLUMNS
DBBINDURLFLAG_DELAYFETCHSTREAM
DBGUID_STREAM
DBBINDURLFLAG_OPENIFEXISTS and DBBINDURLFLAG_OVERWRITE may not be used together.
In addition, the following flags are disallowed:
DBBINDURLFLAG_DELAYFETCHCOLUMNS
DBBINDURLFLAG_DELAYFETCHSTREAM
rguid
[in] A pointer to a GUID indicating the type of OLE DB object to be returned. The GUID must be set to one of the following values:DBGUID_ROW
DBGUID_ROWSET
DBGUID_STREAM
Note
DBGUID_ROWSET can be requested only if the row represents a collection (that is, dwBindURLFlags set to DBBINDURLFLAG_COLLECTION).
riid
[in] Interface ID of the interface pointer to be returned.pAuthenticate
[in] Optional pointer to the caller's IAuthenticatei nterface. If supplied, it is provider-specific whether the IAuthenticate credentials are used before or after anonymous or default login credentials are used.pImplSession
[in/out] A pointer to a DBIMPLICITSESSION structure used to request and return aggregation information for the implicit session object. The DBIMPLICITSESSION structure is defined in the reference entry for IBindResource::Bind. If ICreateRow::CreateRow fails and pImplSession is not a null pointer, pImplSession->pSession should be set to NULL.Note
ICreateRow::CreateRow uses pImplSession only when implemented on a binder object and binding to a row, rowset, or stream object (rguid is DBGUID_ROW, DBGUID_ROWSET, or DBGUID_STREAM). If implemented on any other object (for example, a session or row object), the provider ignores pImplSession because the existing object already has a session context.
pdwBindStatus
[out] A pointer to memory in which to return a bitmask that describes warning status for requested bind flags. If pdwBindStatus is a null pointer, no status is returned. The bind status values are listed in the table for pdwBindStatus for IBindResource::Bind. This parameter should be set to NULL if an error code is returned.ppwszNewURL
[out] A pointer to memory in which to return a string containing a provider-generated canonical URL that names the created row. If DBPROP_GENERATEURL is DBPROPVAL_GU_SUFFIX, callers are required to pass this pointer. If DBPROP_GENERATEURL is DBPROPVAL_GU_NOTSUPPORTED and the caller passes a null value, the provider does not return the absolute URL of the created row. If the caller passes this pointer, the provider must return the absolute URL of the created row. The provider allocates the memory for this string. The consumer should free the memory with IMalloc::Free. If ICreateRow::CreateRow fails and ppwszNewURL is not a null pointer, *ppwszNewURL is set to NULL.ppUnk
[out] A pointer to memory in which to return an interface pointer on the requested object. If ICreateRow::CreateRow fails, *ppUnk is set to a null pointer.
Return Code
S_OK
The method succeeded, the object named by the URL was created and bound, and the requested interface pointer was returned.E_INVALIDARG
pwszURL or ppUnk was a null pointer.rguid was DBGUID_ROWSET, but the DBBINDURLFLAG_COLLECTION bit of dwBindURLFlags was not set.
pImplSession was not a null pointer, and pImplSession->piid was a null pointer.
dwBindURLFlags contained a flag labeled "Modifies DBBINDURLFLAG_*" in the dwBindURLFlags value table in the reference entry for IBindResource::Bind but did not contain the flag to be modified.
dwBindURLFlags contained both DBBINDURLFLAG_OPENIFEXISTS and DBBINDURLFLAG_OVERWRITE.
The provider does not support one or more values of dwBindURLFlags.
One of more of the bind flags in dwBindURLFlags are either not supported by the provider or disallowed for the object type denoted by rguid. For flags allowed for each object type, see the table in the reference entry for IBindResource::Bind.
DB_S_ASYNCHRONOUS
The method has initiated asynchronous creation of an object. The consumer can call IDBAsynchStatus::GetStatus to poll for status or can register for notifications of asynchronous processing. Until asynchronous processing is complete, the object is not populated.DB_S_ASYNCHRONOUS should be returned before DB_S_ERRORSOCCURRED.
DB_S_ERRORSOCCURRED
The bind succeeded, but some bind flags or properties were not satisfied. The consumer should examine the bind status returned in the parameter pdwBindStatus of IBindResource::Bind.DB_S_ASYNCHRONOUS should be returned before DB_S_ERRORSOCCURRED. Once rowset population is complete, the consumer can see DB_S_ERRORSOCCURRED either by calling IDBAsynchStatus::GetStatus or by receiving IDBAsynchNotify::OnStop.
DB_S_ERRORSOCCURRED
IDBProperties::SetProperties is invoked on the root binder object prior to calling ICreateRow::CreateRow method, with unsupported properties that have the dwoptions parameter set to DBPROPOPTIONS_REQUIRED.DB_E_OBJECTMISMATCH
The object named by rguid does not represent the resource named by pwszURL.DB_E_OBJECTOPEN
The provider would have to open a new connection to support this operation, and DBPROP_MULTIPLECONNECTIONS is set to VARIANT_FALSE.DB_E_RESOURCELOCKED
One or more other processes using the DBBINDURLFLAG_SHARE_* flag have locked the OLE DB object represented by this URL. IErrorInfo::GetDescription returns a string consisting of user names separated by semicolons. These are the names of the users who have the object locked.DB_E_RESOURCENOTSUPPORTED
The consumer attempted to create a type of row not supported by the provider. For example, DBBINDURLFLAG_ISSTRUCTUREDDOCUMENT was set but the provider does not support structured documents.DB_E_RESOURCEOUTOFSCOPE
ICreateRow is implemented on a session or row object, and the caller tried to bind to an object that is not within the scope of this session or row object, respectively.DB_SEC_E_PERMISSIONDENIED
The caller's authentication context does not permit access to the object. IErrorInfo::GetDescription returns the default error string.DB_SEC_E_SAFEMODE_DENIED
The provider was called within a safe mode or context, and pwszURL specified an unsafe URL.DB_E_READONLY
The caller requested write access to a read-only object.DB_E_ASYNCNOTSUPPORTED
The provider does not support asynchronous binding.DB_E_CANNOTCONNECT
The provider could not connect to the server for this object.DB_E_NOAGGREGATION
pUnkOuter was not a null pointer, and the object being created does not support aggregation.pUnkOuter was not a null pointer, and riid was not IID_IUnknown.
pImplSession was not a null pointer, pImplSession->pUnkOuter was not a null pointer, and pImplSession->piid did not point to IID_IUnknown.
pImplSession was not a null pointer, pImplSession->pUnkOuter was not a null pointer, and the object being created does not support aggregation.
DB_E_OUTOFSPACE
The provider was unable to create an object at this URL using ICreateRow::CreateRow because the server was out of physical storage.DB_E_NOTCOLLECTION
The provider was unable to create an object with the specified URL because the parent URL is not a collection.DB_E_NOTFOUND
The provider was unable to create an object with the specified URL because the parent URL does not exist.DB_E_NOTSUPPORTED
The provider supports direct binding to OLE DB objects but does not support the object type requested in rguid.DB_E_TIMEOUT
The attempt to bind to the object timed out.DB_E_RESOURCEEXISTS
The provider was unable to create an object at this URL because an object named by this URL already exists and either the caller did not specify OPENIFEXISTS or OVERWRITE or the provider does not support this behavior on object creation.REGDB_E_CLASSNOTREG
The root binder was unable to instantiate the provider binder object.E_FAIL
A provider-specific error occurred.E_NOINTERFACE
The object did not support the interface specified in riid, or riid was IID_NULL.The provider does not allow the creation of resources via ICreateRow.
E_UNEXPECTED
ICreateRow::CreateRow is implemented on a row object, ITransaction::Commit or ITransaction::Abort was called, and the object is in a zombie state.
Comments
ICreateRow::CreateRow provides the ability to create a new object named by a URL and bind it directly to a row, to a rowset, or to a row and a default stream object. If a consumer calls CreateRow on a URL that does not exist and rguid is set to DBGUID_STREAM, both a row and a default stream object are created. Only the stream object may be aggregated. The provider returns the requested interface pointer on the stream object.
The created row object "inherits" the default columns of its container's class. The provider determines what these default columns are. Whether or not to allow creation of a root row object with no inherited columns is provider-specific. For "document source" providers (that is, providers for which the value of DBPROP_DATASOURCE_TYPE is DBPROPVAL_DST_DOCSOURCE), the default columns are the columns of the resource rowset. For example, a new document inherits the default columns of its folder's class, which are the columns of the resource rowset.
Columns may be added by calling IRowSchemaChange::AddColumns. Column values may also be set with IRowChange::SetColumns.
The provider determines what the container, or parent row, is for its hierarchy. Atomic rows (for example, simple documents) are leaf nodes in a hierarchy. Collections are root nodes or intermediate nodes in a hierarchy. For example, a document's container is a folder. Given a row object, a consumer can obtain the parent by obtaining the parent URL and binding to it.
The DBBINDURLFLAG_OPENIFEXISTS and DBBINDURLFLAG_OVERWRITE bind flags may be used to specify behavior when the URL denotes an existing row. If a consumer calls ICreateRow::CreateRow on a URL that exists and does not specify DBBINDURLFLAG_OPENIFEXISTS or DBBINDURLFLAG_OVERWRITE, the provider must return DB_E_RESOURCEEXISTS. The result does not depend on the value of rguid. (The value of rguid could be DBGUID_ROW or DBGUID_STREAM.) Providers are not required to support these flags. If these flags are not supported and the consumer uses them to open a resource, the provider returns DB_E_RESOURCEEXISTS (the same error that is returned if the flag is not specified). These flags are disallowed on IBindResource::Bind. The following table outlines the behavior with and without these two flags.
Method, bind flag |
Row exists |
Row does not exist |
---|---|---|
Bind |
Open |
Fail |
CreateRow |
Fail |
Create |
CreateRow, DBBINDURLFLAG_OPENIFEXISTS |
Open |
Create |
CreateRow, DBBINDURLFLAG_OVERWRITE |
Create |
Create |
If the object was created and no warnings are issued, the provider returns S_OK. If the object was created with warnings, the provider returns DB_S_ERRORSOCCURRED. *pdwBindStatus contains any warning flags.
Binding semantics, except where noted, are identical to those of IBindResource::Bind. See the reference entry for IBindResource::Bind for a full discussion of bind flags and additional binding properties.
The scope of the session object associated with the object obtained in this call to ICreateRow::CreateRow is defined by the URL that was requested in the bind call. For more information, see Direct Binding in Binder Objects and Direct Binding, as well as the "Comments" section of the reference entry for IBindResource::Bind.
Note
"Provider Binder Objects" discusses case-sensitivity issues for URL-to-provider mapping.
Row creation and binding operations can be performed asynchronously. For more information on asynchronous processing in OLE DB, see Asynchronous Processing.
The consumer may also support and register the IAuthenticate interface via pAuthenticate to provide information to authenticate the user. If the client registers an IAuthenticate pointer, it will be called if access to the requested resource is denied. The initial attempt to access the resource uses anonymous credentials or the default logged-in credentials. For more information, see IAuthenticate in the MSDN Library documentation.
The caller should convert noncanonical URLs to canonical form before invoking this method. Providers must return URLs in canonical form. For more information, see the Win32? Internet API function InternetCanonicalizeUrl in the MSDN Library.
If returning a result code that indicates success, the provider must return it in the following order of precedence:
If an asynchronous operation was requested, the provider returns DB_S_ASYNCHRONOUS.
If the creation was successful but at least one warning was issued, the provider returns DB_S_ERRORSOCCURRED.
Otherwise, the provider returns S_OK.
Providers may own the responsibility for determining the suffix portion of the new URL. If DBPROP_GENERATEURL is DBPROPVAL_GU_SUFFIX, the caller specifies the path of the new URL in *pwszURL. The provider generates the URL suffix and returns the entire URL in **ppwszNewURL.