سئوالاتی درباره sql

the_king

مدیرکل انجمن
نگاه کنید . من یه دیتابیس بنام Database.db در مسیر نرم افزارم ساختم . حالا میخوام جدول ها را دسته بندی کنم . یعنی مثلا برای بخش تنظیمات ، 2 تا جدول داشته باشم . بنابراین یه نام ای میخوام بنام Setting تا (به عنوان دسته . تا زیر مجموعه هاش) 2 جدول بنام Program و Interface را داخلِ این دسته ی Setting قرار بدم .
روشی برای ایجاد این کار نیست؟
همچین تعریفی در SQL وجود نداره، شما یک پایگاه داده با هر اسم فایل و مسیری رو موقع اتصال به SQLite یا هر سیستم مدیریت پایگاه داده دیگری می توانید با نام مستعار دلخواهی مثل Setting معرفی کنید، هر چیزی که مربوط به این پایگاه داده است میتونه از اون به بعد در کد های SQL تحت عنوان Setting مورد اشاره قرار میگیره، نه فقط دو تا جدول خاص. اون AS schema-name برای دسته بندی نیست که جایی ذخیره بشه و بخواهید برای گروه بندی استفاده کنید. برای مشخص کردن نام مستعار پایگاه داده است.
https://sqlite.org/lang_attach.html
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
همچین تعریفی در SQL وجود نداره، شما یک پایگاه داده با هر اسم فایل و مسیری رو موقع اتصال به SQLite یا هر سیستم مدیریت پایگاه داده دیگری می توانید با نام مستعار دلخواهی مثل Setting معرفی کنید، هر چیزی که مربوط به این پایگاه داده است میتونه از اون به بعد در کد های SQL تحت عنوان Setting مورد اشاره قرار میگیره، نه فقط دو تا جدول خاص. اون AS schema-name برای دسته بندی نیست که جایی ذخیره بشه و بخواهید برای گروه بندی استفاده کنید. برای مشخص کردن نام مستعار پایگاه داده است.
https://sqlite.org/lang_attach.html

خیلی ممنون
پس شدنی نیست .
استاد ، همونطور که میدونین ، میخوام لیست استثنائات درایوی را که کاربر اضافه کرد را در جدولی مجزا (مثلا بنام ExceptionManage) ثبت کنم که فیلد کلید اصلی اش (بنام DriveGuid) ، که GUID اون درایو هست .
بعد میخوام در جدول Program ، یه فیلدی (بنام ExceptionManage) تعریف کنم که به جدول Exception Manage و فیلد DriveGuid اشاره کنه .
برای این کار ، بهتره از کلید خارجی استفاده کنم؟
اگه آره ، کدوم فیلد را باید بصورت کلید خارجی تعریف کنم؟ فیلد ExceptionManage در جدول Program را یا اینکه فیلد DriveGuid در جدول ExceptionManage را؟

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
استاد ، توی sqlite ، هر نوعی رو تعریف کنیم ، خود sqlite ، این ها را به یکی از انواع NULL و INTEGER و REAL و TEXT و BLOB تبدیل میکنه؟ درسته؟
یعنی هر نوع داده ای ای که توی sqlite تعریف بشه ، محدود به یکی از این 5 نوع هه؟ درسته؟
مثلا اگه varchar یا nvarchar یا nvarchar(100) رو تعریف کنیم ، همه شون موقع ذخیره سازی توی sqlite ، تبدیل به نوع TEXT (که همیشه حداکثر تعداد کاراکترها توشون ذخیره میشه) تبدیل میشن؟ درسته؟
حالا اینکه کاراکترهای این TEXT ، یونیکد باشن یا نه ، توی تنظیمات دیتابیس (که با دستورات خاصی موقع ایجاد دیتابیس ساخته میشه) (یا مثلا در نرم افزار sqlite expert ، در سربرگ Database ، در فیلد encoding ، نوع utf8 یا utf16 را) میتونیم مشخص کنیم.
درسته؟
نوع NUMERIC هم مقداری از نوع INTEGER یا REAL خواهد بود. درسته؟
decimal (10, 5) به این معناست که در sqlite ، تعدادِ 10 عدد رند و 5 عدد بعد از اعشار را ذخیره میکنه؟ اگه آره ، حداکثر مقداری که توی sqlite از نوع NUMERIC (یا REAL) میتونه ذخیره کنه ، decimal (10, 5) هست؟
INTEGER هم که بستگی به میزانش از 1 تا 8 بایت میتونه اندازه اش بشه و عدد رند را ذخیره میکنه .
REAL هم که نوع عدد اعشاری هست و اندازه اش 8 بایت هست .
BLOB هم که هر نوع را میتونه شامل بشه و موقع ذخیره کردن رکورد ، نوع اش مشخص میشه که برای هر رکورد ، نوع متفاوتتی میتونه داشته باشه . مثل نوع object یا شاید هم نوع dinamic در سی شارپ .
همه ی اینها درستن؟

