PDA

View Full Version : امکان خواندن دستورات SQL از درون فایل



_alish_
دوشنبه 05 شهریور 1386, 09:03 صبح
با سلام و احترام خدمت دوستان و اساتید محترم
امکان اینکه از یک برنامه به SQLServer دستوری داده شود که دستورات SQL درون یک فایل متنی را اجرا نماید وجود دارد ؟ و چگونه؟
همینطور بدلایلی امکان شبیه سازی SP از درون فایل متنی امکانپذیر است؟ نمی خواهم SP در SQLServer بنویس بلکه می خواهم طوری برنامه بنویسم که با دستوری از برنامه یک فایل متنی به همراه پارامتر به SQLServer فرستاده و اون هم(SQLSever) پارامترها را در متن فایل جایگزین و مانند SP اجرا نماید.(شاید عجیب باشد ولی خوب نیازی است دیگه)

حمیدرضاصادقیان
دوشنبه 05 شهریور 1386, 10:22 صبح
بله .شما میتونی داخل یک فایل با پسوند sql بنویسید و با دستور osql اون رو اجرا کنید. ولی اینکه چطور پارامتر به اون پاس کنید اطلاعی ندارم.

JavanSoft
دوشنبه 05 شهریور 1386, 10:22 صبح
همه چیز امکان پذیر است . آیا نیاز خود را بایک مثال می توانید عنوان کنید

_alish_
دوشنبه 05 شهریور 1386, 11:00 صبح
با سلام و تشکر مجدد از دوستان
صورت مساله یک پویایی خاصی داشته و نیاز به همفکری دوستان می باشد،
فرضا متن یک SQL در فایل متنی وجود داشته که نیاز به دو پارامتر(حالا امکان دارد نوع های مختلفی باشد) مثلا لیست افرادی که نام آنها علی و حقوقشان بالای صد هزار ریال می باشد .
حال دستورات SQL در فایل SlectSalery.sql و پارامترها از برنامه به SQLServer فرستاده می شود.
حالا سختی مساله یا همان پرتقال فروش:
چطوری نوع ها تشخیص داده شود؟
چطور در دستور SQL درون فایل از طریق SQLServer جایگزین گردد؟
دوستمان هم دستور osql را پیشنهاد کردند که هنوز امتحانش نکردم(ممنون)

JavanSoft
دوشنبه 05 شهریور 1386, 11:16 صبح
من برای حل این نوع مسائل اینترپرتر 4 نوع اسکریپت را تولید کردم که کار هریک متفاوت است .
هسته هر یک از این نوع ها با یکدیگر متفاوت است اما کدی که برایتان میگذارم شاید بتواند تا حدودی مشکل شما را حل کند

البته تذکر می دهم که این کد برای شما قابل استفاده نیست و فقط می توانید از آن ایده بگیرید



