PDA

View Full Version : کار با دیتابیس Sql



alireza643
شنبه 13 مرداد 1386, 10:34 صبح
سلام
من یه فرم دارم که روش دوتا Text برای گرفتن نام و نام خانوادگی وجود داره. حالا میخوام وقتی کار بر دکمه ی ثبت رو میزنه برنامه به دیتابیس وصل بشه بررسی کنه که آیا این اسم تو دیتابیس وجود داره یا نه. اگر وجود نداشت یک ردیف ایجاد کنه و نام و نام خانوادگی رو در اون قرار بده. این کار رو چطوری میتونم انجام بدم؟
یه سوال دیگه این که من تو کار دیتا بیس تازه کارم برای این که کار کردن با دیتابیس رو به کمک C# به طور کامل یاد بگیرم باید چی کار کنم ؟ کتاب خوب سراغ دارید؟
متشکرم

choobin84
شنبه 13 مرداد 1386, 12:12 عصر
سلام
من یه فرم دارم که روش دوتا Text برای گرفتن نام و نام خانوادگی وجود داره. حالا میخوام وقتی کار بر دکمه ی ثبت رو میزنه برنامه به دیتابیس وصل بشه بررسی کنه که آیا این اسم تو دیتابیس وجود داره یا نه. اگر وجود نداشت یک ردیف ایجاد کنه و نام و نام خانوادگی رو در اون قرار بده. این کار رو چطوری میتونم انجام بدم؟
متشکرم

برای بررسی وجود یک رکورد در جدول:


select * from table1 where name='"+textBox1.Text+"' and family='"+textBox2.Text+"'"

این کد تمام رکورد هایی رو بر میگردونه که نهام و فامیلشان برابر مقادر دلخواه در تکست باکس هاست.
اگر این مقادیر برگشتی از رکورد ها رو در یک datatable بریزیم و تعداد رکورد ها را بشماریم می توان فهمید که آیا قبلا ثبت شده است یا نه.
بعد این کد رو اضافه کنیم؛

if(dt.Rows>count==0)
//OK
dt یک datatable است.
اما یک را آسانتر :


select count(*) from table1 where name='"+textBox1.Text+"' and family='"+textBox2.Text+"'"
این کد تعداد رکوردهای با مقادیر دلخواه رو بر می گردونه

به نظر من بهترین کتاب برای یادگیری ÷ایگاه داده ها همان کتاب های الکترونیکی ebook است.

alireza643
شنبه 13 مرداد 1386, 13:11 عصر
مرسی از راهنمایی. من مشکلم رو به این روش حل کردم که مقدار رو در یک dt میریزم و Update رو داخل یه try catch قرار میدم و اگر exeption رخ داد با بررسی کردن اون به کاربر اعلام میکنم که قبلا در سیستم ثبت شده.
برای ebook هم که گفتید ممنون ولی نمیشد اسم کتاب رو بگید و بگید از کجا میشه پیدا کرد؟

alireza643
شنبه 13 مرداد 1386, 13:57 عصر
من یه فیلد تاریخ هم به برنامه اضافه کردم. الان وقتی تو دستور insert مستقیما یه تاریخ مینویسم بدون هیچ مشکلی دیتا وارد میشه ولی وقتی از یه textbox برای گرفتن تاریخ استفاده میکنم دچار مشکل میشه این چپیغام رو میده