Datatypes In SQLite Version 3

فقط نوع IMAGE رو نفهمیدم چجوری هه .
 

the_king

مدیرکل انجمن
خیلی ممنون
پس شدنی نیست .
استاد ، همونطور که میدونین ، میخوام لیست استثنائات درایوی را که کاربر اضافه کرد را در جدولی مجزا (مثلا بنام ExceptionManage) ثبت کنم که فیلد کلید اصلی اش (بنام DriveGuid) ، که GUID اون درایو هست .
بعد میخوام در جدول Program ، یه فیلدی (بنام ExceptionManage) تعریف کنم که به جدول Exception Manage و فیلد DriveGuid اشاره کنه .
برای این کار ، بهتره از کلید خارجی استفاده کنم؟
اگه آره ، کدوم فیلد را باید بصورت کلید خارجی تعریف کنم؟ فیلد ExceptionManage در جدول Program را یا اینکه فیلد DriveGuid در جدول ExceptionManage را؟

کلا قاتی کردم . نمیدونم کدوم را باید کلید خارجی تعریف کنم . دقت کنید که جدول Program ، چون تنظیمات را ذخیره میکنه ، به احتمال بسیار زیاد ، فقط یک رکورد رو میخوام براش ذخیره کنم . چون مثلا معنا نداره برای فیلد SilenceMode (فیلدی در همین جدول Program که وضعیت فعال بودن یا نبودن حالت سکوت را مشخص میکنه) یا هر فیلد دیگه ، دو مقدار متفاوت در دو یا چند رکورد متفاوت ثبت بشه . یا معنای چندانی نداره که یک مقدار ، در چند رکورد تکرار بشه .
دلیلی وجود نداره که بخواهید بین Program و ExceptionManage ارتباطی برقرار کنید که کلید لازم داشته باشه. شما فقط یک برنامه دارید وفقط یک نسخه تنظیمات برای اون برنامه. وقتی تنظیمات فقط یک نسخه باشه کلیدی که بخواد نسخه ها رو تفکیک کنه لازم نیست. همه رکورد های داخل ExceptionManage مربوط به همون تک نسخه داخل Program ئه. وقتی کلید لازم دارید که بخواهید در Program چندین نسخه تنظیمات رو ذخیره کنید که هر کدوم یک کلید اختصاصی و انحصاری داشته باشند و هر رکورد داخل ExceptionManage باید با فیلدی به اون نسخه مربوطه مرتبط باشه.
 

the_king

مدیرکل انجمن
استاد ، توی sqlite ، هر نوعی رو تعریف کنیم ، خود sqlite ، این ها را به یکی از انواع NULL و INTEGER و REAL و TEXT و BLOB تبدیل میکنه؟ درسته؟

یعنی هر نوع داده ای ای که توی sqlite تعریف بشه ، محدود به یکی از این 5 نوع هه؟ درسته؟
مثلا اگه varchar یا nvarchar یا nvarchar(100) رو تعریف کنیم ، همه شون موقع ذخیره سازی توی sqlite ، تبدیل به نوع TEXT (که همیشه حداکثر تعداد کاراکترها توشون ذخیره میشه) تبدیل میشن؟ درسته؟
بله، اما این مساله داخلی ئه، شما موقع نوشتن کد SQL درگیر این قضایا نیستید که نگران این باشید که SQLite با چه نوع داده ای ذخیره اش می کنه.

حالا اینکه کاراکترهای این TEXT ، یونیکد باشن یا نه ، توی تنظیمات دیتابیس (که با دستورات خاصی موقع ایجاد دیتابیس ساخته میشه) (یا مثلا در نرم افزار sqlite expert ، در سربرگ Database ، در فیلد encoding ، نوع utf8 یا utf16 را) میتونیم مشخص کنیم.
درسته؟
همیشه Unicode ئه، نیازی هم به تنظیم کردن نداره. طبق روال #C هم شما string هاتون Unicode ئه، Unicode میدید و Unicode میگیرید. UTF8 رو می توانید در #C بصورت آرایه ای از بایت ها ایجاد کنید ولی string هاتون UTF-16 ئه، UTF-8 نمیشه. دلیلی نداره که بخواهید در SQLite سیستم رو تنظیم کنید یا تغییر بدید.