//=================---------------- تشخیص پارامترها -------------======================
VarList:=TStringList.Create;
TitleList:=TStringList.Create;
CommandsList:=TStringList.Create;
AnswersList:=TStringList.Create;
CommandsKind:=TStringList.Create;
RepName:=AMemo[0];
AMemo.Delete(0);
I:=0;
While AMemo[I]<>'+' Do
Begin
St:=AMemo[I];
VarList.Add(Copy(St,1,Pos(';',St)-1)); // متغیر
Delete(St,1,Pos(';',St));
TitleList.Add(Copy(St,1,Pos(';',St)-1)); //تیتر
Delete(St,1,Pos(';',St));
CommandsList.Add(Copy(St,1,Pos(';',St)-1)); //دستور
Delete(St,1,Pos(';',St));
CommandsKind.Add(Copy(St,1,Pos(';',St)-1)); //نوع دستور
Inc(I);
End;
For J:=0 To I Do
AMemo.Delete(0);
If I>0 Then
Begin
Application.CreateForm(TScriptParametersForm, ScriptParametersForm);
With TdxButton.Create(ScriptParametersForm) Do
Begin
Name:='OkBut';
Left := 0;
Top := 0;
Caption:= 'قبول';
Parent:=ScriptParametersForm;
OnClick:=CheckValue;
End;
With TdxButton.Create(ScriptParametersForm) Do
Begin
Name:='CancelBut';
Left := 0;
Top := 24;
Caption := 'انصراف';
ModalResult:=mrCancel;
Parent:=ScriptParametersForm;
End;
For J:=0 To I-1 Do
Begin
//کومبو با مقادیر دریافتی از دستور اسکیوال
If CommandsKind[J]='1' Then
Begin
DMReports.QValueList.Close;
DMReports.QValueList.SQL.Text:=CommandsList[J];
DMReports.QValueList.Open;
With TComboBox.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 120;
Height := 21;
Parent:=ScriptParametersForm;
Style:=csOwnerDrawFixed;
Text:='';
Tag:=J;
Name:='Combo'+IntToStr(J);
End;
With TLabel.Create(ScriptParametersForm) Do
Begin
Top := J*30;
Width := 121;
Height := 21;
AutoSize:=True;
BiDiMode:=bdRightToLeft;
Parent:=ScriptParametersForm;
Caption :=TitleList[J];
Left := 200;
End;
While Not DMReports.QValueList.Eof Do
Begin
TComboBox(ScriptParametersForm.FindComponent('Comb o'+IntToStr(J))).Items.Add(DMReports.QValueList.Fi eldByName('Res').AsString);
DMReports.QValueList.Next;
End;
End;
// ادیت ساده
If CommandsKind[J]='2' Then
Begin
With TLabeledEdit.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 121;
Height := 21;
EditLabel.BiDiMode := bdRightToLeft;
EditLabel.Caption :=TitleList[J];
EditLabel.Width := 61;
EditLabel.Height := 13;
LabelPosition := lpRight;
Parent:=ScriptParametersForm;
Text:=CommandsList[J];
Tag:=J;
End;
End;
// کومبو با مقادیرثابت
If CommandsKind[J]='3' Then
Begin
With TComboBox.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 120;
Height := 21;
Parent:=ScriptParametersForm;
Style:=csOwnerDrawFixed;
Text:='';
Tag:=J;
Name:='Combo'+IntToStr(J);
End;
With TLabel.Create(ScriptParametersForm) Do
Begin
Top := J*30;
Width := 121;
Height := 21;
AutoSize:=True;
BiDiMode:=bdRightToLeft;
Parent:=ScriptParametersForm;
Caption :=TitleList[J];
Left := 200;
End;
St:=CommandsList[J];
While Pos('~',St) <>0 Do
Begin
TComboBox(ScriptParametersForm.FindComponent('Comb o'+IntToStr(J))).Items.Add(Copy(St,1,Pos('~',St)-1));
Delete(St,1,Pos('~',St));
End;
End;
// ادیت دریافت تاریخ
If CommandsKind[J]='4' Then
Begin
With TLabeledEdit.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 121;
Height := 21;
EditLabel.BiDiMode := bdRightToLeft;
EditLabel.Caption :=TitleList[J];
EditLabel.Width := 61;
EditLabel.Height := 13;
LabelPosition := lpRight;
Parent:=ScriptParametersForm;
Tag:=J;
OnDblClick:=GetDateValueInParameters;
End;
End;
// ادیت دریافت مقدار تاریخ انگلیسی معادل تاریخ فارسی بصورت مخفی
If CommandsKind[J]='5' Then
Begin
With TLabeledEdit.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 121;
Height := 21;
EditLabel.BiDiMode := bdRightToLeft;
EditLabel.Caption :=TitleList[J];
EditLabel.Width := 61;
EditLabel.Height := 13;
LabelPosition := lpRight;
Parent:=ScriptParametersForm;
Tag:=J;
Text:='';
Visible:=False;
End;
End;
// ادیت دریافت تاریخ فارسی اما جواب انگلیسی
If CommandsKind[J]='6' Then
Begin
With TLabeledEdit.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 121;
Height := 21;
EditLabel.BiDiMode := bdRightToLeft;
EditLabel.Caption :=TitleList[J];
EditLabel.Width := 61;
EditLabel.Height := 13;
LabelPosition := lpRight;
Parent:=ScriptParametersForm;
Tag:=J;
OnDblClick:=GetDateValueInParameters;
End;
End;
// ادیت دریافت مقدار خوانده شده از فایل پیش فرضها
If CommandsKind[J]='7' Then
Begin
With TLabeledEdit.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 121;
Height := 21;
EditLabel.BiDiMode := bdRightToLeft;
EditLabel.Caption :=TitleList[J];
EditLabel.Width := 61;
EditLabel.Height := 13;
LabelPosition := lpRight;
Parent:=ScriptParametersForm;
Tag:=J;
Tools.ReadInformation('',TitleList[J],St); //روز
If St='NOTANSWER' Then
Begin
Tools.ShowMsg(St+#13+'در فایل پیش فرضها پیدا نشد. از برنامه خارج شوید و دوباره به گزارش برگردید.' );
Exit;
End;
Text:=St;
Enabled:=False;
End;
End;
// محاسبه Nروز قبل از تاریخ فارسی وارد شده
If CommandsKind[J]='8' Then
Begin
With TLabeledEdit.Create(ScriptParametersForm) Do
Begin
Left := 80;
Top := J*30;
Width := 121;
Height := 21;
EditLabel.BiDiMode := bdRightToLeft;
EditLabel.Caption :=TitleList[J];
EditLabel.Width := 61;
EditLabel.Height := 13;
LabelPosition := lpRight;
Parent:=ScriptParametersForm;
Tag:=J;
Text:='';
Visible:=False;
End;
End;
End;
If ScriptParametersForm.ShowModal<>MrOk Then
Begin
ScriptParametersForm.Free;
Exit;
End;

AnswersList.Clear;
For J:=0 To I-1 Do
AnswersList.Add('');
For J:=0 To I-1 Do
Begin
For K:=0 To ScriptParametersForm.ComponentCount-1 Do
Begin
If ScriptParametersForm.Components[K] Is TComboBox Then
If TComboBox(ScriptParametersForm.Components[K]).Tag=J Then
AnswersList[J]:=TComboBox(ScriptParametersForm.Components[K]).Text;
If ScriptParametersForm.Components[K] Is TLabeledEdit Then
If TLabeledEdit(ScriptParametersForm.Components[K]).Tag=J Then
Begin
IDidIt:=False;
If CommandsKind[J]='6' Then
Begin
ComputeDis(TLabeledEdit(ScriptParametersForm.Compo nents[K]).Text);
St:=Tools.ToEnglishDate(TLabeledEdit(ScriptParamet ersForm.Components[K]).Text);
St:=Tools.ConvertDateFormat(St,'D/M/Y','Y/M/D');
AnswersList[J]:=St;
IDidIt:=True;
End;
If (CommandsKind[J]='5')And(Not IDidIt) Then
Begin
Pos1:=VarList.IndexOf(CommandsList[J]);
St:=Tools.ToEnglishDate(AnswersList[Pos1]);
St:=Tools.ConvertDateFormat(St,'D/M/Y','Y/M/D');
AnswersList[J]:=St;
IDidIt:=True;
End;
If (CommandsKind[J]='8')And(Not IDidIt) Then
Begin
Pos1:=VarList.IndexOf(TitleList[J]);
Pos2:=VarList.IndexOf(CommandsList[J]);
AnswersList[J]:=QuotedStr(Tools.NDayFromDate(AnswersList[Pos2],-1*StrToInt(AnswersList[Pos1])));
IDidIt:=True;
End;
If (CommandsKind[J]='4')And(Not IDidIt) Then
ComputeDis(TLabeledEdit(ScriptParametersForm.Compo nents[K]).Text);
If Not IDidIt Then
AnswersList[J]:=TLabeledEdit(ScriptParametersForm.Components[K]).Text;
End
End;
End;
End;
AMemo.SaveToFile('C:\Temp.Txt');

//=================---------------- تشخیص پارامترها -------------======================
If Tools.IsViewExist('JRBTempView') Then
Tools.ExecSql('Drop View JRBTempView');

ComputeDis(Tools.FarsiToday);
DMReports.QAskJRB.SQL.Clear;
// ------------------------------------------------------------------
// ---------------------------- VIEW ------------------------------
// ------------------------------------------------------------------
// در تاریخ 1384/04/08 برای چند ویو تغییر یافت
HaveNextView:=False;
NextView :
AMemo.SaveToFile('c:\BeforVeiw.txt');
St:=AMemo[0];
While (St[1]<>'+') And (St[1]<>'~')Do
Begin
DMReports.QAskJRB.SQL.Add(AMemo[0]);
NextLine :
AMemo.Delete(0);
If AMemo.Count=0 Then
Break;
St:=AMemo[0];
If Length(St)=0 Then
Begin
St:=' ';
GoTo NextLine;
End;
End;
HaveNextView:=False;
If St[1]='~' Then
HaveNextView:=True;
St:=DMReports.QAskJRB.SQL.Text;
For J:=0 To AnswersList.Count-1 Do
If Pos(':'+VarList[J],St)<>0 Then
Begin
While Pos(':'+VarList[J],St)<>0 Do
St:=Copy(St,1,Pos(':'+VarList[J],St)-1)+QuotedStr(AnswersList[J])+
Copy(St,Pos(':'+VarList[J],St)+Length(':'+VarList[J]),10000);
DMReports.QAskJRB.SQL.Text:=St;
End;
DMReports.QAskJRB.SQL.SaveToFile('C:\JFSQL.Txt');
If Copy(UpperCase(Trim(St)),1,4)='DROP' Then
Try
DMReports.QAskJRB.Execute;
Except
End
Else
DMReports.QAskJRB.Execute;
If HaveNextView Then
Begin
AMemo.Delete(0); /// Delete ~
DMReports.QAskJRB.SQL.Clear;
GoTo NextView;
End;
AMemo.Delete(0); // Delete +

Edit1.Text:='';
DMReports.QAskJRB.SQL.Clear;
// ------------------------------------------------------------------
// ------------------------------Sql---------------------------------
// ------------------------------------------------------------------
For I:=0 To AMemo.Count-1 Do
Edit1.Text:=Edit1.Text+AMemo[I];
DMReports.QAskJRB.SQL.Text:=Edit1.Text;
If AnswersList.Count>0 Then
For J:=0 To AnswersList.Count-1 Do
If DMReports.QAskJRB.FindParam(VarList[J])<>Nil Then
DMReports.QAskJRB.ParamByName(VarList[J]).AsString:=AnswersList[J];
DMReports.QAskJRB.SQL.SaveToFile('C:\TempJF3.Txt') ;
DMReports.QAskJRB.Open;
// حالا باید از خروجی تولید شده توسط SQL به FR3 داد
If DMReports.QAskJRB.RecordCount=0 Then
Begin
Tools.ShowMsg('با پارامترهای داده شده هیچ اطلاعاتی یافت نشد');
Exit;
End;

_alish_
سه شنبه 06 شهریور 1386, 09:22 صبح
متشکرم آقای وکیلی
بیشتر می خواستم بدونم آیا می شود از طریق SQLServer مانند یک زبان برنامه نویسی پارامترها را جایگزین کرد ؟ ببخشید یخورده سوالم عجیب است ولی مقتضی زمان و مساله است دیگه!
از سمت برنامه نویسی یا زبانهای دیگر امکانپذیر است ، ولی در مورد SQLServer I don't Know

JavanSoft
سه شنبه 06 شهریور 1386, 09:37 صبح
متاسفانه در مورد محیط اجرا شما هیچ توضیحی نمی دهید
دستور زیر را امتحان کنید


Select * From Table Where Field1=?

_alish_
سه شنبه 06 شهریور 1386, 14:24 عصر
ممنون و معذرت آقای وکیلی
محیط فرقی نداره ، مثلا دلفی ، من همون کار Store Procedure را می خواهم با SQLServer انجام بدم تنها تفاوتش اینه که نمی خوام در دیتابیسم SP ذخیره کنم می خوام در قالب یک فایل باشه، حالا من از دلفی عین فراخوانی SP معمولی تنها پارمتر به همراه آدرس فایلمو به SQLServer ارسال کرده ، و SQLٍُُServer هم عین SP پارامتر و فایل را ترکیب و اجرا نمایید.

پویا
سه شنبه 06 شهریور 1386, 14:36 عصر
اگر این کارو می کنید که متن SP هاتون رو کسی نتونه بخونه می تونید SP رو بوسیله خوده اس کیو ال Encyript کنید

AminSobati
چهارشنبه 07 شهریور 1386, 11:16 صبح
اگر قراره ساخته شدن فایل Script و اجرای اون، هر دو، سمت SQL Server اتفاق بیافته چرا این Script به شکل SP در نیاد؟ اگر اصل نیازتون رو توضیح بدین شاید بهتر باشه

JavanSoft
پنج شنبه 08 شهریور 1386, 10:10 صبح
هن سورسی که براتون گذاشتم همین کاررو انجام می دهد خواهش می کنم یکبار آنرا بخوانید

_alish_
یک شنبه 11 شهریور 1386, 09:30 صبح
دوباره ممنون از دوستان
آقای وکیلی متن برنامه تون را دیدم و متشکر ، شما مفسری در دلفی نوشته و پس از ساخت SQL کامل آنرا در یک فایل بر روی کلاینت ذخیره کرده و در جایی آنرا استفاده می نمایید. راستش من هم از این موضوع استفاده می کنم ، حال چطور بگم عنوانش اشتباست ولی می خوام بدونم می شه یه اینتر پرتری با SQLServer نوشت ؟ ( درسته زیان برنامه نویسی نیست ولی با دستورات نوشت)
ببخشید دوستان می دونید دیگه یه سوال وقتی تو ذهن یه برنامه نویس بیافته ، فکرشو مشغول می کنه دیگه . جناب آقای ثباتی اینو فقط می خواهم بدونم این امکان در SQLServer وجود دارد یا خیر.
(البته راستش یه راه دیگه ای رو رفتم سمت سرور برنامه ای نوشتم که با فراخوانی اون و ارسال پارامترها همان کار اینتر پرتر را انجام می ده و SQL را ساخته بعد به SQLServer جهت اجرا ارجاع می ده مثل یه Engin واسط . Client-> برنامه واسط طرف Server-> دیتا بیس SQLServer)