ورود

View Full Version : سوال: اختصاص شماره خودکار به کاربر



minajasmi
شنبه 21 آبان 1390, 13:21 عصر
سلام دوستان.
من میخام به هر کابر هنگام ثبت نام یه شماره داده بشه که در قسمت مدیریت از این شماره برای شماره پرونده کاربر استفاده میشود. حالا سوالم اینه که این شماره را چطور بدم.
خودم فکرکردم هنگام ثبت نام کاربر تعداد رکوردهای جدول بشمارم یه شماره بهش اضافه کنم وبه کابر بدم ولی اگه در قسمت مدیریت یه کابر از جدول حذف بشه شماره ها تغییر میکنه.
از دوستان میخام یه راه حل بهم بدن .مرسی

aspismylove
شنبه 21 آبان 1390, 13:24 عصر
سلام دوستان.
من میخام به هر کابر هنگام ثبت نام یه شماره داده بشه که در قسمت مدیریت از این شماره برای شماره پرونده کاربر استفاده میشود. حالا سوالم اینه که این شماره را چطور بدم.
خودم فکرکردم هنگام ثبت نام کاربر تعداد رکوردهای جدول بشمارم یه شماره بهش اضافه کنم وبه کابر بدم ولی اگه در قسمت مدیریت یه کابر از جدول حذف بشه شماره ها تغییر میکنه.
از دوستان میخام یه راه حل بهم بدن .مرسی

در هنگام ثبت نام آی دی کاربر یا ... رو بصورت اتوماتیک تعریف کن ..
که این هم اختصاصی هست و هم وقتی کسی حذفشذ مشکلی پیش نمیاد

mohsen_kh1364
شنبه 21 آبان 1390, 15:26 عصر
هم روش بالا جواب میده، و هم می تونی به جای شمردن، ماکزیمم شماره هایی که تا حالا دادی رو به علاوه یک کنی و به کاربر جدید بدی.
البته می دونی که، این روش و روش خودت می تونه مشکل همزمانی رو بوجود بیاره. یعنی دو تا کاربر همزمان بخوان ثبت نام کنن، همزمان ماکزیمم گیری انجام می شه (یعنی وقتی هنوز هیچ کدومشون توی دیتابیس اضافه نشدن) و به هر جفتشون یک شماره ی واحد داده می شه. بنابراین، هرچه بیشتر سعی کنی این جور کار ها رو بندازی گردن خود sql server ، بهتره. چون اون خودش همزمانی رو پشتیبانی می کنه.
البته برای مشکل این روش می تونی ستون مربوط به این شماره رو در دیتابیس به حالت unique در بیاری که اگه خواست داده ی تکراری ثبت کنه، نتونه و ارور بده و تو از ارور داده شده استفاده کنی و مجددا ماکزیمم گیری و ...

minajasmi
شنبه 21 آبان 1390, 17:16 عصر
وقتی فیلد جدول از نوعuniqueidentifier میزارم چه نوع داده ای را میتونم داخلش دخیره کنم.شماره رکورد ها رو که بدست میارم میخام ثبت کنم خطا میگیره. نوع داده هام چی باشه. در ضمن این همزمانی که گقتید خیلی واسم مهمه تازه کارم هستم راهنماییم کنید لطفا از چه روشی استفاده کنم بهتره؟

raziee
شنبه 21 آبان 1390, 17:48 عصر
وقتی فیلد جدول از نوعuniqueidentifier میزارم چه نوع داده ای را میتونم داخلش دخیره کنم.شماره رکورد ها رو که بدست میارم میخام ثبت کنم خطا میگیره. نوع داده هام چی باشه. در ضمن این همزمانی که گقتید خیلی واسم مهمه تازه کارم هستم راهنماییم کنید لطفا از چه روشی استفاده کنم بهتره؟
میتونید از کد زیر استفاده کنید.(اگه میخواهید مقدار رو توسط برنامه بهش بدید)
string uniqueidentifier = Guid.NewGuid().ToString();
اما قبلش بررسی کنید که رکوردی با این ID ثبت نشده باشه!!
اما بهتر هست که این مقدار توسط SQL SERVER داده بشه.
برای اینکار مقدار پیش فرض ستون مورد نظر رو تغییر بدید به newid().
به عنوان مثال:
CREATE TABLE [dbo].[Users](
[UserId] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Users_UserId] DEFAULT (newid()),
[UserName] [nvarchar](50) NOT NULL,
[DisplayName] [nvarchar](50) NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [IX_Users] UNIQUE NONCLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

همونطور که میبینید من UserName هم به صورت یکتا در نظر گرفتم.
-------
اما بهتره UserId از نوع int و به صورت Identity باشه و از این داده برای ارتباط با جداول دیگه استغاده کنید.

minajasmi
شنبه 21 آبان 1390, 18:35 عصر
اگه بخام یه متغیر از نوع int در فیلد از نوعuniqe ذخیره کنم دقیقا چه کدی بنویسم؟

