- وصلهی نسخهی ویندوز 8 و ویندوز سرور 2012 آن از اینجا قابل دریافت است؛ نسخهی ویندوز 7 و ویندوز سرور 2008 از اینجا.
+ آپدیت ویندوز را روشن کنید تا آخرین به روز رسانیها و نگارشهای دات نت نصب شده را به صورت خودکار دریافت کنید.
DECLARE @data XML SET @data = '<people> <person> <name> <givenName>name1</givenName> <familyName>lname1</familyName> </name> <age>33</age> <height>short</height> </person> <person> <name> <givenName>name2</givenName> <familyName>lname2</familyName> </name> <age>40</age> <height>short</height> </person> <person> <name> <givenName>name3</givenName> <familyName>lname3</familyName> </name> <age>30</age> <height>medium</height> </person> </people>'
declare @data xml set @data = (select * from openrowset(bulk 'c:\path\data.xml', single_blob) as x)
for $p in doc("data.xml")/people/person where $p/age > 30 return $p/name/givenName/text()
SELECT @data.query(' for $p in /people/person where $p/age > 30 return $p/name/givenName/text() ')
SELECT @data.value('/people/person/age', 'int')
XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
SELECT @data.value('(/people/person/age)[1]', 'int')
Infer.exe people.xml -o schema.xsd
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="people"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="person"> <xs:complexType> <xs:sequence> <xs:element name="name"> <xs:complexType> <xs:sequence> <xs:element name="givenName" type="xs:string" /> <xs:element name="familyName" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="age" type="xs:unsignedByte" /> <xs:element name="height" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
declare @schema xml set @schema = (select * from openrowset(bulk 'c:\path\schema_1.xsd', single_blob) as x)
CREATE XML SCHEMA COLLECTION poeple_xsd AS @schema
DECLARE @data XML(poeple_xsd) SET @data = 'مانند قبل با همان محتوایی که در ابتدای بحث عنوان شد'
SELECT @data.value('/people/person[1]/age', 'int')
XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xs:unsignedByte *'
DECLARE @data XML(document poeple_xsd)
DECLARE @x XML SET @x='' SELECT @x.query( ' 1,2 (: 1,2 :) ')
DECLARE @x XML SET @x='' SELECT @x.query( ' for $x in (1,2,3) for $y in (4,5) return ($x,$y) ')
DECLARE @x XML SET @x='' SELECT @x.query( ' 1, <node/> ')
XQuery [query()]: Heterogeneous sequences are not allowed: found 'xs:integer' and 'element(node,xdt:untyped)'
C:\>"C:\Program Files\Microsoft SQL Server\140\Tools\Binn\SqlLocalDB.exe" i MSSQLLocalDB ProjectsV13 v12.0 C:\>"C:\Program Files\Microsoft SQL Server\140\Tools\Binn\SqlLocalDB.exe" s MSSQLLocalDB LocalDB instance "MSSQLLocalDB" started.
رفع اشکال خطای an error was encountered in the transport layer در هنگام وصل شدن از کلاینتی که در یک کامپیوتر دیگر نصب شده است به Sql Server Analysis Services
در هنگام برخورد با این مشکل، پس از بررسیها و تستهای مختلف و پیاده کردن روشهای متفاوتی که در وب مطرح شده بود، به فکرم رسید که شاید از طریق درج مستقیم پورت بتوان مشکل را حل کرد که مراحل آن به شرح ذیل میباشد:
برای بدست آوردن پورتی ( Port ) که Analysis Services به آن گوش میدهد و با آن کار میکند، باید کارهای ذیل انجام شوند:
از طریق Sql Server Configuration Manager، همانطور که در تصویر آمده است، PID یا Process Id را که مربوط به Sql Server Analysis Services میشود، برای هر نمونهای ( Instance ) که میخواهیم به آن وصل شویم، بدست میآوریم:
سپس از طریق Command Prompt دستور ذیل را اجرا میکنیم:
netstat /abo >>c:\output.txt
پس از آن کافی است که در رشتهی اتصال به Analysis Services از آن Port استفاده کنیم:
و یا
[ServiceContract] public interface IBookService { [OperationContract] int GetCountOfBook(); }
[ServiceBehavior(IncludeExceptionDetailInFaults = true)] public class BookService : IBookService { public int GetCountOfBook() { return 10; } }
class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(BookService)); var binding = new BasicHttpBinding(); host.AddServiceEndpoint(typeof(IBookService), binding, "http://localhost/BookService"); host.Open(); Console.Write("BookService host"); Console.ReadKey(); } }
static void Main(string[] args) { Thread.Sleep(2000); BasicHttpBinding binding = new BasicHttpBinding(); ChannelFactory<IBookService> channel = new ChannelFactory<IBookService>(binding, new EndpointAddress("http://localhost/BookService")); Console.WriteLine("Count of book: {0}", channel.CreateChannel().GetCountOfBook()); Console.ReadKey(); }
تا اینجا هیچ گونه اعتبار سنجی انجام نشد. برای پیاده سازی اعتبار سنجی باید یک سری تنظیمات بر روی Binding و Hosting سمت سرور و البته کلاینت بر قرار شود. فایل Program پروزه Service را باز نمایید و محتویات آن را به صورت زیر تغییر دهید:
static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(BookService)); var binding = new BasicHttpBinding(); binding.Security = new BasicHttpSecurity(); binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom; host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomUserNamePasswordValidator(); host.AddServiceEndpoint(typeof(IBookService), binding, "http://localhost/BookService"); host.Open(); Console.Write("BookService host"); Console.ReadKey(); }
public class CustomUserNamePasswordValidator : UserNamePasswordValidator { public override void Validate(string userName, string password) { if (userName != "Masoud" || password != "Pakdel") throw new SecurityException("Incorrect userName or password"); } }
این خطا از آن جا ناشی میشود که تنظیمات کلاینت و سرور از نظر امنیتی با هم تناسب ندارد. در نتیجه باید تنظیمات Binding کلاینت و سرور یکی شود. برای این کار کد زیر را به فایل Program سمت کلاینت اضافه میکنیم:
static void Main(string[] args) { Thread.Sleep(2000); BasicHttpBinding binding = new BasicHttpBinding(); binding.Security = new BasicHttpSecurity(); binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; ChannelFactory<IBookService> channel = new ChannelFactory<IBookService>(binding, new EndpointAddress("http://localhost/BookService")); channel.Credentials.UserName.UserName = "WrongUserName"; channel.Credentials.UserName.Password = "WrongPassword";
Console.WriteLine("Count of book: {0}", channel.CreateChannel().GetCountOfBook()); Console.ReadKey(); }
channel.Credentials.UserName.UserName = "WrongUserName"; channel.Credentials.UserName.Password = "WrongPassword";
context.Database.Connection.ConnectionString = "...";
در این قسمت در خصوص توابع مرتبط با ساختار سلسله مراتبی
صحبت خواهد شد.
Select { [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006], cousin( [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006], [Date].[Calendar].[Calendar Year].[CY 2007] ) } on columns, [Measures].[Reseller Sales Amount] on rows From [Adventure Works]
تابع عمو زاده به این صورت کار می کند که دو پارامتر می گیرد . پارامتر اول سطح فعلی را مشخص می کند . پارامتر دوم سطح بالاتر از سطح اول را مشخص می کند در ساختار سلسله مراتبی و خروجی برابر است با سطحی برابر سطح پارامتر اول در زیر مجموعه ی پارامتر دوم و هم تراز پارامتر اول .
خروجی به صورت زیر میباشد:
خوب حالا به ساختار زیر دقت کنید (ساختار سلسله مراتبی Date )
همانطور که مشخص میباشد تاریخها از 2005 تا 2008 و سال 2010 میباشند و فصول عبارتند از دو فصل پایانی سال 2005 و تمامی فصول سال 2006 و 2007 و سه فصل اول سال 2008 و فصل چهارم سال 2010 . حال دوباره به کوئری نوشته شده دقت کنید. در کوئری بالا فصل همسطح فصل اول سال 2006 در سال 2007 مورد واکشی قرار گرفته است که همان فصل اول در سال 2007 میباشد.
حال به بررس کوئری زیر خواهیم پرداخت:
Select { [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006], cousin( [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006], [Date].[Calendar].[Calendar Semester].[H2 CY 2006] ) } on columns, [Measures].[Reseller Sales Amount] on rows From [Adventure Works]
در این کوئری ما ابتدا ستون فصل اول سال 2006 را بر می گردانیم . سپس در تابع پسر عمو در نیم فصل دوم سال 2006 به دنبال هم سطح فصل اول 2006 می گردیم .
نمودار درختی زیر توضیح کاملی به ما خواهد داد:
حال برای ادامهی مطلب کار بر روی ساختارهای سلسله مراتبی، ابتدا باید در خصوص نحوهی ایجاد Range توضیحاتی ارایه گردد. دو کوئری زیر را در نظر گرفته و خروجی آنها را با هم مقایسه نمایید
Select { [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006], [Date].[Calendar].[Calendar Quarter].[Q2 CY 2006], [Date].[Calendar].[Calendar Quarter].[Q3 CY 2006] } on columns, [Measures].[Reseller Sales Amount] on rows From [Adventure Works]
و
Select [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006]: [Date].[Calendar].[Calendar Quarter].[Q3 CY 2006] on columns, [Measures].[Reseller Sales Amount] on rows From [Adventure Works]
خروجیها به صورت زیر میباشد :
و
مشخص میباشد که از علامت <:> برای ایجاد یک محدوده و جلوگیری از تولید کدهای بلند و طولانی استفاده میشود.
حال کوئری زیر را اجرا کنید:
Select [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006] : cousin( [Date].[Calendar].[Calendar Quarter].[Q1 CY 2006], [Date].[Calendar].[Calendar Semester].[H2 CY 2006] ) on columns, [Measures].[Reseller Sales Amount] on rows From [Adventure Works]
در این کوئری در ابتدا تابع پسر عمو اجرا می گردد، سپس تابع رنج اجرا می گردد و در نتیجه، فاصله ی بین Q1 CY 2006 تا Q3 CY 2006 را بدست میآورد.
نمودار درختی زیر توضیح کاملی به ما خواهد داد :
خروجی به صورت زیر میباشد
در قسمتهای بعدی دیگر توابع MDX Queryها را بررسی میکنیم.