PDA

View Full Version : update کردن اطلاعات پایگاه پس از درج بوسیله ADOQuery



mehrdad196
سه شنبه 13 آذر 1386, 19:45 عصر
سلام دوستان
وقتی با ADOQuery یک insert را اجرا می کنم , نتیجه را همان موقع و در همان فرم نمی توانم مشاهده کنم و حتماً باید فرم بسته بشه و دوباره باز بشه که اطلاعات بروز شوند .
در واقع یک طوری باید اطلاعات Update شود . اگر کسی می دونه لطف کنه بگه چطوری اطلاعات رو می شه با کد update کرد
من با delphi7 و sqlserver2000 و با adoconnection به پایگاه متصل می شم.
اینم کد :


var
s:string
begin
s := 'insert into Users (name) values ('+ QuotedStr(nameEdit.Text) + ')';
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(str);
ADOQuery1.ExecSQL;
end;

با تشکر

Touska
سه شنبه 13 آذر 1386, 20:38 عصر
بعد از اینکه query رو اجرا کردید بنویسید :


AdoQuery1.Requery();موفق باشید :)

mehrdad196
سه شنبه 13 آذر 1386, 20:56 عصر
این کار رو کردم یک error دیگه میده . سر انجام با کد زیر error می دهد .

var
s:string
begin
s := 'insert into Users (name) values ('+ QuotedStr(nameEdit.Text) + ')';
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(str);
ADOQuery1.Open;
ADOQuery1.ExecSQL;
ADOQuery1.Requery();
ADOQuery1.Close;
end;


error هم اینه :
Command text does not return a result set

حالا عیب از کجاست ؟

JAFO_IRAN
سه شنبه 13 آذر 1386, 21:28 عصر
سلام

1. در یک ADOQuery که دستور insert به عنوان SQL معلوم شده نمیشه Requery کنید چون داده‌ای قرار نیست از insert برگرده!

2. قاعدتا از یک ADOTable یا ADODataSet برای بازنمایی اطلاعات استفاده میشه، همون رو باید دوباره close و open کنید.

3. بهترین روش اینه که با یک ADODataSet داده‌ها رو بازنمایی کنید و با یک ADOCOmmand هم دستور رو اجرا کنید. پس از اجرای دستور، ADODataSet رو دوباره OPen کنید.

4. یک راه میان بر هم هست که من خودم اصلا دوست ندارم ولی اگه پروژه خیلی حساس نباشه میشه ازش استفاده کرد: از یک ADODataSet استفاده کنید و اصلاحات (و مثلا همون insert) را با متدهای اون بنویسید - اینجوری هم در db اعمال میشه و هم در dataset

ارادت

vcldeveloper
چهارشنبه 14 آذر 1386, 03:02 صبح
. یک راه میان بر هم هست که من خودم اصلا دوست ندارم ولی اگه پروژه خیلی حساس نباشه میشه ازش استفاده کرد: از یک ADODataSet استفاده کنید و اصلاحات (و مثلا همون insert) را با متدهای اون بنویسید - اینجوری هم در db اعمال میشه و هم در dataset
نمی دونم چرا این راه را دوست ندارید، ولی وقتی یک کوئری به نحوی نوشته میشه که میشه برای اعمال تغییرات بر روی داده ها از همان DataSet و متدهای آن بدون دردسر استفاده کرد، استفاده از روش ها دیگر نتیجه ایی جز اضافه کاری و افزایش پیچیدگی برنامه نداره. مثل این هست که من بگم کنترل های Data-Aware دلفی بدرد نمی خورند و من همیشه از کنترل های عادی استفاده می کنم و کد مربوط به Insert یا Delete رکوردها را همیشه خودم می نویسم!!
وقتی ابزاری وجود داره و شرایط استفاده ازش هم وجود داره، باید ازش استفاده کرد، هر چند از نظر بعضی ها این کار غیرحرفه ایی به نظر برسه.

JAFO_IRAN
چهارشنبه 14 آذر 1386, 10:43 صبح
سلام استاد کشاورز

راستش نمیخواستم این داستان رو اینجا باز کنم - خیلی وقتها، همونطور که در پست هم گفتم همین راه رو پیشنهاد میکنم - اما دلیلی که دوستش ندارم فقط یک چیزه:

