Partager via


Creating Items

Creating Items

This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release.

The following task shows how to create a non-collection item in the Exchange store. The example function performs the following steps:

  1. Attempts to create the item at this URL. If an error occurs, the function fails.
  2. If successful, sets the new item's DAV:contentclass property to the value " urn:content-classes:item".
  3. Returns a reference to the Record object bound to the new item.

VBScript

<job id="createitem">
<reference object="adodb.record"/>
<script language="vbscript">

If WScript.Arguments.Count < 1 Then
 WScript.Echo "Usage: cscript createitem.wsf URL [content class] [content type [, file contents name]]"
 Wscript.Echo "For example:"
 WScript.Echo " cscript createitem.wsf ""https://server/path/item.txt"" """" ""text/plain; charset=iso-8859-1"" <filename>"
 WScript.Quit
End If

Dim sUrl
Dim sContentClass
Dim sContentType
Dim sFileName

' Note: It is recommended that all input parameters be validated when they are
' first obtained from the user or user interface.
sUrl = WScript.Arguments(0)
sContentClass = WScript.Arguments(1)
sContentType  = WScript.Arguments(2)
sFileName = Wscript.Arguments(3)

Dim Rec
Wscript.Echo "Creating item at URL: " & sUrl
Set Rec = CreateItem(sUrl, sContentClass, sContentType, sFileName, Nothing)
Wscript.Echo "Succeeded."
Wscript.Echo Rec.Fields("DAV:href")
WScript.Echo Rec.Fields("DAV:contentclass")
Wscript.Echo Rec.Fields("urn:schemas:mailheader:content-type")

Function CreateItem( sUrl, sContentClass, sContentType, sFileName, Conn )

 Dim Rec
 Set Rec    = CreateObject("ADODB.Record")

 ' Did caller pass a Connection object reference?
 If Not ( VarType(Conn) = vbObject AND TypeName(Conn) = "Connection" ) Then
   Set Conn = CreateObject("ADODB.Connection")
   Conn.Provider = "ExOLEDB.DataSource"
   Conn.Open sUrl
 End If

 If sContentClass = "" Then
  sContentClass = "urn:content-classes:item" ' The default content class is urn:content-classes:item.
 End If

 If sContentType = "" Then
  sContentClass = "application/octet-stream"
 End If

 ' Try to create the item

 Rec.Open sUrl, Conn, adModeReadWrite, adCreateNonCollection
 Rec.Fields("DAV:contentclass") = sContentClass
 Rec.Fields("urn:schemas:mailheader:content-type") = sContentType
 Rec.Fields.Update

 If Not sFileName = "" Then
  Set Stm = Rec.Fields(adDefaultStream).Value
  sContentType = LCase(sContentType)
  If InStr(sContentType, "text") > -1 Then
   Stm.Type = adTypeText
   pos = InStr(sContentType, "charset=") + 8
   wscript.echo pos
   If pos > 8 Then
     sCharset = Mid(sContentType, pos)
     wscript.echo "charset: " & sCharset
     Stm.Charset = sCharset
   Else
     Stm.Charset = "US-ASCII"
   End If
  Else
   Stm.Type = adTypeBinary
  End If

  Stm.LoadFromFile sFileName
  Stm.Flush
 End If

' Clean up.
Conn.Close
Stm.Close

 Set CreateItem = Rec

End Function
</script>
</job>

The following example illustrates how to create a new non-collection item and get an existing item by using the native OLE DB interfaces directly in Microsoft® Visual C++®.

#include <oledb.h>
#include <msdasc.h>
#include <comdef.h>

#pragma comment(lib,"oledb.lib")
#pragma comment(lib,"msdasc.lib")

HRESULT CreateItem( BSTR url, IRow** ppRow )
{


   HRESULT            hr               =   S_OK;
   DWORD            dwBindStatus      =   0;
   IBindResource*      pBRes            =   NULL;
   ICreateRow*         pCrRow            =   NULL;
   ITransactionLocal*   pTrans            =   NULL;
   CLSID            clsid_ExOLEDBProviderBinder;

   if(FAILED(hr = CLSIDFromProgID(L"ExOLEDB.Binder", &clsid_ExOLEDBProviderBinder)))
      return hr;

   hr = CoCreateInstance(
      clsid_ExOLEDBProviderBinder,
      NULL,
      CLSCTX_INPROC_SERVER,
      IID_IBindResource,
      (void**)&pBRes);

   if(FAILED(hr))
      return hr;

   hr = pBRes->Bind(
      NULL,
      url,
      DBBINDURLFLAG_READWRITE,
      DBGUID_SESSION,
      IID_ICreateRow,
      NULL,
      NULL,
      &dwBindStatus,
      (IUnknown**) &pCrRow);

   if(FAILED(hr)){
      pBRes->Release();
      return hr;
   }
   pBRes->Release();

   hr=pCrRow->QueryInterface(IID_ITransactionLocal,(void**)&pTrans);
   if(FAILED(hr))
      pTrans = NULL;
   else
   {
      DWORD dwLevel = 0;
      hr = pTrans->StartTransaction(ISOLATIONLEVEL_UNSPECIFIED,0,NULL,&dwLevel);
   }

   IUnknown*  pUnk   = NULL;
   wchar_t* newUrl;
   hr = pCrRow->CreateRow(
      NULL,
      url,
      DBBINDURLFLAG_READWRITE,
      DBGUID_ROW,
      IID_IRow,
      NULL,
      NULL,
      &dwBindStatus,
      &newUrl,
      &pUnk
   );

   if(FAILED(hr)){
      if(pTrans != NULL) {
         pTrans->Abort(NULL,FALSE,FALSE);
         pTrans->Release();
      }
      pCrRow->Release();
      return hr;
   }

   hr = pUnk->QueryInterface(ppRow);

   hr = pTrans->Commit(FALSE, 0, 0 );
   pTrans->Release();
   pCrRow->Release();
   pUnk->Release();

   return hr;
}


Send us your feedback about the Microsoft Exchange Server 2003 SDK.

Build: June 2007 (2007.618.1)

© 2003-2006 Microsoft Corporation. All rights reserved. Terms of use.