共用方式為


Resource.CheckOutResources method

簽出供編輯的一或多個企業資源。

Namespace:  WebSvcResource
Assembly:  ProjectServerServices (in ProjectServerServices.dll)

Syntax

'宣告
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Resource/CheckOutResources", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Resource/",  _
    ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Resource/",  _
    Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Sub CheckOutResources ( _
    array As Guid() _
)
'用途
Dim instance As Resource
Dim array As Guid()

instance.CheckOutResources(array)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Resource/CheckOutResources", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Resource/", 
    ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Resource/", 
    Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public void CheckOutResources(
    Guid[] array
)

參數

  • array
    Type: []

    若要簽出的企業資源的 Guid 的陣列。

備註

如果任何要求的資源已經簽出,則會將CheckOutResources的array參數所指定的所有資源會失敗。如果您收到PSClientError物件,使用 SOAP 例外狀況時,它不會不告訴您哪些資源已簽出。例如,下列程式碼片段會使用PSClientError來取得例外狀況的相關資訊,並將其寫至主控台。resource物件是資源的 Web 服務中的Resource類別的執行個體。

using PSLibrary = Microsoft.Office.Project.Server.Library;
. . .
try
{
    resource.CheckOutResources(resourcesToTest);
    Console.WriteLine("Checkout succeeded.");
}
catch (SoapException ex)
{
    string errMess = string.Empty;
    // Pass the exception to the PSClientError constructor to 
    // get all error information.
    PSLibrary.PSClientError psiError = new PSLibrary.PSClientError(ex);
    PSLibrary.PSErrorInfo[] psiErrors = psiError.GetAllErrors();

    for (int j = 0; j < psiErrors.Length; j++)
    {
        errMess += psiErrors[j].ErrId.ToString() + "\n";
    }
    errMess += "\n" + ex.Message.ToString();
    Console.WriteLine(errMess + "\n");
}

如果兩個資源都已經取出,一個應用程式使用者,一個給另一個使用者,則應用程式會將下列寫入主控台。

CICOAlreadyCheckedOutToYou
CICOCheckedOutToOtherUser

System.Web.Services.Protocols.SoapException: ProjectServerError(s) LastError=CICOCheckedOutToOtherUser Instructions: Pass this into PSClientError constructor to access all error information
   at Microsoft.Office.Project.Server.WebService.Resource.CheckOutResources(Guid[] array)

下列的範例主控台應用程式示範如何取得資源簽出相關的資訊。若要使用應用程式,設定資源的 Web 服務的 Web 參考,並命名為參考ResourceWS。如果沒有指定的資源已經簽出,TestResourceCheckOut.exe 簽出資源,並接著會檢查上一步中。如果任何資源已經簽出時,應用程式會將錯誤訊息寫入主控台與資源 GUID 和原因。若要執行應用程式,請指定Project Web App URL 做為引數,例如, TestResourceCheckOut https://ServerName/ProjectServerName。

using System;
using System.Collections;
using System.Text;
using System.Net;
using System.Web.Services.Protocols;
using System.Xml;

namespace TestResourceCheckOut
{
    class Program
    {
        private const string RESOURCEWEBSERVICE = "/_vti_bin/PSI/Resource.asmx";
        static ResourceWS.Resource resource = new ResourceWS.Resource();

        // Test application to determine if resources are already checked out.
        static void Main(string[] args)
        { 
            ArrayList checkedOut = null;
            String pwaUrl = args[0];
            resource.Url = pwaUrl + RESOURCEWEBSERVICE;
            resource.Credentials = CredentialCache.DefaultCredentials;

            Guid[] resourcesToTest = new Guid[3];
            // Change the following GUIDs to match resources in your system.
            resourcesToTest[0] = new Guid("{09be4db3-129e-46b9-b47a-d66ff6f2cbd2}");
            resourcesToTest[1] = new Guid("{50752a44-4b31-4f4c-bbfc-a54c10ec871a}");
            resourcesToTest[2] = new Guid("{cfb5216c-1f43-49f7-85e4-e0bab57dcdef}");

            Console.WriteLine("Trying to check out resources ...");
            
            try
            {
                // If any resources are already checked out, 
                // CheckOutResources fails for all resources.
                resource.CheckOutResources(resourcesToTest);
                Console.WriteLine("Checkout succeeded.");
            }
            catch (SoapException ex)
            {
                String tempXml = ex.Detail.InnerXml;
                checkedOut = ExtractError(tempXml);
            }

            int numAlreadyCheckedOut = checkedOut != null ? checkedOut.Count : 0;
            int totalTested = resourcesToTest.Length;
            int num2CheckIn = totalTested - numAlreadyCheckedOut;

            // Check in the resources this application just checked out.
            if (numAlreadyCheckedOut == 0)
            {
                resource.CheckInResources(resourcesToTest, false);

                for (int i = 0; i < num2CheckIn; i++)
                    Console.WriteLine(string.Format("Checked back in: {0}",
                        resourcesToTest[i].ToString()));
            }
            Console.ReadLine();
        }