میدانید که در سیستم‌هایی که حجم قابل ملاحظه‌ای از فعالیت‌های همزمانی را دارند و در زمانی که از حالت optimistic در کار با db استفاده میکنیم (مثل روش default در SQLServer)، اینکه در کار با db، حتما یک جوری timeout داشته باشیم یک داستان ضروری است.
متاسفانه وقتی که از روش مورد بحث برای درج یا اصلاح داده‌ها استفاده میکنیم، مکانیزم timeout در ADO کار نمیکنند.

این تنها دلیلی است که باعث شده من این روش را برای کاربردهایی شبیه این سوال دوست نداشته باشم اما با حرف شما در مورد استفاده از ابزارها کاملا موافقم و DataAwareها رو هم حیلی دوست دارم (و به نظرم حرفه‌ای هم هستند).

اما:

برخی از دوستان در استفاده از این روش (یعنی update با یک DataSet که یک select داره) زیاده‌روی میکنن. ببینید، در این روش میانبر درست کردن دستورات INSERT یا DELETE رو به عهده ADO قرار میدیم و خودمون نمینویسیم. وقتی که داریم با همون داده‌ها کار میکنیم، چون مشکل requery رو حل میکنه کاملا قابل توجیه هست اما اگر همینطوری بخواهیم یک داده‌ای رو بهنگام کنیم، حتما استفاده از ADOCommand و اجرای درست و حسابی دستورات (احیانا با پارامترهای مناسب) روش بسیار بهتری است و استفاده از ADODataSet در اون کاربردها هیچ درست نیست.

ارادت فراوان

mehrdad196
دوشنبه 19 آذر 1386, 14:16 عصر
از همه دوستان ممنونم . مشکل حل شد

ELABAA
چهارشنبه 18 دی 1387, 20:06 عصر
3. بهترین روش اینه که با یک ADODataSet داده‌ها رو بازنمایی کنید و با یک ADOCOmmand هم دستور رو اجرا کنید. پس از اجرای دستور، ADODataSet رو دوباره OPen کنید.

4. یک راه میان بر هم هست که من خودم اصلا دوست ندارم ولی اگه پروژه خیلی حساس نباشه میشه ازش استفاده کرد: از یک ADODataSet استفاده کنید و اصلاحات (و مثلا همون insert) را با متدهای اون بنویسید - اینجوری هم در db اعمال میشه و هم در dataset

ارادت[/quote]


سلام دوست عزیز من با ADODataSet دستور insert رو به شکل زیر نوشتم ولی دستوری insert نمیشه خطایی هم بهم نمیده :

ADOdataset1.Close;
ADOdataset1.CommandText:='INSERT INTO d_calleg([name],[code])
values ('+QuotedStr(Edit1.Text)+','+QuotedStr(Edit2.Text) +')';
adocommand1.Execute;



میشه راهنمایی ام کنین که باید چیکار کنم ؟؟؟

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

ایرادت

rezazd
یک شنبه 22 دی 1387, 13:10 عصر
سلام دوستان
وقتی با ADOQuery یک insert را اجرا می کنم , نتیجه را همان موقع و در همان فرم نمی توانم مشاهده کنم و حتماً باید فرم بسته بشه و دوباره باز بشه که اطلاعات بروز شوند .
در واقع یک طوری باید اطلاعات Update شود . اگر کسی می دونه لطف کنه بگه چطوری اطلاعات رو می شه با کد update کرد
من با delphi7 و sqlserver2000 و با adoconnection به پایگاه متصل می شم.
اینم کد :


var
s:string
begin
s := 'insert into Users (name) values ('+ QuotedStr(nameEdit.Text) + ')';
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(str);
ADOQuery1.ExecSQL;
end;

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

مشکل اینجاست که در کامپیوتری دیگر بدون رفرش چگونه رکورد جدید اتو ماتیک دیده میشود ؟

شما در اپلیکشین ایونت یه کد با تایمر میذارید که هی یک جدولی فرعی را بخواند
در جدول های اصلی با تریگر هر تغییری را در این جدول اینسرت میکنید شامل نام جدول تغییر یافته باشد .
در اپلیکشین ایونت می تونید ببینید کودوم فرم الان باز است و بسته به اونفرم یک مسیج با کمک winproc میفرستید
در متن همهفرمها به محض دریافت این مسیج کوئری مربوطه را رفرش کنید یا همون کلوز
اوپن

موفق باشید