نوع NUMERIC هم مقداری از نوع INTEGER یا REAL خواهد بود. درسته؟
NUMERIC یا DECIMAL یا NUMBER جزو انواع داده ای اعشاری با ممیز ثابت SQL هستند، ربطی به سیستم مدیریت پایگاه داده خاصی ندارند و معادل REAL یا INTEGER نیستند. هر سیستم مدیریت پایگاه داده ای ممکنه این انواع رو با انواع داده ای خاص داخلی جایگزین کنه ولی بصورت معمول اعداد اعشاری با ممیز ثابت در اونها بکار میره که تضمین میکنه اون تعداد رقم قبل اعشار و بعد اعشار حتما و همیشه قابل ثبت باشه، برای همین فرضا شبیه double و real با ممیز شناور و مقادیر تخمینی نیستند. در SQL برای اعداد اعشاری با ممیز شناور از FLOAT و REAL و DOUBLE استفاده میشه، حالا ممکنه برخی سیستم های مدیریت پایگاه داده همه این انواع داده ای رو نداشته باشه اما در کل در تعاریف این تفکیک بین ممیز شناور و ممیز ثابت هست.

decimal (10, 5) به این معناست که در sqlite ، تعدادِ 10 عدد رند و 5 عدد بعد از اعشار را ذخیره میکنه؟
عدد رند نه، رقم قبل از اعشار. رند یعنی گرد کردن عدد. مزیت ممیز ثابت به ممیز شناور همینه که با گرد کردن عدد محاسبات رو دچار خطا نمی کنه.
اگه آره ، حداکثر مقداری که توی sqlite از نوع NUMERIC (یا REAL) میتونه ذخیره کنه ، decimal (10, 5) هست؟
نه. حداکثر اینجا معنی نمیده. مقایسه کردن محدوده مقادیر ممیز شناور و ممیز ثابت به این شکل عملی نیست. در اعداد اعشاری ممیز شناور 64 بیتی با استاندارد IEEE مثل REAL میشه بین 15 تا 17 رقم با ارزش رو ذخیره کرد. اما اینکه چقدر از این رقم ها رو به قبل از ممیز اختصاص بدید و چه مقدار به بعد از ممیز دست تون باز ئه و حداکثر بر اساس مشخصات دلخواه شما معنی متفاوتی داره.
اما از طرف دیگه محاسبات ممیز شناور هیچ وقت نمیتونه دقیقا معادل محاسبات ممیز ثابت باشه که البته در SQLite نوع داده داخلی ای برای محاسبات ممیز ثابت نیست.

فقط نوع IMAGE رو نفهمیدم چجوری هه .
نوع داده باینری منسوخ ای است که تصاویر داخلش ذخیره میشه، ممکنه در همه سیستم های مدیریت پایگاه داده پشتیبانی نشه.
 

the_king

مدیرکل انجمن
استاد ، بحث CONFLICT clause (بصورت کلی) کاربردش برای چیه؟
من متوجه نشدم :

SQLite Query Language: ON CONFLICT clause
برای اینکه اگر دستوری اجرا شد که به دلیلی به مشکل برخورد و خطا داشت چه رفتاری نشون بده، خطای این دستور رو نادیده بگیره و ادامه بده، یا کل تراکنش تا اینجا انجام شده رو لغو کنه و به وضعیت قبل از تراکنش برگردونه، یا فقط تاثیرات این دستور رو لغو کنه و ادامه بده یا ...
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
استاد ، من یه جدول بنام Program با 3 فیلد ID (نوع integer و primary key هست هر چند این جدولم فقط یک رکورد داره) و SilenceMode (که از نوع بولین هست) و ExceptionManage (از نوع بولین هست و بصورت پیش فرض False هست) دارم .این جدول هم همونطور که مشخص هه ، برای ذخیره ی تنظیمات هست .
یه جدول دیگه بنام ExceptionManage دارم که درایوهایی که کاربر برای مستثنی کردن ، انتخاب کرده را توش ذخیره میکنم که فیلدهای VolumeGUID (از نوع TEXT) و DriveName (از نوع TEXT) و TotalSize (از نوع REAL برای ذخیره سازی حداکثر حجم درایو با یک رقم اعشار) داره .
یه تریگر برای جدول ExceptionManage نوشتم (بنام TriggerSetTrueProgram_ExceptionManage) که وقتی رکوردی به این جدول اضافه شد ، مقدار فیلد ExceptionManage در جدول Program را True کنه :

کد:
CREATE TRIGGER [TriggerSetTrueProgram_ExceptionManage] AFTER INSERT ON [ExceptionManage]
BEGIN
  UPDATE
    [Program]
  SET
    [ExceptionManage] = TRUE
  WHERE
    [ID] = 1;
