PDA

View Full Version : مشکل در آپدیت دیتابیس از دلفی



Delphi7_love
پنج شنبه 14 اسفند 1393, 10:01 صبح
با سلام
من یه نرم افزار دارم که حدودا به 50 نفر فروختمش و مدام نرم افزار در حال تغییره - حالا هر وقت بخوام سیستم مشتری آپدیت کنم درد سر داره و باید خودم برم بانکشونو آپدیت کنم حالا میخوام اسکریپت تغییرات رو داخل فایل exe بذارم و خودش تغییرات رو اعمال کنه
حالا مشکل من اینه که وقتی میخوام اسکریپتو در دلفی اجرا کنم خطا میگیره
یعنی من یه اسکریپت هم از طریق خود اسکیوال تهیه میکنم که اونو هم خطا میگیره
دوستان خواهش میکنم راهنمایی بفرمایید
البته داخل سایت هم به صورت پرداکنده بحث شده ولی نتیجه مطلوبی نداشته

یوسف زالی
پنج شنبه 14 اسفند 1393, 13:12 عصر
سلام.
اسکریپتی که در ADO ران می کنید دقیقا قوانین اس کیو ال رو رعایت نمی کنه.
باید دستورات معادلش رو استفاده کنید.
Go رو بردارید.
Use رو بردارید.
With CTE رو جایگزین کنید.
Assignment On Declare استفاده نکنید.
و ...

benyaminrahimi
پنج شنبه 14 اسفند 1393, 16:17 عصر
تو سری devart unidac کامپوننتی تحت عنوان uni script هست که عملا هر اسکریپتی رو اجرا میکنه

یوسف زالی
پنج شنبه 14 اسفند 1393, 22:23 عصر
این کامپوننت رو با دستوراتی شبیه with CTE یا تعریف و انتساب مستقیم متغیر تست کردید؟
declare @x int = 5

benyaminrahimi
جمعه 15 اسفند 1393, 11:28 صبح
بله خودمون تو نرم افزارمون استفاده کردیم البته اگه نخواین از کامپوننت استفاده کنید میتونید از osql استفاده کنید



procedure tpatern.runsql_ref(aase, aadb, aau, aap, aafile, aarep: string);
var
ase, adb, au, ap, af, arep, arepf: string;


begin


arepf := arep;
DeleteFile(pchar(arepf));


arep := ' -o ' + aarep + ' -u ';
ase := ' -S ' + aase;
adb := ' -d ' + aadb;
au := ' -U ' + aau;
ap := ' -P ' + aap;
af := ' -i ' + aafile;
ShellExecute(Handle, 'open', 'cmd.exe', pchar('/C osql '
+ ase + au + ap + adb + af + arep), nil, SW_HIDE);


end;

Delphi7_love
جمعه 15 اسفند 1393, 11:39 صبح
بله خودمون تو نرم افزارمون استفاده کردیم البته اگه نخواین از کامپوننت استفاده کنید میتونید از osql استفاده کنید



procedure tpatern.runsql_ref(aase, aadb, aau, aap, aafile, aarep: string);
var
ase, adb, au, ap, af, arep, arepf: string;


begin


arepf := arep;
DeleteFile(pchar(arepf));


arep := ' -o ' + aarep + ' -u ';
ase := ' -S ' + aase;
adb := ' -d ' + aadb;
au := ' -U ' + aau;
ap := ' -P ' + aap;
af := ' -i ' + aafile;
ShellExecute(Handle, 'open', 'cmd.exe', pchar('/C osql '
+ ase + au + ap + adb + af + arep), nil, SW_HIDE);


end;


از پاسختون ممنونم
میشه بفرمایید پارامترهای ورودی چی هستند ؟ لطفا با ذکر مثال
واینکه کدوم روش بهتره
بازهم تشکر

benyaminrahimi
جمعه 15 اسفند 1393, 11:43 صبح
aase, سرور مثلا 192.168.01.1
aadb, دیتابیس
aau, نام کاربر اسکیو ال
aap, پس ورد اسکیو ال
aafile, فایل حاوی اسکریپتا
aarep فایلی که نتیجه اجرای دستورات ایجاد خواهد شد

فرقی ندارند روش ها بسته به کاربرد باید انتخاب کرد

یوسف زالی
جمعه 15 اسفند 1393, 11:46 صبح
OSQL رو باید روی سرور ران کرد، البته تا جایی که من یادمه.
روی کلاینت نمی شه.
کامپوننت خوبی باید باشه. فقط با SQL DBMS می تونه کار کنه یا این که مثلا Oracle یا Access رو هم می شناسه؟

benyaminrahimi
جمعه 15 اسفند 1393, 11:50 صبح
osql تا جایی که من تست کردم هم روی سرور ران میشه و هم کلاینت ... unidac همه پرو وایدر ها رو داره my sql , sql server , .....ibm ...acsess برای هر دیتابیس یه کامپوننت پرو وایدیر داره البته همین شرکت کامپونتی تحت عنوان sdac داره که خاصه sql سروره ولی من پیشنهاد میکنم از unidac استفاده کنید چون devart روی این محصول بیشتر از sdac تمرکز داره

Delphi7_love
جمعه 15 اسفند 1393, 14:48 عصر
با سلام
از پاسختون ممنونم
من اومدم داخل دلفی از سلکت زیر استفاده کردم و یکی یکی بانک مقصد رو آپدیت کردم و فعلا من مشکلی ندیدم و درست آپدیت شد
خواستم نظر شمارو بپرسم که روش خوبیه؟

SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_desc, sm.definition
, CASE o.type_desc WHEN 'VIEW' THEN 0 WHEN 'SQL_STORED_PROCEDURE' THEN 1 WHEN 'SQL_TRIGGER' THEN 2 WHEN 'SQL_SCALAR_FUNCTION' THEN 3 ELSE 4 END AS Id_Type
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
ORDER BY id_type;

benyaminrahimi
جمعه 15 اسفند 1393, 15:47 عصر
خیلی خوبه ولی روشی یه چند مورد داره که بعدا شاید بهش برخورد کنی 1 مسئله وابستگی : تقدم و تاخر در این اجرا دیده نمیشه مثلا قاکنشنی که در یک استورد پروسیجر کال شده باید زود تر اسکریپت شه یا استورد پروسیجری که در استورد پروسیجر دیگه کال شده
2 : مسئبه وجود حتما باید به این بادی اسکریپت و جود داشتن و حذف اضافه بشه که در صورت وجود به آخرین نسخه آپدیت شه 3 : موضوع فیلد ها و تیبل ها و ... قبا از اجرا این کد باید تیبل ها و فیلد های اون آپدیت شده باشه


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

Delphi7_love
دوشنبه 18 اسفند 1393, 22:56 عصر
خیلی خوبه ولی روشی یه چند مورد داره که بعدا شاید بهش برخورد کنی 1 مسئله وابستگی : تقدم و تاخر در این اجرا دیده نمیشه مثلا قاکنشنی که در یک استورد پروسیجر کال شده باید زود تر اسکریپت شه یا استورد پروسیجری که در استورد پروسیجر دیگه کال شده
2 : مسئبه وجود حتما باید به این بادی اسکریپت و جود داشتن و حذف اضافه بشه که در صورت وجود به آخرین نسخه آپدیت شه 3 : موضوع فیلد ها و تیبل ها و ... قبا از اجرا این کد باید تیبل ها و فیلد های اون آپدیت شده باشه


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

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

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