System.Data.SqlClient.SqlException was caught
Message="Incorrect syntax near '2'."
Source=".Net SqlClient Data Provider"
ErrorCode=-2146232060
Class=15
LineNumber=1
Number=102
Procedure=""
Server="COM-ZEQE9DSB"
State=1
StackTrace:
at System.Data.Common.DbDataAdapter.UpdatedRowStatusE rrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
at System.Data.Common.DbDataAdapter.UpdatedRowStatus( RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
at System.Data.Common.DbDataAdapter.UpdateFromDataTab le(DataTable dataTable, DataTableMapping tableMapping)
at System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
at Test.frmMain.InsertData(String tblName) in E:\Source\Program\Test\Main.cs:line 415

من قبل از این که text رو داخل دیتا بیس بریزم اون رو به تاریخ تبدیل میکنم. مشکل از کجاست؟
مشکل رو که بررسی کردم به این نتیجه رسیدم که من وقتی مستقیم تاریخ رو مینویسم به این شکل مینویسم
روز - ماه - سال ولی وقتی مقداری از textboxخونده میشه و با datetime.parse() به تاریخ تبدیل میشه به این شکل در میاد سال - ماه - روز و این باعث مشکل میشه.یعنی نمیشه از #C برای sql تاریخ فرستاد؟

choobin84
شنبه 13 مرداد 1386, 20:41 عصر
مرسی از راهنمایی. من مشکلم رو به این روش حل کردم که مقدار رو در یک dt میریزم و Update رو داخل یه try catch قرار میدم و اگر exeption رخ داد با بررسی کردن اون به کاربر اعلام میکنم که قبلا در سیستم ثبت شده.
برای ebook هم که گفتید ممنون ولی نمیشد اسم کتاب رو بگید و بگید از کجا میشه پیدا کرد؟

چه مقداری رو در dt می ریزید؟

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

در مورد ebook هم اگر اینترنت پرسرعت پیدا کردم آپ می کنم.
نمی دونم شاید توی همین سایت لینکی هم موجود باشه.جستجو کردین؟

choobin84
شنبه 13 مرداد 1386, 20:49 عصر
من یه فیلد تاریخ هم به برنامه اضافه کردم. الان وقتی تو دستور insert مستقیما یه تاریخ مینویسم بدون هیچ مشکلی دیتا وارد میشه ولی وقتی از یه textbox برای گرفتن تاریخ استفاده میکنم دچار مشکل میشه این پیغام رو میده



System.Data.SqlClient.SqlException was caught
Message="Incorrect syntax near '2'."



مشکل مشخصه.دستور SQL شما در جایی که مقدار 2 قرار داره ، مشکل دستوری و نحوی داره. درج کوتیشن و یا دابل کوتیشن و یا رعایت نکردن قواعد نحوی SQL می تواند باعث بروز خطا شده باشه
اما در موردِ DateTime.Parse و مشکل تاریخ با SQL:
احتمالا شما در بانک فیلدی از نوع DateTime تعریف کرده اید. اگر اینکار را کرده اید اول دردسرهای شماست. چون این نوع تاریخ میلادی را تشخیص می دهد و نمی تواند تاریخ شمسی که وارد می کنید را بفهمد. من برای حل این مشکل یک فیلد تاریخ از نوع Char تعریف می کنم که حداکثر 10 کاراکتر را بگیرد و تمام پردازش ها را در خود نرم افزار انجام میدم.
اینکه تاریخ رو به صورت شمسی در بانک ذخیره کنید و یا اینکه اونو در نرم افزار به میلادی تبدیل کنید و به نرم افزار بفرستید و برای بازخوانی آن اونو دوباره به شمسی برگردونید، تصمیم با خود شماست.

alireza643
یک شنبه 14 مرداد 1386, 08:38 صبح
مشکل مشخصه.دستور SQL شما در جایی که مقدار 2 قرار داره ، مشکل دستوری و نحوی داره. درج کوتیشن و یا دابل کوتیشن و یا رعایت نکردن قواعد نحوی SQL می تواند باعث بروز خطا شده باشه
من یه تاریخ استاندارد که متغیر های از نوع datetime خود c# دارن رو برای دستور میفرستم. چطور میشه که با 2 مشکل پیدا میکنه؟


InsertCmd = "insert into tblName(DateAndTime,Name,LastName) values("
+ MyDateTime + "," + MyName + "," + MyLastName + ")";

این دستوریه که من نوشتم اگر به جای متغیر خودم به صورت دستی یه تاریخ بنویسم مشکلی نداره. ولی وقتی متغیر میگذارم دچار مشکل میشه. حالا من چی کار کنم؟ تاریخ من میلادی هست و میلادی هم ثبت میشه.

choobin84
یک شنبه 14 مرداد 1386, 12:21 عصر
InsertCmd = "insert into tblName(DateAndTime,Name,LastName) values("
+ MyDateTime + "," + MyName + "," + MyLastName + ")";


دستور رو اینطوری تعویض کنید؛


insert into tbl values('"+MyDateTime+"','"+MyName+"','"+MyLastName+"')"همونطوری که گفتم، کوتیشن رو فراموش کرده اید