        // Write reason for resource checkout error to console.
        // Return a list of resources checked out.
        static ArrayList ExtractError(String xmlstr)
        {
            ArrayList checkedOut = new ArrayList();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlstr);

            foreach (XmlNode node in doc.DocumentElement.FirstChild.ChildNodes)
            {
                String err = String.Empty;
                if (node.Name.Equals("item"))
                {
                    // The node is one error.
                    XmlNode n = node.Attributes.GetNamedItem("value");
                    err = "Error:  Resource - " + n.Value;
                    checkedOut.Add(new Guid(n.Value));

                    XmlNode childn = node.FirstChild;

                    if (childn.Name.Equals("error"))
                    {
                        XmlNode nodeItem = childn.Attributes.GetNamedItem("name");

                        switch (nodeItem.Value)
                        {
                            case "CICOAlreadyCheckedOutToYou":
                                err += "\n\t--already checked out to you.";
                                break;
                            case "CICOCheckedOutInOtherSession":
                                err += "\n\t--checked out in another session.";
                                break;
                            case "CICOCheckedOutToOtherUser":
                                err += "\n\t--checked out to another user.";
                                break;
                        }
                    }
                }
                Console.WriteLine(err);
            }
            return checkedOut;
        }
    }
}

對於兩個資源已簽出上一個案例的情況下,TestResourceCheckOut.exe 會傳回錯誤結果。

C:\Project\Test>testresourcecheckout https://servername/pwa
Trying to check out resources ...
Error:  Resource - 09be4db3-129e-46b9-b47a-d66ff6f2cbd2
        --already checked out to you.
Error:  Resource - 50752a44-4b31-4f4c-bbfc-a54c10ec871a
        --checked out to another user.

如果任何資源簽出,應用程式成功地簽出資源,並接著會檢查上一步中。

C:\Project\Test>testresourcecheckout https://servername/pwa
Trying to check out resources ...
Checkout succeeded.
Checked back in: 09be4db3-129e-46b9-b47a-d66ff6f2cbd2
Checked back in: 2e956742-bca3-4445-8d3b-8640b9ec3b26
Checked back in: cfb5216c-1f43-49f7-85e4-e0bab57dcdef

專案伺服器權限

權限

說明

ManageUsersAndGroups

允許使用者來管理所有企業使用者、 資源及群組。通用的權限。

EditEnterpriseResourceData

可讓使用者檢視這個資源的企業資源資料。類別目錄的使用權限。

Examples

下列範例會擷取企業資源、 建立幾個,如果不存在、 資源使用資源篩選器,檢查每個資源外的的話,更新可用的資源的 [ RES_CODE ] 屬性的讀取,並檢查資源回去。它會報告狀態、 更新,並在資源的狀態之前。

請在執行這個程式碼範例,參閱Prerequisites for Reference Code Samples的重要資訊。

您可以繼續以Admin/AddModifyUser.aspx您的Project Web App站台,請確認該資源在另一個工作階段中簽出

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Data;
using System.Web.Services.Protocols;
using System.Threading;
using PSLibrary = Microsoft.Office.Project.Server.Library;