END;

حالا میخوام یه تریگر دیگه ای بنویسم که فقط اگه همه ی رکوردها از جدول ExceptionManage (مثلا همه ی رکوردهای فیلد VolumeGUID از جدول ExceptionManage) حذف شدن (نه اینکه مثلا 5 تا رکورد داشته باشه و فقط یکی اش حذف شده باشه ها . کلا زمانی که همه ی رکوردهاش حذف شده باشن) ، مقدار فیلد ExceptionManage در جدول Program را False کنه . اما نمیدونم چجوری شرط بذارم که اگه همه ی رکوردهاش حذف شدن ، این کار را انجام بده .
این کدش را راهنمایی میکنین که چجوری میشه نوشت؟
یا اگه همه ی این دو تریگر را توی یه تریگر بشه نوشت که خیلی بهتر میشه . یعنی چک کنه اگه رکوردی داخل فیلد VolumeGUID در جدول ExceptionManage وجود داره ، پس مقدار فیلد ExceptionManage در جدول Program را true کنه وگرنه اگه هیچ رکوردی توش نیست ، مقدارش را false کنه .
خیلی ممنون
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
استاد ، من یه جدول بنام Program با 3 فیلد ID (نوع integer و primary key هست هر چند این جدولم فقط یک رکورد داره) و SilenceMode (که از نوع بولین هست) و ExceptionManage (از نوع بولین هست و بصورت پیش فرض False هست) دارم .این جدول هم همونطور که مشخص هه ، برای ذخیره ی تنظیمات هست .
یه جدول دیگه بنام ExceptionManage دارم که درایوهایی که کاربر برای مستثنی کردن ، انتخاب کرده را توش ذخیره میکنم که فیلدهای VolumeGUID (از نوع TEXT) و DriveName (از نوع TEXT) و TotalSize (از نوع REAL برای ذخیره سازی حداکثر حجم درایو با یک رقم اعشار) داره .
یه تریگر برای جدول ExceptionManage نوشتم (بنام TriggerSetTrueProgram_ExceptionManage) که وقتی رکوردی به این جدول اضافه شد ، مقدار فیلد ExceptionManage در جدول Program را True کنه :

کد:
CREATE TRIGGER [TriggerSetTrueProgram_ExceptionManage] AFTER INSERT ON [ExceptionManage]
BEGIN
  UPDATE
    [Program]
  SET
    [ExceptionManage] = TRUE
  WHERE
    [ID] = 1;
END;

حالا میخوام یه تریگر دیگه ای بنویسم که فقط اگه همه ی رکوردها از جدول ExceptionManage (مثلا همه ی رکوردهای فیلد VolumeGUID از جدول ExceptionManage) حذف شدن (نه اینکه مثلا 5 تا رکورد داشته باشه و فقط یکی اش حذف شده باشه ها . کلا زمانی که همه ی رکوردهاش حذف شده باشن) ، مقدار فیلد ExceptionManage در جدول Program را False کنه . اما نمیدونم چجوری شرط بذارم که اگه همه ی رکوردهاش حذف شدن ، این کار را انجام بده .
این کدش را راهنمایی میکنین که چجوری میشه نوشت؟
یا اگه همه ی این دو تریگر را توی یه تریگر بشه نوشت که خیلی بهتر میشه . یعنی چک کنه اگه رکوردی داخل فیلد VolumeGUID در جدول ExceptionManage وجود داره ، پس مقدار فیلد ExceptionManage در جدول Program را true کنه وگرنه اگه هیچ رکوردی توش نیست ، مقدارش را false کنه .
خیلی ممنون
اولا لزومی نداره که ID خاصی رو مد نظر قرار بدید :
کد:
CREATE TRIGGER [TriggerSetTrueProgram_ExceptionManage] AFTER INSERT ON [ExceptionManage]
BEGIN
  UPDATE
    [Program]
  SET
    [ExceptionManage] = TRUE;
END;

در ضمن نمی توانید در یک Trigger همزمان INSERT و DELETE رو ترکیب کنید، چیزی مثل AFTER DELETE, INSERT نداره. باید Trigger ها مجزا تعریف بشن، حتی اگه کدشون شبیه هم باشه :
کد:
CREATE TRIGGER [TriggerAfterDelete_ExceptionManage] AFTER DELETE ON [ExceptionManage]
BEGIN
  UPDATE
    [Program]
  SET
    [ExceptionManage] = CASE WHEN (SELECT COUNT(*) FROM [ExceptionManage]) > 0 THEN 1 ELSE 0 END;
