- یک مورد دیگر را هم اضافه کنم. با SP نویسی شما برنامه خودتون رو به SQL Server گره میزنید. اما با استفاده از EF خالص به سادگی میتونید به بانکهای اطلاعاتی دیگری که پروایدر EF دارند سوئیچ کنید.
سلام،
نمیدونم اون نرم افزاری که این مشکل را داشته از چه بانک اطلاعاتی استفاده میکرده، چون من الان بر اساس گفتههای شما با SQL Server تست کردم و مشکلی در مرتب سازی نبود:
نتیجهی بررسی مرتب سازی
بنابراین بهتر است همه چیز تبدیل و همه چیز یک دست شود تا مشکلات ذکر شده را نداشته باشیم.
نمیدونم اون نرم افزاری که این مشکل را داشته از چه بانک اطلاعاتی استفاده میکرده، چون من الان بر اساس گفتههای شما با SQL Server تست کردم و مشکلی در مرتب سازی نبود:
نتیجهی بررسی مرتب سازی
بنابراین بهتر است همه چیز تبدیل و همه چیز یک دست شود تا مشکلات ذکر شده را نداشته باشیم.
مشکل از SQL Server نیست. مشکل از درایور صفحه کلید شما است که به نظر ایراد دارد. باید ورودی کدهای خودتون رو در تمام قسمتهایی که insert دارد بررسی کنید (قبل از ورود به دیتابیس این تصحیح باید انجام شود مانند استفاده از تابع SafeFarsiStr فوق).
بازخوردهای پروژهها
روش ایجاد فایل XML
با سلام و تشکر
لطفا اگر امکانش هست روشتون رو برای تولید خروجی XML از دیتابیس بیان کنید.
آیا از طریق Sql Server و فرمان For Xml اقدام کردید؟ اگر اینچنین است کدامیک از سه روش (Auto,Raw,Explicit) رو استفاده کرده اید؟
لطفا اگر امکانش هست روشتون رو برای تولید خروجی XML از دیتابیس بیان کنید.
آیا از طریق Sql Server و فرمان For Xml اقدام کردید؟ اگر اینچنین است کدامیک از سه روش (Auto,Raw,Explicit) رو استفاده کرده اید؟
نظرات نظرسنجیها
از چند مانیتور برای برنامه نویسی استفاده میکنید؟
- خطایابی بهتر (استفاده از پنجره output یا intermediate ویژوال استودیو)
- توسعه سریعتر (بخصوص برای طراحان وب)
- مقایسه پذیری بالاتر
- همزمانی استفاده (در یک زمان قصد کار برروی وهله از sql server داشته باشید)
مطالب
ظهور میکرو ORMs
پس از "معرفی Microsoft.Data.dll یا WebMatrix.Data.dll" که یک کتابخانهی سورس بسته و همچنین مخصوص وب ماتریکس میباشد، این ایده توسط سایر برنامه نویسها دنبال و تبدیل به ORMs جدیدی با کمتر از 400 سطر کد شده است که به Micro ORMs هم شهرت یافتهاند.
در اینجا شما هنوز هم کاملا با SQL سر و کار دارید اما با امکان استفاده بسیار سادهتر از پارامترها و همچنین بکارگیری قابلیتهای جدید dynamic معرفی شده در دات نت 4 . برای مثال:
Dapper
var guid = Guid.NewGuid();
var customer = connection.ExecuteMapperQuery<customer>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
Massive
var tbl = new Products();
var products = tbl.All(where: "CategoryID = @0 AND UnitPrice > @1", orderBy: "ProductName", limit: 20, args: 5,20);
Massive توسط آقای راب کانری که قبلا ORM دیگری را به نام ساب سونیک ایجاد کرده بود، تهیه شده و Dapper توسط تیم سایت StackOverflow جهت مواردی خاصی که استفاده از ORMs (از LINQ to SQL استفاده میکنند) هزینه زیادی داشته، مورد استفاده قرار میگیرد. در همان صفحه اصلی پروژه، یک سری آمار و ارقام از دید مقایسه کارآیی با سایر ORMs نیز ذکر شدهاند.
حتی اگر قصد استفاده از آنها را هم نداشته باشید مطالعه کد آنها از دیدگاه کاربردهای عملی قابلیتهای پویای زبان، بسیار آموزنده هستند.
هر از چندگاهی دوستان پیغام میگذارند که چگونه تاریخ وبلاگم را فارسی کنم یا یک قالب فارسی خوب را از کجا میشود تهیه کرد و امثال آن. تمام اینها را به صورت یک FAQ کوچک در اینجا قرار میدهم تا برای عموم علاقمندان قابل استفاده باشد.
پرسش | پاسخ |
برای ایجاد یک وبلاگ بلاگری از کجا شروع کنم؟ | با داشتن یک اکانت جی میل، به آدرس زیر مراجعه کرده و هر تعداد که مایل بودید میتوانید وبلاگ ایجاد نمائید: |
قالبهای پیش فرض گوگل چنگی به دل نمیزنند و بود و نبود آنها احساس نمیشود! چه باید کرد؟ | برای تهیه قالبهای فارسی به آدرس زیر مراجعه نمائید: |
تاریخ فارسی را چه کنم؟ | روش دوستان ، روش من |
برنامه نویسم! کدهای من یا نمایش داده نمیشود یا فرمت آنها هنگام ارسال به هم میریزد. چه باید کرد؟ | روش مورد علاقهی من ، روش مایکروسافت (+ و + و افزونهای برای اینکار) |
آخرین نظرات کاربران سایت را چگونه در ستون کناری سایت نمایش دهم؟ | یکی از ویجتهای پرکاربرد گوگل در بلاگر، ویجت فید است. هر بلاگ دارای دو فید مطالب و نظرات است. ویجت فید را اضافه کرده و سپس آدرس فید نظرات سایت خود را به آن معرفی کنید. همیشه آخرین 5 نظر ارسالی را نمایش میدهد. این ویجت کاربردهای قابل توجهی میتواند داشته باشد. |
آمار مراجعان به سایت را باید در کجا ملاحظه کرد؟ | جای پیش فرضی وجود ندارد! یک اکانت Analytics برای خود تهیه کرده و آنرا به سایت اضافه کنید. همچنین پس از آن یک اکانت فید برنر را نیز برای خود تهیه کنید. فیدبرنر اکنون جزیی از گوگل است و پس از معرفی آدرس فید سایت خود به آن، یک آدرس جدید به همراه آیکونی برای نمایش در سایت به شما میدهد که میتوانید تگهای آن تصویر را توسط ویجت html نمایش دهید. همچنین از همین طریق نیز میتوان اشتراک از طریق ایمیل را به وبلاگ اضافه کرد. |
کامنتهای سایت من در بیرون از سایت باز میشوند. چرا؟ | به این مطلب مراجعه نمائید: |
چگونه برای بلاگ خود قسمت ارسال نظرات را تهیه نمایم؟ | من از سرویس فرم ساز Zoho استفاده میکنم که در سال 2008 جزو برترینهای وب شناخته شده بود. بعد از ایجاد فرم خود و دریافت کد مربوطه، یک مطلب جدید را ارسال کنید و در بدنهی آن ، کدی را که Zoho به شما ارائه میدهد قرار دهید. سپس لینک این مطلب را توسط یک ویجت html به کنار سایت اضافه کنید تا همیشه در دسترس باشد. |
مطلبی را روز قبل نوشتم در مورد تعیین اعتبار یک کوئری. این مورد از آنجایی حائز اهمیت میشود که برای مثال تغییری در ساختار یکی از جداول حاصل شود. اکنون میخواهیم بررسی کنیم آیا سیستم از کار افتاده یا نه!؟
شما میتوانید نام یک فیلد را تغییر دهید (حتی اگر این فیلد در یک رویه ذخیره شده استفاده شده باشد) و هیچ خطایی هم نخواهید گرفت و این منشاء دردسرهای زیادی خواهد بود.
در حالت استفاده از SET NOEXEC ON ، کوئری مورد نظر فقط کامپایل میشود و همچنین از لحاظ نحوی بررسی خواهد شد، اما این کافی نیست.
مثال زیر را در نظر بگیرید:
Create PROCEDURE Test1
AS
SELECT * FROM tblPIDs1
این کوئری قابل اجرا است. دکمهی F5 را فشار دهید، بلافاصله رویه ذخیره شدهی Test1 برای شما ایجاد خواهد شد.
سپس کوئری زیر را اجرا کنید:
USE testdb
SET NOEXEC ON;
exec test1 ;
SET NOEXEC OFF;
Command(s) completed successfully
ایرادی هم وارد نیست چون فقط عملیات parsing و compile صورت گرفته و نه اجرای واقعی رویه ذخیره شده. اینجا از لحاظ دستوری مشکلی وجود ندارد.
در این نوع موارد میتوان از SET FMTONLY ON استفاده کرد. این مورد اجرای غیر واقعی یک کوئری را سبب میشود (تاثیری روی دیتابیس موجود نخواهد داشت، برای مثال اگر در رویه ذخیره شما عبارت insert وجود داشت، دیتایی insert نخواهد شد) و تنها متادیتای حاصل را بازگشت میدهد. مثلا نام ستونهای یک کوئری را و همچنین در این حین اگر خطایی رخ داده باشد، آنرا نیز ارائه خواهد داد.
USE testdb
SET FMTONLY ON;
exec test1 ;
SET FMTONLY OFF;
Msg 208, Level 16, State 1, Procedure test1, Line 3
Invalid object name 'tblPIDs1'.
USE testdb;
SET NOCOUNT ON;
DECLARE @name NVARCHAR(MAX),
@sql NVARCHAR(MAX),
@type CHAR(2), -- object type
@type_desc NVARCHAR(60), -- object type description
@params NVARCHAR(MAX) -- parameters
DECLARE @tblInvalid TABLE (
-- invalid objects
[type_desc] NVARCHAR(60),
[name] NVARCHAR(MAX),
[error_number] INT,
[error_message] NVARCHAR(MAX),
[type] CHAR(2)
);
DECLARE testSPs CURSOR FAST_FORWARD
FOR
SELECT [name] = OBJECT_NAME(SM.[object_id]),
[type] = SO.[type],
SO.[type_desc],
[params] = (
SELECT (
SELECT CONVERT(
XML,
(
SELECT STUFF(
(
SELECT ', ' + [name] +
'=NULL' AS
[text()]
FROM sys.parameters
WHERE [object_id] = SM.[object_id]
FOR XML PATH('')
),
1,
1,
''
)
)
)
FOR XML RAW,
TYPE
).value('/row[1]', 'varchar(max)')
)
FROM sys.sql_modules SM
JOIN sys.objects SO
ON SO.[object_id] = SM.[object_id]
WHERE SO.[is_ms_shipped] = 0
AND SO.[type] = 'P'
OPEN testSPs
FETCH NEXT FROM testSPs INTO @name, @type, @type_desc, @params
WHILE (@@FETCH_STATUS = 0)
BEGIN
BEGIN TRY
SET @sql = 'SET FMTONLY ON; exec ' + @name + ' ' + @params +
'; SET FMTONLY OFF;'
--PRINT @sql;
EXEC (@sql) ;
END TRY
BEGIN CATCH
PRINT @type_desc + ', ' + @name + ', Error: ' + CAST(ERROR_NUMBER() AS VARCHAR)
+ ', ' + ERROR_MESSAGE();
INSERT INTO @tblInvalid
SELECT @type_desc,
@name,
ERROR_NUMBER(),
ERROR_MESSAGE(),
@type
;
END CATCH
FETCH NEXT FROM testSPs INTO @name, @type, @type_desc, @params
END
CLOSE testSPs
DEALLOCATE testSPs
SELECT [type_desc],
[name],
[error_number],
[error_message]
FROM @tblInvalid
ORDER BY
CHARINDEX([type], ' U V PK UQ F TR FN TF P SQ '),
[name];
توضیحات:
این کوئری، در دیتابیس جاری که در قسمت use dbname مشخص میشود، تمامی رویههای ذخیره شده را به صورت خودکار پیدا میکند. سپس لیست آرگومانهای آنها را نیز یافته و عبارت exec مربوطه را تشکیل میدهد. سپس با استفاده از SET FMTONLY ON سعی در شبیه سازی اجرای تک تک رویههای ذخیره شده میکند. اگر خطایی در این بین رخ داد، آنها را در یک جدول موقتی ذخیره کرده و در آخر نتیجه را نمایش میدهد.
ارزش این کوئری زمانی مشخص میشود که تعداد زیادی رویه ذخیره شده داشته باشید اما نمیدانید کدامیک از آنها بر اساس آخرین تغییرات صورت گرفته، هنوز معتبر هستند یا نه. آیا به قول معروف، سیستم اومد پایین یا خیر!؟
نکته:
قسمتی که از XML استفاده شده جهت concatenating نتیجه حاصل از کوئری، مورد استفاده قرار گرفته و این روزها بحث رایجی است که در بسیاری از سایتها در مورد آن میتوان مطالب مفیدی را یافت. راه دیگر انجام آن استفاده از COALESCE میباشد.
مآخذ:
Check Validity of SQL Server Stored Procedures
Which of your Stored Procedures are no longer Valid
SET FMTONLY ON
راهنمای رایگان زیر نحوه نصب ویندوز سرور 2003 تا اس کیوال سرور 2005 ، تنظیمات IIS و نصب SharePoint و ابزارهای لازم برای برنامه نویسی آنرا در یک ماشین مجازی (اینبار در VMware) به صورت مصور و قدم به قدم توضیح داده است.
فهرست مطالب آن:
- Introduction
- Enabling 64-bit Guest OS Support on your Motherboard (if required)
- Creating the Virtual Machine
- Editing the Virtual Machine Settings
- Building Windows
- Configuring Windows
- Patch and Backup
- Domain Promotion and Configuration
- Moss Domain Accounts Creation
- Pop 3 Email Service Configuration
- Moss 2007 Base Installation
- SQL Server 2005 64-bit Enterprise Installation and Configuration
- Create MossSetup login
- Patch and Backup
- Office Enterprise 2007 Installation and Configuration
- SharePoint Designer 2007 Installation
- Visual Studio 2005 Team Developer Edition Installation
- Development Tools Installation
- Force IIS to use 64 bit mode and disable 32 bit mode
- Complete Moss 2007 Installation
- MOSS 2007 Basic Configuration Guide
- Check Search Services and Event Log
- Backup
Download
یا برای مثال این روند از اکسچنج سرور 2007 شروع شد (میل سرور مایکروسافت). نسخه سازمانی این محصول فقط 64 بیتی است.
بازخوردهای دوره
تزریق خودکار وابستگیها در برنامههای ASP.NET Web forms
تقریبا!
حال گاهی من از کنترل اصلی AccordionPane ارث برده و کنترل هایی را ایجاد میکنم که به صورت خودکار از سرویسهای امنیتی استفاده کرده و آیتمهای لازم (که کاربر جاری به آنها دسترسی دارد) را اضافه میکنم.
من یک کنترل آکاردیون دارم که دارای ساختاری شبه زیر است:
<Common:HomeAccordion runat="server"> <Common:HomeAccordionPane runat="server" HeaderText="Pane #1"> <Common:HomeAccordionItem runat="server" Text="Item #1"/> <Common:HomeAccordionItem runat="server" Text="Item #1"/> </Common:HomeAccordionPane> <Common:HomeAccordionPane runat="server" HeaderText="Pane #2"> <Common:HomeAccordionItem runat="server" Text="Item #1"/> <Common:HomeAccordionItem runat="server" Text="Item #1"/> </Common:HomeAccordionPane> </Common:HomeAccordion>
<Common:HomeAccordion runat="server"> <DF:HomeAccordionPaneBasic runat="server" /> <DF:HomeAccordionPaneSystem runat="server" /> <DF:HomeAccordionPaneMyAccount runat="server" /> </Common:HomeAccordion>
گویا این اقلام (که معمولا میتوانند کنترل هم نباشند - چون توسط والد رندر میشوند) جزو درخت صفحه نیستند - استفاده از ParseChildren در کنترل والد اجازه افزودن مجموعه کنترل هایی را میدهد)