namespace Microsoft.SDK.Project.Samples.CheckInResources
{
   class Program
   {
      [STAThread]
      static void Main()
      {
         try
         {
            const string PROJECT_SERVER_URI = "https://ServerName/ProjectServerName/";
            const string RESOURCE_SERVICE_PATH = "_vti_bin/psi/resource.asmx";

            SvcResource.ResourceDataSet resourceDs;
            PSLibrary.Filter resourceFilter;
            string filterXml;

            // Set up the Web service objects
            SvcResource.Resource resourceSvc = new SvcResource.Resource();

            resourceSvc.Url = PROJECT_SERVER_URI + RESOURCE_SERVICE_PATH;
            resourceSvc.Credentials = CredentialCache.DefaultCredentials;

            // Get the resources
            Console.WriteLine("Getting/Creating resources");
            Guid[] resources = EnsureEnterpriseResources(resourceSvc);

            // Read the resources so we can see what it looked like before.
            resourceFilter = GetResourceFilter(resources);
            filterXml = resourceFilter.GetXml();

            resourceDs = resourceSvc.ReadResources(filterXml, false);
            WriteTablesToConsole(resourceDs.Tables);

            // Check out resources so they can be modified
            Guid me = resourceSvc.GetCurrentUserUid();
            bool checkedOut =false;
            Random rand = new Random();
            // Modify the resources
            foreach(SvcResource.ResourceDataSet.ResourcesRow resourceRow in resourceDs.Resources)
            {
               Console.WriteLine("Check out " + resourceRow.RES_NAME);
               if (resourceRow.IsRES_CHECKOUTBYNull())
               {
                  resourceSvc.CheckOutResources(new Guid[] { resourceRow.RES_UID });
                  checkedOut=true;
               }
               else
               {
                  if (resourceRow.RES_CHECKOUTBY == me)
                  {
                     checkedOut = true;
                  }
                  else
                  {
                     checkedOut = false;
                     Console.WriteLine("\tCan't check out this resource, skip updating this one.");
                  }
               }
               if (checkedOut)
               {
                  SvcResource.ResourceDataSet updateDs = resourceSvc.ReadResource(resourceRow.RES_UID);
                  updateDs.Resources[0].RES_CODE = "A" + rand.Next(1000,9999) ;
                  Console.WriteLine("Update RES_CODE to " + updateDs.Resources[0].RES_CODE);
                  resourceSvc.UpdateResources(updateDs, false, false);
                  Console.WriteLine("Check in " + resourceRow.RES_NAME);
                  resourceSvc.CheckInResources(new Guid[] { resourceRow.RES_UID },false);
               }
               Console.ForegroundColor=ConsoleColor.Yellow;
               Console.WriteLine("".PadRight(30,'-'));
               Console.ResetColor();
            }

            // retrieve the data from the server for display
            resourceDs = resourceSvc.ReadResources(filterXml, false);
            WriteTablesToConsole(resourceDs.Tables);

         }
         catch (SoapException ex)
         {
            PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex);
            PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
            string errMess = "==============================\r\nError: \r\n";
            for (int i = 0; i < errors.Length; i++)
            {
               errMess += "\n" + ex.Message.ToString() + "\r\n";
               errMess += "".PadRight(30, '=') + "\r\nPSCLientError Output:\r\n \r\n";
               errMess += errors[i].ErrId.ToString() + "\n";

               for (int j = 0; j < errors[i].ErrorAttributes.Length; j++)
               {
                  errMess += "\r\n\t" + errors[i].ErrorAttributeNames()[j] + ": " + errors[i].ErrorAttributes[j];
               }
               errMess += "\r\n".PadRight(30, '=');
            }
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(errMess);
         }
         catch (WebException ex)
         {
            string errMess = ex.Message.ToString() +
               "\n\nLog on, or check the Project Server Queuing Service";
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Error: " + errMess);
         }
         catch (Exception ex)
         {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Error: " + ex.Message);
         }
         finally
         {
            Console.ResetColor();
            Console.WriteLine("\r\n\r\nPress any key...");
            Console.ReadKey();
         }
      }

