Resource.CheckOutResources 方法
签出一个或多个企业资源,以进行编辑。
命名空间: WebSvcResource
程序集: ProjectServerServices(位于 ProjectServerServices.dll 中)
语法
声明
<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
类型:[]要签出的企业资源的 Guid 的数组。
备注
如果任何所请求的资源已签出, CheckOutResources失败的array参数指定的所有资源。如果您收到使用 SOAP 异常的PSClientError对象,它不告诉您哪些资源已签出。例如,下面的代码片段使用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 和原因一条错误消息。若要运行应用程序,指定作为参数,例如, TestResourceCheckOut https://ServerName/ProjectServerNameProject Web App URL。
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
Project Server 权限
权限 |
描述 |
---|---|
使用户能够管理所有企业用户、 资源和组。全局权限。 |
|
允许用户查看此资源的企业资源数据。类别权限。 |
示例
以下示例检索企业资源、 创建几个,如果不存在、 读取资源使用资源筛选器,将签出的每个资源如果可用,更新可用资源的RES_CODE属性,并检查回资源。它报告之前状态、 进行,更新和资源的后的状态。
Please see Project 2013 中基于 ASMX 的代码示例的先决条件 for critical information on running this code sample.
您可以转到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);
}
}
}