END;
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اولا لزومی نداره که ID خاصی رو مد نظر قرار بدید :
کد:
CREATE TRIGGER [TriggerSetTrueProgram_ExceptionManage] AFTER INSERT ON [ExceptionManage]
BEGIN
  UPDATE
    [Program]
  SET
    [ExceptionManage] = TRUE;
END;

در ضمن نمی توانید در یک Trigger همزمان INSERT و DELETE رو ترکیب کنید، چیزی مثل AFTER DELETE, INSERT نداره. باید Trigger ها مجزا تعریف بشن، حتی اگه کدشون شبیه هم باشه :
کد:
CREATE TRIGGER [TriggerAfterDelete_ExceptionManage] AFTER DELETE ON [ExceptionManage]
BEGIN
  UPDATE
    [Program]
  SET
    [ExceptionManage] = CASE WHEN (SELECT COUNT(*) FROM [ExceptionManage]) > 0 THEN 1 ELSE 0 END;
END;

خیلی ممنون استاد
استاد ، الان این کدی که نوشتید :

کد:
CASE WHEN (SELECT COUNT(*) FROM [ExceptionManage]) > 0 THEN 1 ELSE 0 END;

راهنماش را از کجا گیر آوردید؟
یعنی من که بلد نیستم ، باید چجوری متوجه بشم؟
مثلا من نه کلمه ی CASE را میدونم چیه و نه راهنماش را پیدا کردم در سایت . همینطور خیلی از کلمات و توابع دیگه مثل THEN و کلا ساختاری که ترتیب کلمات را بکار بردید رو نمیدونم (مثلا از کجا متوجه شدید که فلان کلمه را باید در کجا قرار بدید و بعدش چه کلمه ای قرار بدید) و ...
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد
استاد ، الان این کدی که نوشتید :

کد:
CASE WHEN (SELECT COUNT(*) FROM [ExceptionManage]) > 0 THEN 1 ELSE 0 END;

راهنماش را از کجا گیر آوردید؟
یعنی من که بلد نیستم ، باید چجوری متوجه بشم؟
مثلا من نه کلمه ی CASE را میدونم چیه و نه راهنماش را پیدا کردم در سایت . همینطور خیلی از کلمات و توابع دیگه مثل THEN و کلا ساختاری که ترتیب کلمات را بکار بردید رو نمیدونم (مثلا از کجا متوجه شدید که فلان کلمه را باید در کجا قرار بدید و بعدش چه کلمه ای قرار بدید) و ...

از اینجا گیر آوردید :

SQLite Query Language: expression

ولی باز هم برام گنگ هه (چون هم sql ام ضعیف هه و هم باید اون مستندات را بعدا کامل بررسی کنم) .
و چیز بدیهی اینکه هر جایی expr نوشته ، ما میتونیم از راهنمای همین expr که در بالا دادم ، استفاده کنیم . مثل همین کد بالایی که برای دستور update دادید (بعد از نام فیلد و قرار دادنِ مساوی ، میتونیم عبارت expr را بکار ببریم) .
نکته ی بعدی توی کدتون اینه که کلمه ی کلیدی CASE در sqlite ، کار if و else در زبان های برنامه نویسی دیگه مثل سی شارپ را میکنه .
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نه. حداکثر اینجا معنی نمیده. مقایسه کردن محدوده مقادیر ممیز شناور و ممیز ثابت به این شکل عملی نیست. در اعداد اعشاری ممیز شناور 64 بیتی با استاندارد IEEE مثل REAL میشه بین 15 تا 17 رقم با ارزش رو ذخیره کرد. اما اینکه چقدر از این رقم ها رو به قبل از ممیز اختصاص بدید و چه مقدار به بعد از ممیز دست تون باز ئه و حداکثر بر اساس مشخصات دلخواه شما معنی متفاوتی داره.
اما از طرف دیگه محاسبات ممیز شناور هیچ وقت نمیتونه دقیقا معادل محاسبات ممیز ثابت باشه که البته در SQLite نوع داده داخلی ای برای محاسبات ممیز ثابت نیست.

خیلی ممنون استاد
الان پس برای اعداد ممیز شناور ، از همون float و double در sqlite استفاده میکنیم (که sqlite اینا را توی خودش تبدیل به نوع Real میکنه) . درسته؟
البته میتونیم بصورت مستقیم هم از نوع Real در sqlite برای ممیز شناور استفاده کنیم .
برای ممیز ثابت (منظورتون از ممیز ثابت ، همون نوع decimal در سی شارپ هست؟) هم از نوع decimal در sqlite استفاده میکنیم که دقت اش بالاست . درسته؟
حالا چون گفتین ذخیره کردن قبل و بعد از اعشار رو خودمون میتونیم بصورت دلخواه تنظیم کنیم ، توی sqlite چجوری میشه عددی را ذخیره کرد که فقط یک رقم ، عددِ بعد از اعشار را ذخیره کنه؟
 

