PDA

View Full Version : بررسی روش من و ارائه روش های شما برای چک کردن تکرار بودن یک رکورد هنگام درج



behzadkhan
سه شنبه 06 مرداد 1394, 10:45 صبح
سلام

به تمامی کاربران برنامه نویس

این دومین پروژه من هست که از Stored Procedere استفاده می کنم.

من یک جدول به شکل زیر دارم



ID
etName
etDescription


1
قراردادی



2
روزمزد



3




4





اکنون می خواهم در این جدول عمل درج را انجام دهم و شرط تکراری نبودن این هست که etName رکورد جدید برابر هیچ کدام از etName های رکوردهایی که قبلی نباشد.

من برای این کار SP خود را به شکل زیر نوشته ام:


create proc Insert_EmploymentType
(
@Name nvarchar(100),
@Description nvarchar(500)
)
AS
BEGIN
DECLARE @ReturnValue int
SET @ReturnValue = 0

IF(EXISTS(SELECT TOP 1 ID FROM tbl_EmploymentType WHERE etName = @Name))
BEGIN
SET @ReturnValue = 1
END
ELSE
BEGIN
INSERT INTO tbl_EmploymentType
(etName, etDescription)
VALUES
(@Name, @Description)
END

return @ReturnValue
END


من در زبان سی شارپ با استفاده از @ReturnValue متوجه تکراری بودن رکورد می شوم.

================================================== =====

اکنون می خواهم بدانم که

ابتدا ایراد روش من در چه چیزی است.

و

سپس روش های خود برای این کار را ارائه دهید.

با تشکر

tooraj_azizi_1035
سه شنبه 06 مرداد 1394, 12:34 عصر
سلام
يك Unique index nonclustered روي
etName بگذاريد و در برنامه SqlException ناشي از درج ركورد تكراري رو هندل كنيد همين.

behzadkhan
سه شنبه 06 مرداد 1394, 13:41 عصر
سلام
يك Unique index nonclustered روي
etName بگذاريد و در برنامه SqlException ناشي از درج ركورد تكراري رو هندل كنيد همين.


با سلام

دوست عزیز

من فقط می دانم که نوع داده UNIQUE یک از انواع داده های اس کیو ال سورور هست و می دانم که هر جدول یک ایندکس بصورت اتوماتیک دارد و nonclustered یعنی اینکه با توجه به ستون انتخاب شده رکوردها بصورت فیزیکی مرتب نمی شوند.

اما

نمی دانم چه جوری UNIQUE INDEX NONCLISTERED را روی ستون etName قرار دهم.

همچنین

منظور شما از SqlExeption یعنی اینکه من در SP خود یک TRY CATCH بزارم و هر وقتی خطای تکراربودن اتفاق افتاد اونو هندل کنم و به سی شارپ برگردونم.

با تشکر

tooraj_azizi_1035
سه شنبه 06 مرداد 1394, 14:08 عصر
UNIQUE يك Constraint است نه نوع داده اي. (احتمالاً منظورتون uniqueidentifer است).


می دانم که هر جدول یک ایندکس بصورت اتوماتیک دارد

درست نيست مگر اينكه خودتون ايجاد كنيد يا يك PK روي جدول قرار بدين تا خودش Index رو بسازه.



نمی دانم چه جوری UNIQUE INDEX NONCLISTERED را روی ستون etName قرار دهم.

اينطوري:

CREATE UNIQUE NONCLUSTERED INDEX [IX_DupIndex_FirstName]
ON [dbo].[DupIndex]
(
[FirstName] ASC
) ON [PRIMARY]





منظور شما از SqlExeption یعنی اینکه من در SP خود یک TRY CATCH بزارم و هر وقتی خطای تکراربودن اتفاق افتاد اونو هندل کنم و به سی شارپ برگردونم.

بله.

behzadkhan
سه شنبه 06 مرداد 1394, 16:40 عصر
با سلام

دوست عزیز

ایندکس برای ستون را به شکل زیر انجام دادم:


