PDA

View Full Version : اجرای کد اسکیوال در دلفی



mahdy.asia
جمعه 19 آبان 1391, 17:20 عصر
من کد اسکیوال را می خواهم در یک ado query در دلفی اجرا کنم اما بعضی از دستورات رو نمی شناسه مثل دستور "Go" و کامنت ها
نمونه کد:

/*
2012/11/0905:47:38 ب.ظ
User: sa
Server: nic\sql2008
Database: PmNicDbYazd
Application:
*/

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_aaa
(
srl int NOT NULL,
a int NOT NULL,
b int NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_aaa SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.aaa)
EXEC('INSERT INTO dbo.Tmp_aaa (srl, a, b)
SELECT srl, a, b FROM dbo.aaa WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.aaa
GO
EXECUTE sp_rename N'dbo.Tmp_aaa', N'aaa', 'OBJECT'
GO
ALTER TABLE dbo.aaa ADD CONSTRAINT
PK_aaa PRIMARY KEY CLUSTERED
(
srl
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT

حمیدرضاصادقیان
جمعه 19 آبان 1391, 21:47 عصر
سلام
به این شکل که مشکلی نداره.
به جای ADO Query نیز میتوانید از مجموعه SDAC استفاده کنید و از SQL Script استفاده کرده و دستورات مورد نظر رو اجرا کنید.

mahdy.asia
یک شنبه 21 آبان 1391, 16:59 عصر
به این شکل که مشکلی نداره.اما من با adoQuery که نتونستم اجرا کنم همانطور که گفتم کلمات کلیدی GO و کامنت ها را مجبور شدم بردارم شاید تنظیمات خاصی هم نیاز داره ضمنا من توی دلفی 7 کار می کنم حالا با SDAC هم امتحان می کنم

mahdy.asia
چهارشنبه 24 آبان 1391, 21:03 عصر
مجموعه مجموعه SDAC تودلفی 7 وجود داره یا باید اون رو تهیه کرد و نصب نمود؟

حمیدرضاصادقیان
چهارشنبه 24 آبان 1391, 21:33 عصر
خیر مجموعه جداگانه ای هست که باید تهیه کرده و نصب کنید.

mahdy.asia
چهارشنبه 04 بهمن 1391, 18:52 عصر
من هنوز در مورد دستور GO در کوئری هایی که از داخل دلفی با AdoQuery می خواهم اجرا کنم با مشکل مواجه هستم آیا برای اجرای این دستور کار خاصی می بایست انجام دهم لطفا راهنمایی کنید

male_violet
یک شنبه 08 بهمن 1391, 10:06 صبح
با دستور go نمی خواد خود query رو excute کن adoquery1.excute

mahdy.asia
شنبه 05 مرداد 1392, 22:10 عصر
با دستور go نمی خواد خود query رو excute کن adoquery1.excute بعضی از کلمات کلیدی اسکیوال نظیر GO در ado Query قابل اجرا نیست و در صورتی که در کد اسکیوال وجود داشته باشد نمی توان ado Query را execute کرد (خطا می دهد).
آیا از کامپوننت های استاندارد دیگر دلفی XE2 می تونم استفاده کنم و مشکلم را حل نمایم؟
من نتونستم sdac را برای دلفی xe2 پیدا کنم

یوسف زالی
شنبه 05 مرداد 1392, 22:53 عصر
بهترین کار برای انجام چنین کارهایی استفاده از SP است.
در ضمن دلیل وجود اون GO اینه که SQL تشخیص بده که تا کجا رو جدا جدا ران کنه.
در جقیقت اون GO فقط حکم یک Delimiter رو داره نه بیشتر و اصلا دستور TSQL نیست. شما می تونید از تنظیمات SQL اون رو مثلا به Havij تغییر بدید.
برای ران شدنش هم در دلفی باید دستوراتتون رو تا GO جدا کنید و هر کدوم رو جدا ران کنید.
موفق باشید.

mahdy.asia
یک شنبه 06 مرداد 1392, 02:16 صبح
برای ران شدنش هم در دلفی باید دستوراتتون رو تا GO جدا کنید و هر کدوم رو جدا ران کنید.
اول اینکه من یکسری کدهای دارم که نمی تونم از طریق پروسیجر اجرا کنم (برای اصلاح خطاهای سیستم فایل اسکیوال رو می خوام از طریق برنامه کاربرم اجرا کنه)
دوم اینکه GO رو باید بنویسم چون که مثلا اگر فیلد جدول رو تغییر بدم و خواسته باشم مقدار دهی کنم می بایست بین تغییر و مقدار دهی GO نوشته بشه تا جدول بروز باشه جهت مقدار دهی فیلد مورد نظر
سوم اینکه بعضی کدهای دیگه رو هم گیر می ده
از همراهی شما در این تاپیک متشکرم

benyaminrahimi
یک شنبه 06 مرداد 1392, 08:54 صبح
اگر از مجموعه sdac یا unidac استفاده کنید با این کد میتونید هر چی خواستینو اجرا کنید.



procedure tpatern.runsql(acon: TUniConnection; afile: WideString);

var
scer: TUniScript;
i: Integer;
begin

if acon.Connected = false then
raiser('اتصال برقرار نيست');
runner.Connection := acon;
runner.SQL.Clear;
runner.SQL.LoadFromFile(afile);
Application.ProcessMessages;
runner.Execute;
Application.ProcessMessages;
end;

یوسف زالی
یک شنبه 06 مرداد 1392, 09:26 صبح
دلیل اون GO رو توضیح دادم.
می تونید با نوشتن یک Splitter ساده کوئری تون رو تکه تکه کنید و ران کنید.
اتفاقا چند وقت پیش یک همچین چیزی نوشتم،


procedure SplitText(Text, Delimiter: string; Ret: TStrings);
var
prev, next: integer;
begin
if not Assigned(Ret) then
Exit;

Ret.Clear;

prev := 1;
repeat
next := PosEx(Delimiter, Text, prev);
if next = 0 then
Break;

Ret.Add(Copy(Text, prev, next -prev));
prev := next +length(Delimiter);
until false;
end;


کدتون رو به یک همچین پروسیجری بفرستید تا در خروجی در قالب یک لیست بهتون تکه تکه کنه بده، بعد با یک حلقه ساده تمام خطوط رو ران کنید.
دلیل اینکه دلفی تمام دستورات اس کیو ال رو شامل نمی شه برمی گرده به ساختار درونی اس کیو ال استاندارد پیاده شده در خود دلفی، نه DBMS ی که دارید بهش کانکت می شید.
البته اون هم باید ساپورت کنه، ولی هر چی که ساپورت می کنه رو دلفی نداره. مثلا همین With یا For XML یا ...
البته اطلاعات من هم تا همین حده و هیچ وقت بیشتر از این تو عمق مطلب لازم نبوده که برم :لبخند: (لبخند گشاده هیستریک)

به هر حال امیدوارم این مطلب بهتون کمک کرده باشه.
موفق باشید.

ho.yasreby
شنبه 12 مرداد 1392, 14:36 عصر
بهترین کار برای انجام چنین کارهایی استفاده از SP است.
در ضمن دلیل وجود اون GO اینه که SQL تشخیص بده که تا کجا رو جدا جدا ران کنه.
در جقیقت اون GO فقط حکم یک Delimiter رو داره نه بیشتر و اصلا دستور TSQL نیست. شما می تونید از تنظیمات SQL اون رو مثلا به Havij تغییر بدید.
برای ران شدنش هم در دلفی باید دستوراتتون رو تا GO جدا کنید و هر کدوم رو جدا ران کنید.
موفق باشید.
سلام این sp چیه که می فرمایید

یوسف زالی
شنبه 12 مرداد 1392, 16:13 عصر
Stored Procedure در SQL

ho.yasreby
شنبه 12 مرداد 1392, 19:21 عصر
میشه دقیق تر راهنمایی کنید من از دلفی xe4 استفاده میکنم

یوسف زالی
یک شنبه 13 مرداد 1392, 02:08 صبح
عرض کردم که در اس کیو ال نه دلفی.
با شی ADOStoredPtoc بهش متصل می شن.

ho.yasreby
یک شنبه 13 مرداد 1392, 04:22 صبح
از راهنمایییتون ممنون
چیز جدید یادگرفتم که خیلی کاربرد داره ولی آیا میشه با ADOSTOREPROCEDURE که به گرید وصل کردیم به کاربر اجازه تغییرات در بانک رو بدیم
یعنی وقتی کاربر یک رکورد رو تغییر داد اتوماتیک در بانک تغییرات ثبت بشه
مثل حالتی که ADOTABLE رو به گرید وصل کردیم

یوسف زالی
یک شنبه 13 مرداد 1392, 05:23 صبح
بله می شه. اما روش درستی نیستو بهتره برای تغییرات هم از یک اس پی جدا استفاده بشه.

ho.yasreby
دوشنبه 21 مرداد 1392, 21:12 عصر
حالا مشکل جدید پیدا شده
وقتی پروسیجر رو درست میکنم و دستور فیلترینگ زیر رو بهش میدم فقط با کاراکتر اول فیلتر میکنه و بقیه رو ندید میگیره



select * from moshtari where namemoshtari like '%'+@Moshtari+'%

مثلا اگر در جدولم رکورد شامل لغات کتاب و کباب و کریم را داشته باشیم و کاربر حرف ک رو بزنه حالا حرف بعدی هر چی میخواد باشه همه رو نشون میده

ho.yasreby
سه شنبه 29 مرداد 1392, 19:39 عصر
حالا مشکل جدید پیدا شده
وقتی پروسیجر رو درست میکنم و دستور فیلترینگ زیر رو بهش میدم فقط با کاراکتر اول فیلتر میکنه و بقیه رو ندید میگیره



select * from moshtari where namemoshtari like '%'+@Moshtari+'%

مثلا اگر در جدولم رکورد شامل لغات کتاب و کباب و کریم را داشته باشیم و کاربر حرف ک رو بزنه حالا حرف بعدی هر چی میخواد باشه همه رو نشون میده
کسی جواب نداشت

ho.yasreby
دوشنبه 04 شهریور 1392, 16:32 عصر
select*from moshtari where namemoshtari like'%'+@Moshtari+'%
Please
Please
Please
Please

یوسف زالی
جمعه 29 شهریور 1392, 15:55 عصر
اون کلمات رو بردار عزیز من، خوب نیست.
این که فقط اول کلمات رو میاره احتمالا به جایی بستگی داره که کدتون رو قرار دادید.
نمونه کد رو بگذارید.

ho.yasreby
دوشنبه 01 مهر 1392, 17:17 عصر
مجبور شدم خیلی وقته منتظرم و کارم بدجوری گیر کرده
این برنامه رو دقیقاً با دیتابیس اکسس نوشتم درست کار میکنه ولی وقتی با sql مینویسم به اسپیس و .... گیر میده از شما راهنمایی گرفتم فرمودید sp تحقیق کردم و انجام دادم حالا به این مشکل خوردم که عرض شد
نمونه کد کامل


procedure TForm8.Edit1Change(Sender: TObject);
begin
ADOStoredProc1.Close;
ADOStoredProc1.Parameters[1].Value:=edit1.Text;
ADOStoredProc1.Open;
end;

sp به شکل زیر است



USE [Henaras]
GO
/****** Object: StoredProcedure [dbo].[filtermoshtari] Script Date: 2013/09/23 05:54:10 ب.ظ ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[filtermoshtari]
@Moshtari char
as
select * from moshtari where namemoshtari like '%'+ @Moshtari+'%'

یوسف زالی
دوشنبه 01 مهر 1392, 20:03 عصر
دلیلش اینه:


@Moshtari char

باید طولش رو معین کنید. مثلا این:


@Moshtari varchar(1000)

fahimi
دوشنبه 01 مهر 1392, 20:04 عصر
با سلام
من هم تقریبا چنین مشکلی را داشتم یعنی بایستی چند کلمه را مانند گوگل پیدا می کردم من با استفاده از امکان Full-Text Search در Sqlserver 2008 حل کردم
توصیه می کنم Full-Text Search جستجو کنید.امکانات فوق العاده قوی را دارد