the_king

مدیرکل انجمن
خیلی ممنون استاد
الان پس برای اعداد ممیز شناور ، از همون float و double در sqlite استفاده میکنیم (که sqlite اینا را توی خودش تبدیل به نوع Real میکنه) . درسته؟
البته میتونیم بصورت مستقیم هم از نوع Real در sqlite برای ممیز شناور استفاده کنیم .
برای ممیز ثابت (منظورتون از ممیز ثابت ، همون نوع decimal در سی شارپ هست؟) هم از نوع decimal در sqlite استفاده میکنیم که دقت اش بالاست . درسته؟
حالا چون گفتین ذخیره کردن قبل و بعد از اعشار رو خودمون میتونیم بصورت دلخواه تنظیم کنیم ، توی sqlite چجوری میشه عددی را ذخیره کرد که فقط یک رقم ، عددِ بعد از اعشار را ذخیره کنه؟
تعریف می کنید ولی sqlite که همه این تعاریف رو که پشتیبانی نمیکنه. وقتی خودتون میدونید که عدد اعشاری نهایتا در sqlite با ممیز شناور IEEE ئه 64 بیتی ذخیره میشه و ممیز ثابت نداره پس دلیلی نداره که بیخودی در تعاریف برای اعداد ممیز ثابت و ارقام قبل ممیز و بعد ممیز وسواس بخرج بدید.
دقت داده decimal در سمت #c شما است ولی وقتی در سمت sqlite به double تبدیل بشه و ذخیره بشه دیگه دقت اولیه رو از دست میده.
می توانید یک مقدار صحیح بدون اعشار تعریف کنید که ذخیره بشه اما در موقع استفاده خودتون رقم کوچیکه رو برای یک رقم بعد اعشار در نظر بگیرید (تقسیم بر 10)
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
تعریف می کنید ولی sqlite که همه این تعاریف رو که پشتیبانی نمیکنه. وقتی خودتون میدونید که عدد اعشاری نهایتا در sqlite با ممیز شناور IEEE ئه 64 بیتی ذخیره میشه و ممیز ثابت نداره پس دلیلی نداره که بیخودی در تعاریف برای اعداد ممیز ثابت و ارقام قبل ممیز و بعد ممیز وسواس بخرج بدید.
دقت داده decimal در سمت #c شما است ولی وقتی در سمت sqlite به double تبدیل بشه و ذخیره بشه دیگه دقت اولیه رو از دست میده.
می توانید یک مقدار صحیح بدون اعشار تعریف کنید که ذخیره بشه اما در موقع استفاده خودتون رقم کوچیکه رو برای یک رقم بعد اعشار در نظر بگیرید (تقسیم بر 10)

آها خیلی ممنون .
پس باید عدد صحیح رو وارد کرد در دیتابیس و موقع خوندن ، تقسیم کرد تا به این روش ، اعشاری بشه . و بنابراین ، روش مستقیمی نداره که مستقیما بشه تعداد اعشار دلخواه را ذخیره کرد .
یک چیز دیگه اینکه اگه بخوایم یک رنگ (که شامل ARGB هست) را فقط در یک فیلد (نه اینکه در چندین فیلد) در دیتابیس ذخیره کنیم ، شدنی هست؟ اگه آره ، چجوری؟ و همینطور ، فیلد را از چه نوعی در نظر بگیریم؟
البته میدونید که هر کدوم از A و R و G و B ، تا 255 جا میشن ، و ممکنه هر کدوم شون ، تعداد عددشون متفاوت بشه (مثلا A ، دو رقم اما R ، یک رقمی بشه) و چون قبل از اعداد هم نمیشه برای اعداد ، 0 گذاشت ، پس نمیشه کنار هم ذخیره کرد و بعدا موقع خوندن از دیتابیس ، 3 رقم ، 3 رقم جدا کرد . غیر از اینکه از نوع رشته ذخیره کنیم .
باید از نوع رشته ذخیره کنیم و همین روند بالا (جدا کردن 3 رقم موقع خوندن از دیتابیس) را انجام بدیم؟
یا اینکه روش دیگه ای هست؟
 

the_king