CREATE UNIQUE NONCLUSTERED INDEX [IX_DupIndex_FirstName]
ON [dbo].[tbl_EmploymentType]
(
[etName] ASC
)
ON [PRIMARY]

من SP را به شکل زیر تغییر دادم:

ALTER proc [dbo].[Insert_tblEmploymentType]
(
@Name nvarchar(100),
@Description nvarchar(500)
)
AS
BEGIN
DECLARE @ReturnValue int
SET @ReturnValue = 0

BEGIN TRY
INSERT INTO tbl_EmploymentType
(etName, etDescription)
VALUES
(@Name, @Description)
END TRY
BEGIN CATCH
SET @ReturnValue = 1
END CATCH

return @ReturnValue
END


من SP را تست کردم و به درستی کار کرد.

اینم کد جدولم:


CREATE TABLE [dbo].[tbl_EmploymentType](
[ID] [int] IDENTITY(1,1) NOT NULL,
[etName] [nvarchar](100) NOT NULL,
[etDescription] [nvarchar](500) NULL,
CONSTRAINT [PK_tbl_EmploymentType] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


================================================== =======================

چندتا سوال داشتم:

1. اون کدی که ستون مورد نظر را ایندکس کرده توضیح دهید
- هم نحوه ایجاد را.
- هم اینکه از نظر تئوری بگید که در پایگاه داده ها چه کاری روی اون ستون انجام میدهد که امکان تکراری بودن را از بین می برد

2. آیا این روش برای جدول هایی که تعداد رکوردهایی کمی دارند کاربرد دارد یا برای رکوردهای با تعداد بالا هم از نظر Performance کاربرد دارد.


================================================== =====

با تشکر

tooraj_azizi_1035
چهارشنبه 07 مرداد 1394, 09:05 صبح
1- يك ايندكس از نوع NonClustered روي ستون مورد نظر ايجاد كرده و به شكل صعوي مرتب مي كند.
2- با استفاده از قيد Unique از تكرار جلوگيري مي شود.
3- تفاوتي نمي كند. SQL Server در كل از ايندكس ها به دو منظور استفاده مي كند: 1- جستجوي بسيار سريع 2- تضمين يونيك بودن مقادير در صورتي كه شما بخواهيد كه در مورد Unique Constraint هم يونيك بودن از طريق ايندكس كنترل مي شود.
در مورد Performance هم بايد ايندكس به خوبي نگهداري شود تا كارائي خود را حفظ كند.

behzadkhan
چهارشنبه 07 مرداد 1394, 10:17 صبح
با سلام

دوست عزیز

من اکنون این امکان را به SP خود اضافه کردم تا بتواند شناسه رکورد درج شده را از طریق یک پارامتر OUTPUT به سی شارپ برگرداند.


ALTER proc [dbo].[Insert_tblEmploymentType]
(
@Name nvarchar(100),
@Description nvarchar(500),
@NewRecordID int OUTPUT
)
AS
BEGIN
DECLARE @ReturnValue int
SET @ReturnValue = 0

BEGIN TRY
INSERT INTO tbl_EmploymentType
(etName, etDescription)
VALUES
(@Name, @Description)
SET @NewRecordID = SCOPE_IDENTITY()
END TRY
BEGIN CATCH
SET @ReturnValue = 1
END CATCH

return @ReturnValue
END


لطفا بررسی کنید ببینید که روش من درست هست.

همچنین اگر برنامه تحت شبکه باشد و در یک لحظه این امکان وجود دارد که چند رکورد بصورت همزمان به جدول های مختلف اضافه شود آیا

SCOPE_IDENTITY() دقیقا شناسه رکورد اضافه شده توسط همان SPای که آن را فراخوانی کرده برمی گرداند و یا احتمال داره که شناسه یک رکورد که در یک جدول دیگر به درخواست یک کاربر دیگر اضافه شده را بر گرداند.

از راهنمایی هایتان سپاس گذارم.

با تشکر

tooraj_azizi_1035
چهارشنبه 07 مرداد 1394, 10:33 صبح
SCOPE_IDENTITY همان شناسه ای که در Scope فعلی درج شده را بر می گرداند و نگرانی در مورد همزمانی هم نداشته باشید چون در لحظه فقط یک Insert امکان اجرا دارد.
SQL Server با استفاده از Latch درج همزمان در یک Page را مدیریت می کند هر ْ Thread که قرار است درجی انجام دهد ابتدا یک Latch از نوع Exclusive بدست آورد و این نوع Latch را فقط یک Thread در لحظه می تواند بدست آورد.
الیته اگر تعداد درج های همزمان که مقادیر به شکل IDENTITY درج می شوندْ زیاد شود مشکلی به نام Latch Contention بوجود می آید چون تمام Thread ها سعی در بدست آوردن Latch از نوع Exclusive در سمت راست ترین نود (یا Page ) درخت دارند که باعث بوجود آمدن صف بلندی از درخواست Latch می شود. برای رفع این مشکل هم روش هایی وجود دارد که در صورتی که بخواهید در فرصتی مناسب بررسی می کنیم.

behzadkhan
چهارشنبه 07 مرداد 1394, 10:41 صبح
با سلام

دوست عزیز

در مورد Latchها اطلاعاتی ندارم.

حتما در دیگر تاپیک ها آن ها را مورد بررسی قرار می دهیم.

========================================

من از شما می خواهم که در صورت امکان بگویید که اگر شما می خواستید این SP ار بنویسید چگونه آنرا می نوشتید.

در صورت امکان کدش را هم برای استفاده ما قرار دهید.

با تشکر

tooraj_azizi_1035
چهارشنبه 07 مرداد 1394, 12:11 عصر
همون كد شما و مي نوشتم. مشكلي نداره.

3246879av_3sg
جمعه 16 مرداد 1394, 01:33 صبح
سلام
به نظر من اگه توی سی شارپ یه سلکت ساده بزنی و بعد چک کنی و پیغام خطا را با توجه به اون بنویسی بهتر از اینه که سمت SQL اینکارو انجام بدی
اینطوری دستت بازتره
چون ممکنه یه زمانی وقتی که میخوایی یکی از رکورد هارو با یه کد حذف کنی (حذف منطقی) دوباره میتونی با همون اسم یه رکورد جدید داشته باشی
کلا محدود کردن یه ستون رو از طریق SQL توصیه نمی کنم(برای توسعه های احتمالی آینده )(نظر شخصی)

behzadkhan
جمعه 16 مرداد 1394, 12:15 عصر
سلام
به نظر من اگه توی سی شارپ یه سلکت ساده بزنی و بعد چک کنی و پیغام خطا را با توجه به اون بنویسی بهتر از اینه که سمت SQL اینکارو انجام بدی
اینطوری دستت بازتره
چون ممکنه یه زمانی وقتی که میخوایی یکی از رکورد هارو با یه کد حذف کنی (حذف منطقی) دوباره میتونی با همون اسم یه رکورد جدید داشته باشی
کلا محدود کردن یه ستون رو از طریق SQL توصیه نمی کنم(برای توسعه های احتمالی آینده )(نظر شخصی)

با سلام

دوست عزیز

با این موضوع که این کار را در سمت سی شارپ انجام دهم مزیت های خودش را دارد موافق هستم.

اما با اینکه نوشتن کوئری سمت سی شارپ بهتر می باشد به شخصه موافق نیستم.

حتما شما یک شرایطی و مواری برایتان پیش آمده که می گویید که سمت سی شارپ سلکت بزنم بهتر هست.

ما خوشحال می شویم که بیشتر توضیح بدهید تا ما هم متوجه بشویم.

دلیل های شما اگر مرا قانع نکند حداقل به دانش من که می افزاید.

بی صبرانه منتظر توضیحات تکمیلی شما هستیم.

================================================== ============



چون ممکنه یه زمانی وقتی که میخوایی یکی از رکورد هارو با یه کد حذف کنی (حذف منطقی) دوباره میتونی با همون اسم یه رکورد جدید داشته باشی
کلا محدود کردن یه ستون رو از طریق SQL توصیه نمی کنم(برای توسعه های احتمالی آینده )(نظر شخصی)


این مورد را متوجه نشدم.

لطفا بیشتر توضیح دهید.

================================================== ========================

من از زمانی که کوئری های خودم را سمت اس کیو ال سرور می نویسم به این مزایا برخورد کردم.

- می توانم نتیجه چند کوئری را با استفاده از یک SqlCommand بدست بیاورم. اما اگر سمت سی شارپ باشد باید چند بار از این دستور استفاده کنم.

- کوئری های من کاملا مجزا از سی شارپ می شود و این کار مدیریتش را برای من راحتر می کند

- اگر به خطایی برخورد کنم با سرعت بیشتری خطا را پیدا و نسبت به رفع آن اقدا می کنم.

- اگر به یک خطا برخورد کنم و نیاز تغییر کوئری باشد نیاز نیست در حین کد نویسی به اجرای برنامه خاتمه بدهم و بعد کوئری را تغییر و سپس برنامه را اجرا و تست کنم.
بلکه در همان حین اجرا به سراغ Managemnt Studio اس کیو ال می روم و کد ها را تغییر میدهم.
البته این مورد را هم اگر کوئری ها سمت سی شارپ باشد می توان انجام داد ولی نه به این سادگی.

- من به مانند سی شارپ می توانم برنامه نویسی کنم. متغییر تعریف کنم. حلقه تکرار درست کنم و تمام کارهایی که با یک زبان می توان انجام داد. ولی اگر سمت سی شارپ باشد کار دشوار هست.

- سرعت کوئری از سمت سی شارپ بالاتر می رود.

و ...

مزایای دیگری هم دارد که من یا نمی دانم و یا نمی توانم توصیفشان کنم.

البته تمام موارد بالا از دید من بود شاید هم اشتباه کرده باشم.

================================================== ==========================

از دوست عزیز tooraj_azizi_1035 (http://barnamenevis.org/member.php?41757-tooraj_azizi_1035)

هم می خواهم تا مزایای و معایب این روش را بیان کنند.

================================================== ==========================

با تشکر

ناامید
جمعه 16 مرداد 1394, 19:22 عصر
سلام

به تمامی کاربران برنامه نویس

این دومین پروژه من هست که از Stored Procedere استفاده می کنم.

من یک جدول به شکل زیر دارم



ID
etName
etDescription


1
قراردادی



2
روزمزد



3




4





اکنون می خواهم در این جدول عمل درج را انجام دهم و شرط تکراری نبودن این هست که etName رکورد جدید برابر هیچ کدام از etName های رکوردهایی که قبلی نباشد.

من برای این کار SP خود را به شکل زیر نوشته ام:


create proc Insert_EmploymentType
(
@Name nvarchar(100),
@Description nvarchar(500)
)
AS
BEGIN
DECLARE @ReturnValue int
SET @ReturnValue = 0

IF(EXISTS(SELECT TOP 1 ID FROM tbl_EmploymentType WHERE etName = @Name))
BEGIN
SET @ReturnValue = 1
END
ELSE
BEGIN
INSERT INTO tbl_EmploymentType
(etName, etDescription)
VALUES
(@Name, @Description)
END

return @ReturnValue
END


من در زبان سی شارپ با استفاده از @ReturnValue متوجه تکراری بودن رکورد می شوم.

================================================== =====

اکنون می خواهم بدانم که

ابتدا ایراد روش من در چه چیزی است.

و

سپس روش های خود برای این کار را ارائه دهید.

با تشکر

سلام.
روشتون خوب و قابل فهمه یک ایندکس بر روی فیلد etName بزارید تا سرعت جستجو بسیار بالا بره.

behzadkhan
جمعه 16 مرداد 1394, 21:04 عصر
سلام.
روشتون خوب و قابل فهمه یک ایندکس بر روی فیلد etName بزارید تا سرعت جستجو بسیار بالا بره.

با سلام

دوست خوبمان ناامید (http://barnamenevis.org/member.php?364761-%D9%86%D8%A7%D8%A7%D9%85%DB%8C%D8%AF)

این کار روی فیلد مورد نظر انجام شده بود.

در واقع tooraj_azizi_1035 (http://barnamenevis.org/member.php?41757-tooraj_azizi_1035) این نکته را قبلا گفته بودند.

بابت بررسی تان سپاسگذارم.

=================================================

لطفا اگر از روش دیگری استفاده می کنید آن روش را در این تاپیک توضیح دهید.

همچنین

اگر این روش مزیت دیگری دارد و یا معایبی دارد خوشحال می شویم که آنها را به ما گوشزد نمایید.

================================================

با تشکر

tooraj_azizi_1035
شنبه 17 مرداد 1394, 10:35 صبح
این بحث داره به سمت مزایای استفاده از SP پیش می ره که می تونید در اینجا تمام این مزایا روی ببینید:
https://technet.microsoft.com/en-us/library/aa214299%28v=sql.80%29.aspx

3246879av_3sg
شنبه 17 مرداد 1394, 16:16 عصر
این مورد را متوجه نشدم.

لطفا بیشتر توضیح دهید.


سلام
در این مورد اگه بخوام بیشتر توضیح بدم باید به این مورد اشاره کنم که هیچ وقت با قطعیت نمیشه از فیلد هایی که توی یه دیتابیس در نظر گرفته ایم اطمینان صد در صد داشت.
ببینید من تقریبا 1 سال پیش شروع کردم به نوشتن یه برنامه ای
در ابتدا نزدیک 2 ماه وقت صرف کردیم که فیلد های مورد نیازمون رو توی دیتابیس در نظر بگیریم . (این کار رو با کارفرما انجام دادم)
الان بعد از گذشت چند ماه از روند ساخت برنامه تازه به این نتیجه میرسیم که باید ماهیت ، نوع و خصوصیات یک فیلد را تغییر بدیم.(بنا به اقتضای شرایط و زمان)
درست مثل مورد شما که در مورد یک فیلد خاص تصمیم میگیرید که آیا می توان مقدار های تکراری را درج نمود و یا خیر
هیچ فرقی نمیکنه که شما از طریق سی شارپ این محدودیت رو اعمال کنید یا از طریق SQL
مزایای روش انتخابی من اینه که شما میتونید از طریق آپدیت دوره ای نرم افزارتون ، شرایط مرتبط به یکسری محدودیت های خاص ( مانند عدم ورود مقادیر تکراری) رو تغییر بدید. بدون اینکه به دیتابیس مشتریتون دسترسی داشته باشید و تغییراتتون رو روی دیتابیس هر مشتری بصورت تک به تک اعمال کنید.
بعنوان نتیجه گیری به این مورد اشاره کنم هرچقد شما محدودیت کمتری برای فیلد های دیتابیستون اعمال کنید دستتون برای ورود هر نوع داده ای که احتمالا در آینده ازش خبر ندارید بازتره

البته تمامی این موارد و روش های مختلف ارتباط بستگی به نوع پشتیبانی از نرم افزارتون داره
توی روش پشتیبانی ما آپدیت برای دیتابیس نیست بلکه application بصورت دوره ای و بنا به نیاز تغییر یافته و جهت دریافت توسط مشتریان برروی اینترنت قرار داده میشود .
فکر میکنم این همون کاریه که بیشتر شرکت های بزرگ و کوچک انجام میدن.

behzadkhan
شنبه 17 مرداد 1394, 16:41 عصر
سلام
در این مورد اگه بخوام بیشتر توضیح بدم باید به این مورد اشاره کنم که هیچ وقت با قطعیت نمیشه از فیلد هایی که توی یه دیتابیس در نظر گرفته ایم اطمینان صد در صد داشت.
ببینید من تقریبا 1 سال پیش شروع کردم به نوشتن یه برنامه ای
در ابتدا نزدیک 2 ماه وقت صرف کردیم که فیلد های مورد نیازمون رو توی دیتابیس در نظر بگیریم . (این کار رو با کارفرما انجام دادم)
الان بعد از گذشت چند ماه از روند ساخت برنامه تازه به این نتیجه میرسیم که باید ماهیت ، نوع و خصوصیات یک فیلد را تغییر بدیم.(بنا به اقتضای شرایط و زمان)
درست مثل مورد شما که در مورد یک فیلد خاص تصمیم میگیرید که آیا می توان مقدار های تکراری را درج نمود و یا خیر
هیچ فرقی نمیکنه که شما از طریق سی شارپ این محدودیت رو اعمال کنید یا از طریق SQL
مزایای روش انتخابی من اینه که شما میتونید از طریق آپدیت دوره ای نرم افزارتون ، شرایط مرتبط به یکسری محدودیت های خاص ( مانند عدم ورود مقادیر تکراری) رو تغییر بدید. بدون اینکه به دیتابیس مشتریتون دسترسی داشته باشید و تغییراتتون رو روی دیتابیس هر مشتری بصورت تک به تک اعمال کنید.
بعنوان نتیجه گیری به این مورد اشاره کنم هرچقد شما محدودیت کمتری برای فیلد های دیتابیستون اعمال کنید دستتون برای ورود هر نوع داده ای که احتمالا در آینده ازش خبر ندارید بازتره

البته تمامی این موارد و روش های مختلف ارتباط بستگی به نوع پشتیبانی از نرم افزارتون داره
توی روش پشتیبانی ما آپدیت برای دیتابیس نیست بلکه application بصورت دوره ای و بنا به نیاز تغییر یافته و جهت دریافت توسط مشتریان برروی اینترنت قرار داده میشود .
فکر میکنم این همون کاریه که بیشتر شرکت های بزرگ و کوچک انجام میدن.

با سلام

دوست عزیز

من تقریبا منظور شما را متوجه شدم.

شما در واقع دارید راجه به یک اصول کلی که برای ساخت یک را بیان می کنید.

این گفته شما خیلی جالب هست:
"هرچقد شما محدودیت کمتری برای فیلد های دیتابیستون اعمال کنید دستتون برای ورود هر نوع داده ای که احتمالا در آینده ازش خبر ندارید بازتره"

و من سعی می کنم که از آن استفاده کنم.

اعمال محدودیت ها را همانطور که گفتید البته از منظر شما اگر سمت سی شارپ باشد بهتر هست.

ولی من بصورت کامل موافق نیستم.

خوب شما دارید می گید که فردا اگر یک داستانی پیش آمد و ما من مجبور به تغییر محدودیت ها باشم چون محدودیت ها را سمت پایگاه داده تعریف کردم کارم سختر می شود

ولی

اگر محدودیت ها سمت سی شارپ باشد تغییر دادنشان راحتر هست.

یک جورهایی شما درست می گید چون ما راحتر می توانیم آپدیت نرم افزار را به دست مشتری برسانیم تا اینکه بخواهیم آپدیت پایگاه داده را به دستش برسانیم.

================================================== ================================================== =================

من از شما درخواست دارم که بیشتر در مورد این مورد توضیح بدهید چون حالا رد کردنش برای من سخت هست.

همچنین اگر دلایل غیر از این هم دارید عنوان کنید.

================================================== ================================================== ===

****از کاربران دیگر هم خواهشمند هستیم تا وارد موضوع بشوند****

================================================== ================================================== ==

با تشکر

3246879av_3sg
شنبه 17 مرداد 1394, 23:12 عصر
شما در واقع دارید راجه به یک اصول کلی که برای ساخت یک را بیان می کنید.



اعمال محدودیت ها را همانطور که گفتید البته از منظر شما اگر سمت سی شارپ باشد بهتر هست.

ولی من بصورت کامل موافق نیستم.

خوب شما دارید می گید که فردا اگر یک داستانی پیش آمد و ما من مجبور به تغییر محدودیت ها باشم چون محدودیت ها را سمت پایگاه داده تعریف کردم کارم سختر می شود

ولی

اگر محدودیت ها سمت سی شارپ باشد تغییر دادنشان راحتر هست.

درسته که راحتی و راحت طلبی برنامه نویس برای توسعه نرم افزار مهم و ناگزیره ولی نباید کارایی نرم افزار رو تحت تاثیر قرار بده



البته این یه اصول نیست
یعنی اصل این نیست که حتما از این روش باید استفاده کرد !
همانطور که قبلا هم اشاره کردم از نظر من نحوه پشتیبانی می تونه تعیین کنه که به چه شکلی نرم افزار رو پیاده سازی کنیم. نه تنها در مورد روش های ارتباط با پایگاه داده بلکه در تمامی مراحل ساخت برنامه
به طور مثال من توی ساخت نرم افزارام همیشه سعی می کنم که Error Reporting رو ثبت و نگه داری کنم
هر خطایی که در قالب Exception دریافت می کنم حتی جزئی ترین و بی خود ترین هاشونم رو تو دیتابیس ثبت و دسته بندی میکنم تا در مورد پشتیبانی و ساخت user interface برنامم در آینده در نظر بگیرم.
مثلا من یه بار چند سال پیش اینکارو کردم (البته نه تو سی شارپ و sql server ) توی sqlite ، بعد یه مدت که نشستم و بصورت کاملا اجمالی داشتم خطاهایی که کاربر برنامم توی یه ماه استفاده از برنامه بهش برخورده بود و چک میکردم به این نتیجه رسیدم که موقع ثبت داده های یه جدول خاص ، تقریبا تو هر بار که کاربر کلید ذخیره رو برای ثبت داده ها زده بود یه پیغام خطایی مبنی بر اینکه باید تیک فلان چک باکس رو بزنی بعد بیایی داده ها رو ذخیره کنی به کرار دیده می شد .
خیلی راحت به این نکته پی بردم که محل قرارگیری اون چک باکس توی صفحه جای خوبی نبوده یا اینکه اصلا نباید از اون چک باکس استفاده می کردم ( که بخوام کاربرم رو مجبور کنم تا یه مورد خاص رو مشخص کنه )
حالا این مورد خیلی جزئی و یه ایراد ساده بود . با بررسی دقیق تر به خیلی از ایرادات برنامم پی بردم : چه در مورد منطق نرم افزار ، چه در مورد طراحی ظاهری ، چه روش برقراری ارتباط با پایگاه داده و چه در مورد خطاها و مشکلات معمول که احتمالا برای هر نرم افزار دیگه ای رخ بده
پس شروع کردم به بررسی و تغییر یه سری چیزا تو برنامم
می دونید نتیجه کار خیلی جالب شد .
زمانی که بازخورد نرم افزار رو بعد از یک ماه استفاده برای بار دوم بررسی میکردم کاملا نظر تیم پشتیبانی مثبت بود که حتی یک کاربر اعلام مشکل نکرده
حتی زمانی که جدول Exception ها رو چک کردم فقط و فقط 14تا خطا اونم تلاش برای ثبت یک فیلد تکراری توی دیتابیس گزارش و ثبت شده بود .
البته مقصود من از اشاره به این تجربه صرفا بیان این نکته بود که نوع و نحوه پشتیبانی از نرم افزار های بزرگ و فراگیر میتونه تعیین کنننده روش ساخت برنامه باشه .
ولی می شه اینطور تصور کرد که بهتره شرایط و محدودیت های خاص در مورد ورود اطلاعات به دیتابیس رو ( ببشتر در مورد insert ) از طریق سی شارپ پیاده سازی کرد.

با تشکر

احسان یغموری