programer-ir
شنبه 21 آبان 1390, 18:45 عصر
خوب چرا identity تو جدولت استفاده نمی کنی؟؟؟؟؟

minajasmi
شنبه 21 آبان 1390, 19:12 عصر
میشه مرحله به مرحله راهنماییم کنید تا انجام بدم. خیلی نیاز دارم

programer-ir
شنبه 21 آبان 1390, 19:57 عصر
وقتی داری جدول می سازی صفت شماره پرونده رو از نوع int بگیر بایین صفحه هم تو قسمت تنظیمات adentity رو به yes تغییر بده بعد دیگه خوذکار هر رکوردی ثبت بشه یک شماره بهش اختصاص می ده برنامه اگر هم نخواستی از 1 شرو بشه خاصیت seek رو به عدد مورد نظرت تغییر بده

minajasmi
شنبه 21 آبان 1390, 20:04 عصر
اگه یه رکورد حذف بشه شماره ها تغییر نمیکنه؟ مدیر سایت چطور بفهمه شماره هر کاربر چنده؟

programer-ir
شنبه 21 آبان 1390, 23:16 عصر
نه تغییر نمی کنه.... و یک تاست

Saman Hashemi
یک شنبه 22 آبان 1390, 08:02 صبح
اگه یه رکورد حذف بشه شماره ها تغییر نمیکنه؟ مدیر سایت چطور بفهمه شماره هر کاربر چنده؟
سعی کنید کاربری حذف نکنید بلکه غیرفعالش کنید این بهتر از حذف کردن است و دست مدیر سایت هم برای مدیریت کاربرها بازتر است و شما برای اینکار یه فیلد bit برای هر کاربر در نظر بگیرید و مقداردهی کنید...!

minajasmi
یک شنبه 22 آبان 1390, 09:30 صبح
سعی کنید کاربری حذف نکنید بلکه غیرفعالش کنید این بهتر از حذف کردن است و دست مدیر سایت هم برای مدیریت کاربرها بازتر است و شما برای اینکار یه فیلد bit برای هر کاربر در نظر بگیرید و مقداردهی کنید...!

بعد واسه نمایش فیلدها باید این فیلد فعال یا غیر فعال بودن کاربر چک بشه که فقط کاربرای فعال نشون بده؟

mohsen_kh1364
یک شنبه 22 آبان 1390, 09:30 صبح
من نمی دونم چه استفاده ای از این شماره پرونده می خوای بکنی. اما در بعضی مواقع جهت بالابردن امنیت، بهتره این شماره خیلی سر راست نباشه. مثلاً اگه من بدونم شماره ها به ترتیب داده می شه، اگه شماره ی من 1000021 باشه مطمئن هستم 1000020 هم یک شماره ی معتبره. اون موقع شاید بتونم سوء استفاده کنم.
اگر این مشکل وجود نداره گذاشتن یک فیلد identity علاوه بر ID ای که احتمالا همه ی جداولت دارند، سرراست ترین راه حله. چون لازم نیست خودت بهش عدد بدی، خودش ست می کنه و حتماً هم غیر تکراری.
اما اگه این مشکل هست، می شه از ترکیب یک عدد تصادفی و یک عدد دیگه مثل تاریخ یا همین identity استفاده کرد. یعنی خودت عدد رو در DB ست کنی.

programer-ir
یک شنبه 22 آبان 1390, 10:12 صبح
تو تنظیمات identity می تئنی مشخص کنی چندتا جندتا بره جلو .بعدش هم می تونی شماره ای که برای اولین کاربر شروع می شه از مثلا 51000 شروع کنی بعد فقط 4 رقم سمت راستشو به کاربر بدی که دیگه نتو نه سو استفاده کنه ....

mohsen_kh1364
یک شنبه 22 آبان 1390, 10:16 صبح
بعد واسه نمایش فیلدها باید این فیلد فعال یا غیر فعال بودن کاربر چک بشه که فقط کاربرای فعال نشون بده؟

کافیه آخر همه ی کوئری های اتصال به دیتابیس یک where دیگه اضافه کنی :


Select * from tableNmae where enable='True'

minajasmi
یک شنبه 22 آبان 1390, 10:59 صبح
تو تنظیمات identity می تئنی مشخص کنی چندتا جندتا بره جلو .بعدش هم می تونی شماره ای که برای اولین کاربر شروع می شه از مثلا 51000 شروع کنی بعد فقط 4 رقم سمت راستشو به کاربر بدی که دیگه نتو نه سو استفاده کنه ....

مگه sql خودکار این شماره را اضافه نمیکنه من کجا باید 4 رقم سمت راستشو جدا کنم؟

mohsen_kh1364
یک شنبه 22 آبان 1390, 11:13 صبح
مگه sql خودکار این شماره را اضافه نمیکنه من کجا باید 4 رقم سمت راستشو جدا کنم؟

وقتی مقدار رو از دیتابیس گرفتی و در یک متغیر ذخیره کردی، باقیمانده ی تقسیم اون عدد رو به مثلاً 10000 حساب کرده و به کاربر نشون می دی. نه کل عدد رو