مدیرکل انجمن
آها خیلی ممنون .
پس باید عدد صحیح رو وارد کرد در دیتابیس و موقع خوندن ، تقسیم کرد تا به این روش ، اعشاری بشه . و بنابراین ، روش مستقیمی نداره که مستقیما بشه تعداد اعشار دلخواه را ذخیره کرد .
یک چیز دیگه اینکه اگه بخوایم یک رنگ (که شامل ARGB هست) را فقط در یک فیلد (نه اینکه در چندین فیلد) در دیتابیس ذخیره کنیم ، شدنی هست؟ اگه آره ، چجوری؟ و همینطور ، فیلد را از چه نوعی در نظر بگیریم؟
البته میدونید که هر کدوم از A و R و G و B ، تا 255 جا میشن ، و ممکنه هر کدوم شون ، تعداد عددشون متفاوت بشه (مثلا A ، دو رقم اما R ، یک رقمی بشه) و چون قبل از اعداد هم نمیشه برای اعداد ، 0 گذاشت ، پس نمیشه کنار هم ذخیره کرد و بعدا موقع خوندن از دیتابیس ، 3 رقم ، 3 رقم جدا کرد . غیر از اینکه از نوع رشته ذخیره کنیم .
باید از نوع رشته ذخیره کنیم و همین روند بالا (جدا کردن 3 رقم موقع خوندن از دیتابیس) را انجام بدیم؟
یا اینکه روش دیگه ای هست؟
اگر رنگ ها شناخته شده و با اسم هستند که می توانید از string استفاده کنید، با c.Name و Color.FromName
اگر رنگ ها شناخته شده نیستند می توانید به عدد صحیح تبدیلشون کنید، با Color.FromArgb(int) و c.ToArgb
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد .
توی پروژه ام از sqlite استفاده میکنم . از کتابخونه و فضای نامِ System.Data.SQLite در پروژه ام استفاده میکنم :

و

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

------------

استاد ، میگم انگار مایکروسافت هم کتابخونه ای برای sqlite زده (حالا نمیدونم قبلا هم داشته یا جدیدا زده . بالاخره ، تازه بهش برخوردم) . در فضای نام و اسمبلیِ Microsoft.Data.Sqlite :


میگم منابع آموزشی در مایکروسافت معمولا بهتر هست . حداقل احتمالا از منابع آموزشی که کتابخونه ی System.Data.SQLite ارائه میده ، بهتر هست . یا در آینده بهتر میشه . موافقید؟
واسه ی همین ، بهتر نیست که همین اول به کتابخونه ی مایکروسافت کوچ کنم؟

-----------

فقط یه مشکلی هست اینه (حداقل بصورت پیش فرض) ، کتابخونه ی مایکروسافت (Microsoft.Data.Sqlite) ، با تنظیمِ any cpu در پروژه مشکل داره . اما انگار راهکار حل این مشکل را در مطالب زیر ارائه میدن (انگار میگن که برای حل این مشکل ، فایلِ sqlite3.dll و یا همچنین فایل های دیتابیس های مربوطه ی دیگه را در پوشه ی Application Output Directory یا شاید هم Database Output Directory بریزیم تا حل شه) :

و


البته اون کتابخونه ی System.Data.SQLite ، تا جایی که یادم بیاد ، توسط یه کتابخونه ی وابسته ی دیگه ، این مشکل را خودش اتوماتیک حل کرده بود .

نهایتا اینکه اگه مشکلش با any cpu حل هم نشه ، به قول شما ، دو نسخه ی x86 و x64 از برنامه میدم دیگه .
اما منابعِ آموزشیِ غنی تر ، ارزش این رو داره . نه؟

تشکر استاد .
 

the_king

مدیرکل انجمن
میگم منابع آموزشی در مایکروسافت معمولا بهتر هست . حداقل احتمالا از منابع آموزشی که کتابخونه ی System.Data.SQLite ارائه میده ، بهتر هست . یا در آینده بهتر میشه . موافقید؟
همچین نظری ندارم.
واسه ی همین ، بهتر نیست که همین اول به کتابخونه ی مایکروسافت کوچ کنم؟
چه کوچ بکنید و چه نکنید چیز خاصی از دست نداده اید.
فقط یه مشکلی هست اینه (حداقل بصورت پیش فرض) ، کتابخونه ی مایکروسافت (Microsoft.Data.Sqlite) ، با تنظیمِ any cpu در پروژه مشکل داره . اما انگار راهکار حل این مشکل را در مطالب زیر ارائه میدن (انگار میگن که برای حل این مشکل ، فایلِ sqlite3.dll و یا همچنین فایل های دیتابیس های مربوطه ی دیگه را در پوشه ی Application Output Directory یا شاید هم Database Output Directory بریزیم تا حل شه) :

و


