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)
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.