      private static void WriteResourceState(SvcResource.ResourceDataSet resourceDs)
      {
         foreach (SvcResource.ResourceDataSet.ResourcesRow row in resourceDs.Resources.Rows)
         {
            // If the resource type is greater than the inactive offset, it is inactive.
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.Write(row.RES_NAME);
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.Write(" is ");
            if (row.RES_TYPE > (int)PSLibrary.Resource.Type.INACTIVATED_OFFSET)
            {
               Console.ForegroundColor = ConsoleColor.Red;
               Console.Write("Inactive\r\n");
            }
            else
            {
               Console.ForegroundColor = ConsoleColor.DarkGreen;
               Console.Write("Active\r\n");
            }
            Console.ResetColor();
         }
      }
      private static Guid[] EnsureEnterpriseResources(SvcResource.Resource resourceSvc)
      {
         string[] resourceNames = new string[] { "Lertchai Treetawatchaiwong", 
                                                 "Bricks", 
                                                 "Conference Room A",
                                                 "Rental"};
         PSLibrary.Resource.Type[] resourceTypes = new PSLibrary.Resource.Type[] { PSLibrary.Resource.Type.WorkResource, PSLibrary.Resource.Type.MaterialResource, PSLibrary.Resource.Type.WorkResource, PSLibrary.Resource.Type.CostResources };
         Guid[] resources = new Guid[resourceNames.Length];
         for (int i = 0; i < resourceNames.Length; i++)
         {
            resources[i] = EnsureEnterpriseResource(resourceSvc, resourceNames[i], resourceTypes[i]);
         }
         return resources;
      }
      private static Guid EnsureEnterpriseResource(SvcResource.Resource resourceSvc, string resourceName, PSLibrary.Resource.Type resourceType)
      {
         SvcResource.ResourceDataSet resourceDs = new SvcResource.ResourceDataSet();

         PSLibrary.Filter resourceFilter = new Microsoft.Office.Project.Server.Library.Filter();
         resourceFilter.FilterTableName = resourceDs.Resources.TableName;
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_INITIALSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));

         PSLibrary.Filter.FieldOperator existingResource = new PSLibrary.Filter.FieldOperator(PSLibrary.Filter.FieldOperationType.Equal, resourceDs.Resources.RES_NAMEColumn.ColumnName, resourceName);
         resourceFilter.Criteria = existingResource;
         string filterXml = resourceFilter.GetXml();
         resourceDs = resourceSvc.ReadResources(filterXml, false);
         if (resourceDs.Resources.Count >= 1)
         {
            return resourceDs.Resources[0].RES_UID;
         }
         else
         {
            resourceDs = new SvcResource.ResourceDataSet();
            SvcResource.ResourceDataSet.ResourcesRow resourceRow = resourceDs.Resources.NewResourcesRow();
            resourceRow.RES_UID = Guid.NewGuid();
            resourceRow.RES_NAME = resourceName;
            resourceRow.RES_INITIALS = resourceName.Substring(0, 1) +
                              (resourceName.IndexOf(" ") > 0 ? resourceName.Substring(resourceName.IndexOf(" ") + 1, 1) : "");
            resourceRow.RES_TYPE = (int)resourceType;
            resourceDs.Resources.AddResourcesRow(resourceRow);
            resourceSvc.CreateResources(resourceDs, false, true);
            return resourceRow.RES_UID;
         }
      }

      private static PSLibrary.Filter GetResourceFilter(Guid[] resources)
      {
         SvcResource.ResourceDataSet resourceDs = new SvcResource.ResourceDataSet();
         PSLibrary.Filter resourceFilter = new PSLibrary.Filter();
         resourceFilter.FilterTableName = resourceDs.Resources.TableName;
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_INITIALSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CODEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));

         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_ACCRUE_ATColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_BOOKING_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));

         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CAN_LEVELColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CHECKOUTBYColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CHECKOUTDATEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_COST_CENTERColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_DEF_ASSN_OWNERColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_EXTERNAL_IDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_GROUPColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HAS_NOTESColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HIRE_DATEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HYPERLINK_ADDRESSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HYPERLINK_FRIENDLY_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HYPERLINK_SUB_ADDRESSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));

         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IS_TEAMColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IS_WINDOWS_USERColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_MATERIAL_LABELColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         //resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NOTESColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));

         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_PHONETICSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_RTF_NOTESColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TERMINATION_DATEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));

         resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TIMESHEET_MGR_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));


         //List<PSLibrary.Filter.FieldOperator> resourceFieldOps = new List<PSLibrary.Filter.FieldOperator>();
         PSLibrary.Filter.IOperator[] fos = new PSLibrary.Filter.IOperator[resources.Length];
         for (int i = 0; i < resources.Length; i++)
         {
            fos[i] = new PSLibrary.Filter.FieldOperator(PSLibrary.Filter.FieldOperationType.Equal, resourceDs.Resources.RES_UIDColumn.ColumnName, resources[i]);
         }

         PSLibrary.Filter.LogicalOperator lo = new Microsoft.Office.Project.Server.Library.Filter.LogicalOperator(PSLibrary.Filter.LogicalOperationType.Or, fos);

         resourceFilter.Criteria = lo;
         return resourceFilter;
      }
      // Write all contents of a table collection to the console
      private static void WriteTablesToConsole(System.Data.DataTableCollection theTables)
      {
         Console.ForegroundColor = ConsoleColor.DarkGreen;
         foreach (System.Data.DataTable table in theTables)
         {

            int[] columnWidths = new int[table.Columns.Count];
            int tableWidth = 0;
            string dataString;
            Console.WriteLine("Table: " + table.TableName);

            // Write out the column names and get their spacing
            StringBuilder tableRow = new StringBuilder();
            for (int i = 0; i < table.Columns.Count; i++)
            {
               columnWidths[i] = GetColumnWidth(table.Columns[i]);
               tableRow.Append(table.Columns[i].ColumnName.PadRight(columnWidths[i]));

               tableWidth += columnWidths[i];
            }
            // add a space so it won't wrap
            tableWidth += 1;
            // make the console as wide as the widest table
            Console.BufferWidth = (Console.BufferWidth > tableWidth ? Console.BufferWidth : tableWidth);
            tableRow.Append("\r\n");
            Console.Write(tableRow.ToString());

            // Write out the data
            foreach (DataRow row in table.Rows)
            {
               tableRow = new StringBuilder();
               for (int i = 0; i < table.Columns.Count; i++)
               {
                  dataString = row[i].ToString();
                  // truncate output if it is wider than 
                  // the desired column width
                  if (dataString.Length >= columnWidths[i])
                  {
                     dataString = dataString.Substring(0, columnWidths[i] - 1);
                  }
                  // add the output to the stringbuilder and pad right to fill
                  // up to the column width.
                  tableRow.Append(dataString.PadRight(columnWidths[i]));
               }
               tableRow.Append("\r\n");
               Console.Write(tableRow.ToString());
            }
            Console.Write("\r\n".PadLeft(tableWidth, '-'));
         }
         Console.ResetColor();
      }
      // Helper function for WriteTablesToConsole
      private static int GetColumnWidth(DataColumn column)
      {
         // Note: may not handle byte[]data types well
         const int MAX_COL_WIDTH = 40;
         int dataWidth = 0;

         //return 12 for numbers, 30 for dates, and string width for strings.
         switch (column.DataType.UnderlyingSystemType.ToString())
         {
            case "System.Boolean":
            case "System.Byte":
            case "System.Byte[]":
            case "System.Char":
            case "System.Decimal":
            case "System.Double":
            case "System.Int16":
            case "System.Int32":
            case "System.Int64":
            case "System.SByte":
            case "System.Single":
            case "System.UInt16":
            case "System.UInt32":
            case "System.UInt64":
               dataWidth = 12;
               break;
            case "System.DateTime":
            case "System.TimeSpan":
               dataWidth = 30;
               break;
            case "System.Guid":
               dataWidth = 37;
               break;
            case "System.String":
               // If it has a maxlength, use it
               if (column.MaxLength > 0)
               {
                  dataWidth = column.MaxLength;
               }
               else
               {
                  // Otherwise use the max col width
                  dataWidth = MAX_COL_WIDTH;
               }
               break;
            default:
               dataWidth = column.ColumnName.Length;
               break;
         }
         // truncate if over the max length
         if (dataWidth > MAX_COL_WIDTH)
         {
            dataWidth = MAX_COL_WIDTH;
         }
         // always be at least as wide as the colum name
         return (column.ColumnName.Length > (dataWidth) ? column.ColumnName.Length + 1 : dataWidth);
      }
   }
}

請參閱

參照

Resource class

Resource members

WebSvcResource namespace