البته اون کتابخونه ی System.Data.SQLite ، تا جایی که یادم بیاد ، توسط یه کتابخونه ی وابسته ی دیگه ، این مشکل را خودش اتوماتیک حل کرده بود .

نهایتا اینکه اگه مشکلش با any cpu حل هم نشه ، به قول شما ، دو نسخه ی x86 و x64 از برنامه میدم دیگه .
اما منابعِ آموزشیِ غنی تر ، ارزش این رو داره . نه؟
رابط ADO.NET سیستم های متفاوت رو با هم مقایسه کنید، اسم کلاس ها و متد هاشون رو ببینید، استاندارد مشخصی دارند، شبیه هم هستند.
اگر یکی شون رو تجربه کرده باشید شیوه کار با بقیه رو هم می دانید. برای همین چیز خاصی در مورد Microsoft.Data.Sqlite یا System.Data.SQLite نیست که منابع آموزشی زیادی بخواد. اون چیزی که بیشتر باید رویش متمرکز بشوید خود رابط ADO.NET ئه نیست، قالب دستورات SQL فرضا در SQLite ئه. که ربطی به ADO.NET و رابط و آموزش های اون رابط نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام و خیلی ممنون استاد .
برای کار ، دیدم خیلی ها sql server و همچنین برنامه نویسی وب میخوان ، منم sql ام خیلی ضعیف هست ، میخوام تقویت کنم .

استاد ، میگم من sql server 2019 را نصب کردم (بدون هیچ مشکلی نصب شد) .
حالا هر چی میگردم ، فایل اجرایی برای Sql Server Management Studio را پیدا نمیکنم .

فایلش را باید از لینکی که در زیر میده ، بصورت جداگانه دانلود و نصب کنیم؟ (نسخه ی sql server ام 2019 هست) :


آره؟
اگه آره ، چرا توی خود همون نرم افزار sql server 2019 نیست؟!
تشکر استاد .
 

the_king

مدیرکل انجمن
سلام و خیلی ممنون استاد .
برای کار ، دیدم خیلی ها sql server و همچنین برنامه نویسی وب میخوان ، منم sql ام خیلی ضعیف هست ، میخوام تقویت کنم .

استاد ، میگم من sql server 2019 را نصب کردم (بدون هیچ مشکلی نصب شد) .
حالا هر چی میگردم ، فایل اجرایی برای Sql Server Management Studio را پیدا نمیکنم .

فایلش را باید از لینکی که در زیر میده ، بصورت جداگانه دانلود و نصب کنیم؟ (نسخه ی sql server ام 2019 هست) :


آره؟
اگه آره ، چرا توی خود همون نرم افزار sql server 2019 نیست؟!
تشکر استاد .
بله. چون قبلا توسعه شون همگام با هم بود، ولی الان دیگه محصولات مجزایی هستند، ممکنه یکی شون هر ماه نسخه جدید داشته باشه و یکی شون هر سال یکبار. سال 2015 مایکروسافت اعلام کرد که از این به بعد توسعه SQL Server Database Engine و Sql Server Management Studio رو مستقل از هم انجام میده، برای همین ممکنه در یک Setup در کنار هم قرارشون نده و لازم باشه که مجزا دریافتشون کنید :
In addition, we are delighted to announce our first "preview" release of SQL Server Management Studio! This is our first effort to release SQL Server Management Studio (SSMS) in a mechanism outside of the SQL Engine releases. Our goal is to update this frequently with new features, fixes and support for the newest SQL Server features in SQL Server Engine and Azure SQL Database.​

Announcing SQL Server Management Studio – June 2015 Release

فرضا حالا وقتی می خواهید SQL Server 2019 رو نصب کنید، گزینه ای برای تیک زدن نصب Management Studio نداره، در منو های Setup صرفا یک لینک پیشنهاد میکنه که اگر Management Studio رو میخواهید از اونجا دانلود بشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد .

استاد ، در محیط Sql Server Management Studio (SSMS) ، میخوام حالت گرافیکی ای که برای تولید کدهای query وجود داره ، استفاده کنم .
یعنی محیطی که در لینک زیر هست را میخوام (diagrame pane و ... که در این لینک هستن) :


و


که اگه اشتباه نکنم ، میگه برای این کار ، باید ابزار Visual Database Tools را نصب کنیم .
اما این ابزار ، انگار فقط برای Visual Studio موجود هست :


منتها من برای ویژال استودیو نمیخوام .
فقط برای محیط SSMS یا کلا برای محیط نرم افزار sql server میخوام .
همچین چیزی برای این محیط ، وجود داره؟
اگه آره ، از کجا باید دانلود کنم؟

تشکر استاد .
 

جدیدترین ارسال ها

بالا