# پایگاه‌های داده > سایر پایگاه‌های داده > Foxpro >  یادگیری SQL استاندارد با استفاده از SQLite

## rezaTavak

سلام

آیا مایلید با هم SQL استاندارد را بیاموزیم؟

اگر مایل باشید بحثی مانند MySQL می توانیم با هم داشته باشیم و تمام دستورات و توابع و پروسیجرهای SQL را و یا حتی زبان P-SQL را با هم بررسی کنیم؟

آیا از قبل با SQLite که اینروزها دارد جای زیادی باز میکند آشنا بوده اید؟
به نظر شما وقت آن نیست که فراگیری SQL را به طور جدی دنبال کنید؟

خب برای شروع کار ODBC را از http://www.ch-werner.de/sqliteodbc/ دانلود کرده و در صورتیکه یک محیط گرافیکی برای کار می خواهید از اینجا یک GUI گرافیکی دریافت کنید:
http://sqliteadmin.orbmu2k.de/

بعد از دریافت آنها را نصب کنید.

و منتظر پست بعدی باشید.

----------


## rezaTavak

ابتدا خاطر نشان کنم که هدف من یاد دادن استاندارد SQL92 از طریق SQLite است.

یعنی اینکه این مقاله کلی است و برای هر دیتابیس دارای استاندارد فوق معتبر است فقط تغییرات کمی باید بدهید.

مرجع SQL92 : http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt


خب سایت اصلی http://www.sqlite.org/ است که از http://www.sqlite.org/docs.html برای راهنمایی می توانید استفاده کنید.


خب بهتر است دست به کار شویم. من راجع به محیط گرافیکی sqliteadmin چیزی نخواهم گفت آنرا خودتان تست کنید. اما کلیه چیزهایی که می گویم برای نداشتن ابزار فوق است.


خب ابتدا در هر بانک اطلاعاتی که کار میکنید باید دو مورد را به خاطر بسپارید:
۱ - مجوز دسترسی داشته باشید مانند MySQL و SQL Server که کاربر تعریف میکنید اما بانک مورد بحث ما نیاز ندارد.
۲ - یک بانک اطلاعاتی از قبل تعریف شده باشد (جداول نیاز نیست فقط بانک) مثلا شما در mysql همیشه بانک mysql را دارید. خب برای این مورد باید فقط یک فایل خالی ایجاد کنیم. با هر روشی یک فایل خالی در هر جایی خواستید ایجاد کنید. یکی از این روشها در foxpro مانند زیر است:

FUNCTION CreateSQLiteDatabase
    LPARAMETERS lcDatabaseName 
    LOCAL lnFileHandle 
    lnFileHandle = FCREATE(lcDatabaseName) 
    IF lnFileHandle > 0 
        FCLOSE(lnFileHandle) 
        RETURN .T. 
    ELSE 
        RETURN .F. 
    ENDIF  
ENDFUNC  
         
خب با فرستادن نام به این تابع یک فایل خالی ساخته میشود اگر بازگشت .t. بود فایل ساخته شده در غیر اینصورت خیر. مهم نیست پسوند چه چیزی باشد. 

با این تابع یک فایل خالی به اسم c:\db1.db می سازیم.

حال یک ارتباط بین بانک و فاکس می سازیم:

FUNCTION CreateConnectionSQLite 
    LPARAMETERS lcDatabaseName 
    RETURN SQLSTRINGCONNECT("DSN=SQLite3 Datasource;Database="+lcDatabaseName+; 
    ";StepAPI=0;SyncPragma=NORMAL;NoTXN=0;Timeout=1000  00;ShortNames=0;LongNames=0;NoCreat=0;NoWCHAR=0;Lo  adExt=;") 
ENDFUNC  

کار تمام است. حال تک تک دستورات SQL را با هم تست میکنیم:

اولین دستور ساخت جدول است مانند فاکس پرو دستور ساخت به قرار زیر است:
http://www.sqlite.org/lang_createtable.html
توجه کنید هر دیتابیسی انواع مختلفی از داده را پشتیبانی میکند و نوع داده در دیتابیس مشخص است.

----------


## rezaTavak

متاسفانه FOXPRO در ارتباط با بانکهای اطلاعاتی به خوبی عمل نمی کند.

چون تمام کارهایی که در یک بانک قابل انجام است را من توسط جاوا به راحتی انجام می دهم.

بنابراین برای ساخت بانک اطلاعاتی و جداول اطلاعاتی بهتر است از درون خود نرم افزار مدیریت بانک اینکار را انجام دهیم.

اگر کسی راه بهتری دارد در اینجا عنوان کند.

چون SQLite خط دستوری است کار از طریق FOXPRO با فرمان RUN به راحتی قابل انجام است. همچنین در حین نصب ODBC یک شاخه در Program file\SQLite ODBC Driver\ ساخته می شود. که دارای فایلهایی است. مثلا sqlite.exe که مدیریت این نوع دیتابیس است.

آنرا در فاکس پرو با فرمان زیر اجرا کنید:

RUN /n "D:\Program Files\SQLite ODBC Driver\sqlite.exe" "d:\db1.db" "create table tbl1 (cName varchar(20), iId integer);"
پارامتر اول نام فایل اجرایی است که آنرا بسته به مسیر عوض کنید.
پارامتر دوم هم نام بانک اطلاعاتی است که با آن کار میکنید اگر بانک وجود نداشته باشد ساخته خواهد شد.
پارامتر سوم هم دستور SQL است که باید انجام شود.

با این دستور یک جدول اطلاعاتی از داخل فاکس ساخته اید. البته می توانید SQLite را اجرا و از داخل آن نیز بانک را بسازید. اما اینجا هدف من آموزش است و نیازی به ورود به این محیط نمی بینم.

خب دستور اصلی که امروز بررسی کردیم Create Table است اما راجع به آن بیشتر بدانیم.

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

من بقیه دستور را با توجه به توضیحات فوق ادامه می دهم یعنی اینکه فقط روی این دستور مانور می دهیم.

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

یعنی :

create table tbl1 (cname varchar(20));
حال ممکن است بخواهیم که فیلد تهی نباشد:

create table tbl1 (cname varchar(20) not null);
حال ممکن است بخواهیم که بین فاکس و SQLite ارتباط بر قرار کرده و بانکها را به روز کنیم باید یک فیلد PRIMARY داشته باشیم گرچه خود SQLite همیشه یکی می سازد اما شما نیز میتوانید اینکار را انجام دهید.

 create table tbl1 (cname varchar(20) ,id integer primary key);
یا ممکن است بخواهید یک فیلد اتوماتیک اضافه شود:

  create table tbl1 (cname varchar(20) ,id integer autoincrement);
توجه در فاکس پرو برای بروز رسانی جدوال باید حتما یک فیلد Primary key unique  وجود داشته باشد.  )منحصر به فرد(


   create table tbl1 (cname varchar(20) ,id integer primary key unique);
توجه توجه: فقط یک فیلد باید primary key باشد.



اما انواع داده در SQLite:

انواع عددی:
Integer, Float, Real, Numbric
بسته به چیزی که ذخیره می کنید طول متفاوت است.

انواع کاراکتری:
varchar,nvarchar
که در آنها طول نیز باید مشخص باشد مثلا cName varchar(20) طول را 20 عنوان میکنید.

انواع متنی بلند:
Text مانند Memo در فاکس پرو است.

انواع زمان:
time,date,timestamp که خود گویای چیزی که در آن ذخیره میکند می باشد.

نوع برای Object:
BLOB که مانند general در فاکس پرو است.

نوع منطقی:
Boolean که مانند logical در فاکس پرو است.




SQLite محدودیتی در تعداد فیلد ندارد. و همچنین در طول هر رکورد فقط در نگارش 2 داشت که در نگارش 3 هیچ محدودیتی نیست. )جالب است که فاکس پرو 254 فیلد در هر ردیف دارد( 






این دستور میتواند یک جدول موقت هم بسازد با *CREATE* [*TEMP* |* TEMPORARY*]* TABLE * که فقط برای کسی که با آن Connection کار میکند قابل نمایش است و به محض بسته شدن connection آن جدول هم از بین می رود. مانند view یا query.



همچنین می توانید از خروجی یک جدول جدول جدید با دستور select بسازید.

----------


## rezaTavak

_آیا می دانید varchar چه تفاوتی با nvarchar دارد؟_

تفاوت فقط در پشتیبانی از یونیکد است که در nvarcahr انجام میشود و این به مرتب کردن یک فیلد کمک می کند.

----------


## naderigh

اقای توکل ممنون از لطف شما 
لطفا ادامه دهید این موضوع را و اگر لطف کنید این بانک را با فاکس مقایسه فرمائید (از لحاظ امنیت سرعت و مخصوصا برای استفاده کنندگان نیاز به نصب چه امکاناتی میباشد)

----------


## rezaTavak

چشم حتما اما هدف من SQL-92 است نه SQLite چون باید کم کم دیگه دستورات قدیمی را فراموش کنیم.
در مورد SQLite این را بدانیم که یک چیزی در حد فایلهای MDB فقط جدول اطلاعاتی دارد. و چیزی بزرگی مانند MySQL نیست بنابراین با نصب ODBC به تنهایی در فاکس پرو نیاز به چیزی دیگر ندارد.
این روزها بذل توجه بسیاری از برنامه نویسان است بخصوص python که کار را در این زبان اسکریپتی راحت کرده است.


راستی یادم رفته بگم که SQL یک استاندارد ISO هم هست:
ISO/IEC 9075:1992
شماره استانداردی است که من از آن بحث میکنم.



خب ادامه بحث:






بعد از ساخت جدول شما به راحتی می توانید به اطلاعات آن دسترسی داشته باشید.

دو گزینه در فاکس پرو داریم:
۱ - اضافه کردن به یک دیتابیس فاکس و ساختن ویوی راه دور به طور ویژوال که مانند یک جدول فاکس پرو خواهد شد.
۲ - استفاده محض از دستورات SQL

هدف من دومی است چراکه اولی را قبلا در MySQL  توضیح داده ام.


خب برای ارتباط با یک جدول:
ابتدا یک Connection باید ساخته شود.
سپس یک ویو ساخته شود.
FUNCTION CreateConnectionSQLite
در پستهای قبلی اینکار را انجام خواهد داد.  ویک عدد بر می گرداند این عدد دو حالت دارد:
بالاتر از صفر یعنی ارتباط انجام شده و شماره ارتباط که این شماره برای موارد بعدی کاربرد دارد.
منهای یک یعنی به عللی خطا رخ داده است.


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

a=CreateConnectionSQLite("d:\db1.db")
?SQLEXEC(a,"Select ABS(10);")


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

 اگر نتیجه عدد بود یعنی اینکه SQLEXEC به درستی انجام شده است و یک cursor ساخته خواهد شد.


SQLEXEC(a,"select * from tbl1","tbl1")


در اینجا یک cursor با نام tbl1 ساخته می شود.

----------


## rezaTavak

تذکر نکته ای که اکنون به آن رسیدم این است که اگر با SQLiteAdmin بسازید در فاکس خطا ندارید اما از طریق خود sqlite خطا دارید!

----------


## rezaTavak

شما می توانید این مباحث را در MDB هم دنبال کنید پس یک فایل mdb هر جایی که راحتید بسازید. و هر جدولی که خواستید در آن تعریف کنید.

توجه: فیلد primary key باید داشته باشد.

با تابع زیر با بانک ارتباط بر قرار کنید:

FUNCTION CreateConnectionMdb
    LPARAMETERS lcDatabaseName
    RETURN SQLSTRINGCONNECT("DSN=mdb;DBQ="+lcDatabaseName+;
    ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;PWD=a;UID=  admin;")
ENDFUNC 



البته هر طور که خواستید بقیه پارامترها را نیز تنظیم کنید. من فقط دیتابیس را تنظیم می کنم.

و به طریقه زیر مثلا فایل d:\db1.mdb را فرا می خوانم:

a=CreateConnectionMdb("d:\db1.mdb")

که البته ابن فایل قبلا توسط MS Access ایجاد شده است.

----------


## rezaTavak

خب حالا فرض کنیم connection ایجاد شده با نام a طبق توابع فوق. اول تست کنید که a  یک عدد بزرگتر از صفر باشد. (به ازای ساخت هر کانکشن یک عدد اختصاص می یابد. که از یک شروع می شود.)

حالا دستور امروز:

برای اینکه در یک بانک اطلاعاتی اطلاعات وارد شود و مانند append در فاکس از دستور insert into استفاده می شود. که دقت کنید جدول بانکی قابل insert است که دارای فیلد primary باشد.

نمونه اول تمام فیلدها بروز شوند:
فرض کنید دو فیلد id,cName وجود دارد


?SQLEXEC(a,"insert into tbl1 values (1,'k')")

نمونه دوم:
فقط یک فیلد تعیین شود:



?SQLEXEC(a,"insert into tbl1 (cname) values ('k')")








**** میتوانید جداول MDB را هم از داخل فاکس پرو درست کنید همان دستور create table

مثال:

?SQLEXEC(a,"create table tbl2 ( a TEXT(30))")
علامت ? در دستورات فوق بدین معنی است که اگر عدد منهای یک بود خطا رخ داده در غیر اینصورت خطا رخ نداده است.

----------


## naderigh

جناب اقای توکل با سلام و تشکر
شما فرمودید که فاکس در ارتباط با بانکهای اطلاعاتی به خوبی عمل نمی کند  منظورتان چیست
و میخوام بدانم که بین Access و SQLite کدام بهتر است از لحاظ سرعت و امنیت و حجم اطلاعات و شبکه و .....
و چگونه میشود همانند بانکهای خود فاکس use  و brow  و ... در command فاکس برای اینگونه بانکها انجام داد

----------


## javad_1349

**** میتوانید جداول MDB را هم از داخل فاکس پرو درست کنید همان دستور create table

ضمن تشکر از آقای توکل 
برای ایجاد بانک اطلاعاتی درون اکسس پیغام ذیل ظاهر میگردد
Connection handle is invalid
می دهد 
اگر میشود طریقه فراخوانی table را از دورن database اکسس توضیح دهید آیا مثل visual  پس از فراخوانی میشود use کرد یا نه 
 لطفا راهنمایی فرمایید

----------


## rezaTavak

> جناب اقای توکل با سلام و تشکر
> شما فرمودید که فاکس در ارتباط با بانکهای اطلاعاتی به خوبی عمل نمی کند  منظورتان چیست
> و میخوام بدانم که بین Access و SQLite کدام بهتر است از لحاظ سرعت و امنیت و حجم اطلاعات و شبکه و .....
> و چگونه میشود همانند بانکهای خود فاکس use  و brow  و ... در command فاکس برای اینگونه بانکها انجام داد


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

من در جاوا به راحتی همه کار میکنم اما در فاکس خیلی اذیت میکنه.

Access یک دیتابیس سبک است و قابلیت رمز گذاری و... دارد. ساختار پیچیده ای دارد.

(یعنی مانند dbf ساده نیست.) سرعتش در بانک بزرگ کم است. و امنیتش هم خوب نیست.

همینطور دیگر مدلهای مانند paradox,SQLite و...

برای امنیت و سرعت از بانکهای بزرگ استفاده کنید مانند:
MySQL,PostgreSQL,M$SQLServer,Db2,Sybase,Oracle و...


اینجا فقط آموزشی است من برای این این دو را انتخاب کرده ام که بهرحال شما حجم کمی دانلود کنید (یا اصلا دانلود نکنید.)


می توانید از  browse استفاده کنید بعد از فرمان SQLEXEC یک جدول یا بهتر بگوییم یک query مانند خود فاکس بر می گرداند. اما برای update باید از دستوراتی مانند INSERT INTO,UPDATE و... توسط تابع SQLEXEC به بانک داده شود.

use نمیتوانید استفاده کنید چون باید اول Connection ساخته شود و بعد ...

----------


## rezaTavak

> **** میتوانید جداول MDB را هم از داخل فاکس پرو درست کنید همان دستور create table
> 
> ضمن تشکر از آقای توکل 
> برای ایجاد بانک اطلاعاتی درون اکسس پیغام ذیل ظاهر میگردد
> Connection handle is invalid
> می دهد 
> اگر میشود طریقه فراخوانی table را از دورن database اکسس توضیح دهید آیا مثل visual  پس از فراخوانی میشود use کرد یا نه 
>  لطفا راهنمایی فرمایید



خب شما باید از ایجاد شدن کانکشن مطمئن شوید یعنی باید حتما عدد a را مثلا در مثال تست کنید بزرگتر از ۰ با شد.

بعد از کانکت هر کاری می توانید بکنید. مثلا با SQLEXEC می توانید یک کوئری بسازید و اطلاعات را مشاهده کنید. یا ...

پس از فراخوانی use نیست بلکه فقط Remote View  که ممکن است قابل بروز رسانی باشد.

----------


## rezaTavak

اما دستور امروز:

ساده است برای حذف یک جدول از بانک:


DROP TABLE tbl1





اما یک چیز کلی هم بدانید بد نیست.



در SQL Server   می‌توانید چندین بانک داشته باشید که بعد از ایجاد کانکشن به یک بانک می توانید (اگر حق دسترسی داشتید.) به بانکهای دیگر هم دسترسی داشته باشید. در این صورت این قانون کلی را به خاطر بسپارید:
برای دسترسی به یک جدول از بانک ابتدا نام بانک و سپس نام جدول را ذکر کنید.
 یعنی    برای حذف یک جدول در بانکی به نام Personal و جدول   tbl1 مانند زیر باید عمل شود:

DROP TABLE Personal.tbl1


یا برای اضافه کردن رکورد قبل از نام جدول نام بانک را ذکر کنید.






توجه داشته باشید باید مجوز مورد نیاز برای اینکار را داشته باشید.

----------


## rezaTavak

راستی یادم رفت اما از این به بعد تمام دستورات به صورت زیر در فاکس پرو بکار ببرید:


?SQLEXEC(nConnectionNumber,"STATEMENT")


که در آن STATEMENT  دستورات SQL است و nConnectionNumber شماره کانکشن ساخته شده.

----------


## rezaTavak

دوستانی که مباحث را در MS Access دنبال می کنند می توانند از راهنمای D:\Program Files\Microsoft Office\OFFICE11\1033\acmain11.chm

استفاده کنند. البته مشخص است که من Office را در مسیر 
D:\Program Files\Microsoft Office\OFFICE11\

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


اما برای رفتن به یک صفحه در chm ابتدا Internet Explorer  را باز کنید و مثلا آدرس زیر را بزنید:

mk:@MSITStore:D:\Program%20Files\Microsoft%20Offic  e\OFFICE11\1033\acmain11.chm::/html/dasqlcreatetable.htm
 البته باز هم متذکر می شوم مسیر فایل را درست بدهید و فقط از Internet Explorer استفاده کنید.

----------


## rezaTavak

دستور امروز :

شما با دستور replace در فاکس پرو محتویات جداول را عوض می کنید در SQL این دستور به شکل

 UPDATE table SET fields WHERE condition
مثلا فرض کنید که شما می خواهید محتویات یک رکورد را عوض کنید:

UPDATE tbl1 SET cName="reza" WHERE "id=4"
اگر چند فیلد بود بین هر کدام ویرگول بگذارید.

UPDATE tbl1 SET cName="reza",cFamily="tavakol" WHERE "id=4"
شرط WHERE را هر طور صلاح دیدید بگذارید. در اینجا where مانند FOR در دستور REPLACE است. و متاسفانه معادلی برای WHERE,REST هم نداریم. برای ALL هم می توانید از شرط همیشه درست استفاده کنید یا شرط نگذارید.

مثالهایی هم در راهنمای فاکس پرو وجود دارد.

----------


## rezaTavak

چون من همیشه DNS می سازم یادم نبود که نام DNS را ذکر نکنم. برای ارتباط با mdb تابع را به صورت زیر اصلاح کنید:


FUNCTION CreateConnectionMdb
    LPARAMETERS lcDatabaseName
    RETURN SQLSTRINGCONNECT("Driver={Microsoft Access Driver (*.mdb)};DBQ="+lcDatabaseName+;
    ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;PWD=a;UID=  admin;")
ENDFUNC 


برای SQLite


FUNCTION CreateConnectionSQLite
    LPARAMETERS lcDatabaseName
    RETURN SQLSTRINGCONNECT("Driver={SQLite ODBC (UTF-8) Driver};Database="+lcDatabaseName+;
    ";StepAPI=0;SyncPragma=NORMAL;NoTXN=0;Timeout=1000  00;ShortNames=0;LongNames=0;NoCreat=0;NoWCHAR=0;Lo  adExt=;")
ENDFUNC 




همینطور برای SQL server 


DRIVER=SQL Server;SERVER=ُServerName;APP=Microsoft Visual FoxPro;WSID=SRV2;DATABASE=DatabaseName;Trusted_Con  nection=Yes


و...

----------


## rezaTavak

دستور امروز ساده است. برای حذف یک یا چند رکورد :


*DELETE FROM* [_database-name_* .*]_table-name_[*WHERE* _expr_]

که ذر آن رکوردهای حایز شرط پاک خواهند شد. اگر هم شرطی نباشد همه رکوردها پاک خواهند شد.

مثال:
حذف تمام رکوردهای یک جدول:

DELETE FROM  tbl1


حذف تمام کسانی که نام آنها علی است:


*DELETE FROM* _tbl1_*WHERE cName='ali'*

----------


## rezaTavak

امروز پر استفاده ترین دستور Sql را با هم مرور می کنیم یعنی SELECT که از قبل هم کلی با آن کار کرده اید.

در ساده ترین حالت ممکن:

SELECT * FROM tbl1

تمام رکوردهای یک جدول را بر می گرداند. میدانید * معنی کل فیلدها را میدهد. اما ممکن است بانکی مانند SQLite که محدودیتی در تعداد فیلد در هر رکورد ندارد در FOXPRO ایجاد خطا کند. چراکه فاکس پرو فقط ۲۵۴ فیلد در هر رکورد می تواند داشته باشد. 

مثال دوم:

فقط فیلدهایی که مشخص میکنیم:


SELECT cName,cFamily FROM tbl1


فقط فیلدهای cName,cFamily برگشت داده می شود.

یک نکته: در فاکس پرو انتهای هر خط اگر ; سمیکالن باشد ادامه خط در خط بعدی هم دنبال می شود اما اکثر زبانهای SQL از سمیکالن به عنوان پایان خط استفاده میکنند. (مانند زبانها سی و پاسکال و جاوا ) بنابراین دقت کنید در این مورد اشتباه نکنید.

----------


## rezaTavak

*نامهای alias یا مستعار:*

برای دو جدول می توانیم دستوری مانند زیر داشته باشیم:

SELECT  a.cName,b.Salary FROM tbl1 AS a, tbl2 AS b
در اینجا نامهای a به tbl1 و b  به tbl2 اشاره می کند. که با کلمه کلید AS نام مستعار تعریف می شود. همینطور در مورد فیلدها هم نام مستعار داریم:

SELECT  a.cName AS 'Nam',b.Salary AS 'Hoghoogh' FROM tbl1 AS a, tbl2 AS b
پس از ساخت Query نام فیلدها Nam و Hoghoogh خواهد بود. اما این بیشتر به این درد می خود که ممکن است شما در پرس و جو فیلد محاسبات داشته باشید:

SELECT  a.cName AS 'Nam',b.Salary-b.Tax AS 'PureSalary' FROM tbl1 AS a, tbl2 AS b
پس نکته دیگر هم اینکه محاسبات فیلدها هم در این دستور جایز است.



اما دقت کنید دستور فوق اگر در جدول اول ۲۰۰ رکورد و دومی ۱۰۰ رکورد باشد ۲۰۰۰۰ رکورد نتیجه آن خواهد بود. و به ازای هر ردیف جدول اول تمامی ردیفهای جدول دوم برگردانیده می شود.



* محاسبات:*

برخی از بانکها به شما اجازه میدهند توابع محاسباتی هم در این دستور انجام دهید. مثلا :

SELECT  SIN(2)
 که سینوس زاویه ۲ رادیان را بر می گرداند. (در SQL Server محاز است) اما در SQLite این توابع مجاز هستند:
http://sqlite.org/lang_expr.html

در اکسل:
mk:@MSITStore:D:\Program%20Files\Microsoft%20Offic  e\OFFICE11\1033\acmain11.chm::/html/FunctionsAvailableInAPageOrInPivotta.htm

----------


## rezaTavak

چیزی که مهم است این است که جداول در بانک رابطه داشته باشند. و چنین مدیری را RDBM می گویند. 

فرض کنید مشخصات پرسنل در یک جدول به نام preson و حقوق آنها در salary است و فیلد رابطه‌ای آنها nRelate است برای لیست حقوقی بر اساس نام دستور زیر را بکار می بریم:

SELECT a.cName , b.nPay FROM Person AS a LEFT JOIN Salary AS b ON a.nRelate=b.nRelate


خب دیدید که برای ارتباط از JOIN استفاده کردیم و شرط را با On نوشتیم. اما ارتباط از چند نوع است:
[*NATURAL*][*LEFT* |* RIGHT* |* FULL*][*OUTER* |* INNER* |* CROSS*]* JOIN


*Left در جدول اول وجود دارد مهم نیست جدول دوم وجود داشته باشد اگر باشد که مقدار مناسب اگر نباشد NULL
Right برعکس بالاست.
FULL باید در هر دو جدول وجود داشته باشد.

----------


## علی اکبر

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

select a.per,b.fname from a,b where a.per=b.per

یه سوال که واقعا باهاش مشکل دارم البته باید ببخشید وسط مبحث شما می پرسم
دو تا جدول دارم که بااین کد کلی دچار مشکل سرعت می شوم

select cod,sharh,(select sum(mab) from table2 where table1.cod=table2.cod) from table1

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

select cod,sharh,cod as mab from table1
go top
do whil.not.eof()
_cod=cod
select sum(mab) as a1 from table2 were cod=_cod
select table1
repl mab with table2.a1
skip
enddo

البته این کد قطعا در فاکس باید با sqlexec اجرا بشه ویه کمی کد خلاصه شده تا منظورم رو بگم
این کد با کد اول دقیقا یه کار انجام میده ولی سرعت انجام دومی نسبت به اولی اصلا قابل قیاس نیست
به نظر شما مشکل چیه

----------


## rezaTavak

خب ما هنوز وارد بحث GROUP BY نشدیم. sum,count,avg و... نیاز به GROUP BY دارد که در دستورات شما نیست. اجازه بدهید بحث دنبال شود و ببینید با GROUP BY مشکل شما حل می‌شود؟

یعنی من کد اول را به صورت زیر اصلاح می کنم:


SELECT a.cod,a.Sharh,SUM(b.mab) AS mab;
    FROM Table1 AS a INNER JOIN Table2 ON a.cod = b.cod;
    GROUP BY a.cod,a.Sharh
البته تست کنید ببینید درست نوشتم؟

----------


## rezaTavak

خب داشتم دستور Join  را  توضیح میدادم سرویسمان داشت می رفت نیمه کاره رها شد اما بهتر است مطلب را با مثال بیان کنم:
http://en.wikipedia.org/wiki/Join_(sql)

توضیح کاملی در این خصوص داده که آنرا پی می گیرم.

Department Table  DepartmentID DepartmentName
 31 Sales   
33 Engineering   
34 Clerical   
35 Marketing    

Employee Table  LastName DepartmentID   
Rafferty 31   
Jones 33   
Steinberg 33   
Robinson 34   
Smith 34   
Jasper 36   
جداول مثال است که با  هم بررسی میکنیم:
۱ - INNER JOIN
مفهوم کلی آن این است که رکوردهایی که در جدول یک است باید در جدول دوم هم نظیر داشته باشد یعنی اینکه اگر در جدول اول رکوردی بود اما در دومی نبود یا برعکس در این پرس و جو نمایش داده نخواهد شد به مثال توجه کنید:

Example of an explicit inner join:
  SELECT *
 FROM   employee 
       INNER JOIN department 
          ON employee.DepartmentID = department.DepartmentID

Example of an implicit inner join:
 SELECT *  
 FROM   employee, department 
WHERE  employee.DepartmentID = department.DepartmentID

Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Smith 34 Clerical 34
Jones 33 Engineering 33
Robinson 34 Clerical 34
Steinberg 33 Engineering 33
Rafferty 31 Sales 31


 خب  میبینید که فقط آنهایی که در هر دو وجود داشتند لیست شده اند. دستور دوم هم معادلی برای دستور اول بدون استفاده از JOIN است.

اما دو نوع INNER داریم یکی 
*Equi-join*


و دیگری 

*Natural join*


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

----------


## rezaTavak

*Cross join*

این مانند این است که به ازای هر رکورد در جدول اول جدول دوم هر قرار گیرد. و مانند این است که اصلا اینطور دستور را صادر کنیم:

SELECT * FROM   employee, department


معادل است با :

SELECT * FROM   employee CROSS JOIN department


یعنی تعداد رکوردی که بر می‌گردد مساوی تعداد رکورد جدول اول در تعداد رکورد جدول دوم.

----------


## rahro

> مفهوم کلی آن این است که رکوردهایی که در جدول یک است باید در جدول دوم هم نظیر داشته باشد یعنی اینکه اگر در جدول اول رکوردی بود اما در دومی نبود یا برعکس در این پرس و جو نمایش داده نخواهد شد


اگر بخواهم عکس اینعمل را انجام دهم باید چگونه این دستور را بنویسم 
برای توضیح بیشتر , دو جدول با یک فیلد مشترک ولی در جدول اول تنها رکوردهایی را میخوام که در جدول دومی وجود نداشته باشد.!!

----------


## rezaTavak

*Outer joins*


در مقابل بالاست و یعنی اینکه لازم نیست به ازای هر رکورد در یک جدول در دیگر هم وجود داشته باشد.

و به صورتهای زیر است:
* left outer joins, right outer joins, and full outer joins*
حالات ممکن*Left outer join:
*

تمام رکوردهای جدول اول بر می گردد و در صورتیکه رکورد متناظر در جدول دوم باشد مقدار آن در غیر اینصورت مقدار NULL بر می گردد. به مثال توجه کنید:


SELECT *  
FROM   employee 
       LEFT OUTER JOIN department 
ON employee.DepartmentID = department.DepartmentID 

Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Jones 33 Engineering 33
Rafferty 31 Sales 31
Robinson 34 Clerical 34
Smith 34 Clerical 34 
Jasper 36 NULL NULL
Steinberg 33 Engineering 33می بینید که رکوردهایی که در جدول اول بود همه انتخاب شدند اما در جدول دوم آنهایی که بودند و حائز شرط در جای مناسب قرار گرفتند و آنهایی که در جدول اول نظیر نداشتند NULL شدند.

*Right outer join*

این یکی برعکس بالایی است یعنی تمام رکوردهای جدول دوم بر میگردد و اگر رکورد منتناظری در جدول اول بود بر می‌گردد در غیر اینصورت آن فیلدها NULL خواهد بود مثال:

SELECT * 
FROM   employee 
       RIGHT OUTER JOIN department 
          ON employee.DepartmentID = department.DepartmentID


Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Smith 34 Clerical 34
Jones 33 Engineering 33
Robinson 34 Clerical 34
Steinberg 33 Engineering 33
Rafferty 31 Sales 31
NULL NULL Marketing 35

*Full outer join*


این یکی ترکیب حالات فوق است یعنی تمام رکوردهای جدول اول و دوم بر می گردد. اگر متناظر در جدول دیگر وجود داشت مقدار مناسب در غیر اینصورت NULL جایگزین فیلدها خواهد شد. مثال:



SELECT *  
FROM   employee 
       FULL OUTER JOIN department 
          ON employee.DepartmentID = department.DepartmentID



Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Smith 34 Clerical 34
Jones 33 Engineering 33
Robinson 34 Clerical 34
Jasper 36 NULL NULL
Steinberg 33 Engineering 33
Rafferty 31 Sales 31
NULL NULL Marketing 35

----------


## rezaTavak

> اگر بخواهم عکس اینعمل را انجام دهم باید چگونه این دستور را بنویسم 
> برای توضیح بیشتر , دو جدول با یک فیلد مشترک ولی در جدول اول تنها رکوردهایی را میخوام که در جدول دومی وجود نداشته باشد.!!


باید ازLEFT  Outer Join  استفاده کنید  و شرط را بگذارید  و  Where که هنوز به آن نرسیدم را طوری تنظیم کنید که مقدارهای جدول دوم NULL باشد.

----------


## rezaTavak

*Where* 

در بیشتر دستورات SQL وجود دارد و برای محدود کردن محدوده عمل یا شرط گذاری بکار می‌رود.

در SELECT هم همین است اگر بخواهیم رکوردهایی که نمایش داده می‌شوند  محدود شوند این دستور کاربرد دارد.

در جلوی Where باید یک عبارت منطقی باشد که همانطور که میدانید عبارت منطقی شامل مقادیری عملگرهای منطقی مانند < > =  و عملگرهای رابطه‌ای مانند AND OR است.

اما برخی از چیزهایی که ممکن است جالب باشند:
IS NULL  
IS NOT NULLبرای بررسی خنثی بودن.expr BETWEEN min AND max
بخواهیم فیلدی یاعبارتی بین دو مقدار باشد

NOT

عذم برقراری شرط

expr IN (value,...)

وچود یک چیز را در یک مجموعه خواستار باشیم.

ISNULL(expr)

عبارتی مقدار خنثی داشته باشد.

expr LIKE pat [ESCAPE 'escape-char']

مقدار رشته‌ای شبیه یک الگو باشد اگر در الگو % باشد میتواند هر چیزی به جای آن قرار گیرد.

----------


## anubis_ir

من مدتی با sqlite‌ کار کردم. چون thread safe ساخته نشده در محیط‌های چند ریسمانی مشکلات عدیده‌ای رو ایجاد میکنه.
اگر برنامه شما تک ریسمانی است انتخاب خوبی خواهد بود.

----------


## rezaTavak

خب حال چند مثال از کار با دستور SELECT:

کارهای ریاضی:
میدانید برای محاسبات در SELECT به صورت زیر باید عمل کرد.  به بقیه مثالها هم توجه کنید.:

SELECT 1+2*3;

SELECT (1+2)*3;

SELECT 1 = 0;

SELECT '.01' = 0.01;

SELECT '.01' <> '0.01';


SELECT 0.1 <= 2;

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;

SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;

SELECT * FROM tbl_name WHERE auto_col IS NULL;

SELECT 1 BETWEEN 2 AND 3;

SELECT 'b' BETWEEN 'a' AND 'c';

SELECT 2 BETWEEN 2 AND '3';

SELECT 2 BETWEEN 2 AND 'x-3';

SELECT 2 IN (0,3,5,'wefwf');

SELECT 'wefwf' IN (0,3,5,'wefwf');

SELECT ISNULL(1+1);

SELECT ISNULL(1/0);

SELECT NOT 10;

SELECT NOT 0;

SELECT NOT NULL;

SELECT ! (1+1);

SELECT ! 1+1;

SELECT 1+"1";

SELECT 10 LIKE '1%';

SELECT 'David!' LIKE 'David_';

SELECT 'David!' LIKE '%D%v%';

SELECT 'David!' LIKE 'David\_';

SELECT 'David_' LIKE 'David\_';

SELECT 'David_' LIKE 'David|_' ESCAPE '|';

SELECT 'abc' LIKE 'ABC';

SELECT 'abc' LIKE BINARY 'ABC';

ELECT 10 LIKE '1%';





معمولا اگر یک نتیجه یک مقدار منطقی باشد عدد یک بعنوان درست و عدد صفر به عنوان نادرست بعنوان نتیجه بر گردانیده می شود.

----------


## rezaTavak

ممکن است بخواهیم که محاسباتی مانند مجموع، شمارش، کمینه و... داشته باشیم در اینصورت مجبوریم که GROUP BY را بکار بریم. مثلا برای محاسبه مجموع ساعات حضور یک پرسنل:


SELECT a.cName, SUM(b.nTime) FROM PERSONAL AS a LEFT JOIN tblTime AS b GROUP BY a.cName
ممکن است بخواهیم شرطی در موقع گروه بندی باشد از HAVING استفاده میکنیم:


SELECT a.cName, SUM(b.nTime) FROM PERSONAL AS a LEFT JOIN tblTime AS b GROUP BY a.cName HAVING b.nTime > 0
در اینجا مثلا فرض شده که اعداد منفی معنای خاصی دارند ونباید در محاسبات وارد شوند.

 در حقیقت این دستور برای این است که چند ردیف را یکی کند.  حتی بدون استفاده از توابع محاسباتی ذیل می توانید چند رکورد یکجور را یکی کنید.

اما نوع محاسبات:


avg(_X_) Return the average value of all non-NULL _X_ within a group.  String and BLOB values that do not look like numbers are interpreted as 0. The result of avg() is always a floating point value even if all inputs are integers. 
count(_X_)
count(*) The first form return a count of the number of times that _X_ is not NULL in a group.  The second form (with no argument) returns the total number of rows in the group. 
group_concat(_X_)
group_concat(_X_,_Y_) The result is a string which is the concatenation of all non-NULL values of _X_.  If parameter _Y_ is the separator between instances of _X_.  A comma (",") is used as the separator if _Y_ is omitted.
max(_X_) Return the maximum value of all values in the group. The usual sort order is used to determine the maximum.
min(_X_) Return the minimum non-NULL value of all values in the group. The usual sort order is used to determine the minimum.  NULL is only returned if all values in the group are NULL. 
sum(_X_)
total(_X_)
 Return the numeric sum of all non-NULL values in the group.    If there are no non-NULL input rows then sum() returns    NULL but total() returns 0.0.    NULL is not normally a helpful result for the sum of no rows    but the SQL standard requires it and most other    SQL database engines implement sum() that way so SQLite does it in the    same way in order to be compatible.   The non-standard total() function    is provided as a convenient way to work around this design problem    in the SQL language.     The result of total() is always a floating point value.    The result of sum() is an integer value if all non-NULL inputs are integers.    If any input to sum() is neither an integer or a NULL    then sum() returns a floating point value    which might be an approximation to the true sum.
     Sum() will throw an "integer overflow" exception if all inputs    are integers or NULL    and an integer overflow occurs at any point during the computation.    Total() never throws an exception.

----------


## rezaTavak

اما اگر چند فیلد بخواهیم گروه بندی شود از کاما بین هر فیلد استفاده میکنیم.



گروه بندی خاصیتی دارد که ابتدا مرتب شده سپس بازگردانیده خواهند شد. (چون برای حذف میبایست مرتب باشند.)

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

اما برای مرتب سازی در SELECTاز ORDER BY و ذکر فیلدها که بین آنها کاما آمده (یا ذکر عبارات) عمل کنید.

مثال:

SELECT * FROM Personal  ORDER BY cName,cFamily

----------


## rahro

این دستور کجاش مشکل داره که بعد از EXE شدن ارور میده!!!
N_FILE='D:\101\MKOL.DBF'    && PATH FILE
DAT_NEW1='1386/01/01'      && DATE1 
DAT_NEW2='1386/05/31'      &&DATE2
SQLRUNED=' FZ1,FZ6 FROM '+N_FILE+' WHERE FZ1 > 0 AND FZ5 > 0 AND FZ6 BETWEEN "'+DAT_NEW1+'" AND "'+DAT_NEW2+'" ORDER BY FZ1 INTO CURSOR TEMP'
SELECT &SQLRUNED

----------


## rezaTavak

خطا چیه؟

اگر کمپایل نشده باشه خطا ندارد؟

----------


## rezaTavak

*محدود کردن رکوردها:*


می توانید میزان رکوردی که نمایش داده می شود را محدود کنید. مثلا برای حذف رکوردهای تکراری از DISTINCT استفاده کنید:



SELECT DISTINCT * FROM tbl1



کد فوق ردیف به ردیف بررسی میکند و اگر هر ردیفی در تمام فیلدها تکراری بود آنرا فقط یکبار نمایش میدهد.
دقت کنید این فرمان هم ابتدا خروجی را مرتب می‌کند.
در برابر دستور فوق ALL وجود دارد که پیش فرض هم همین است یعنی تکراریها حذف نخواهند شد.

در محصولات میکروسافت TOP و بعد از آن عدد تعداد رکوردی که باید ندر خروجی برگردانیده  شود را نشان میدهد البته از ابتدای رکوردها حتی کلمه کلیدی Percent هم بعد از عدد برای نمایش درصد می تواند بکار رود  اما دقت کنید این کلمه در محصولات میکروسافت است.
(وجود ORDER BY فراموش نشود.)

در عوض در دیگر بانکها کلمه کلیدی LIMIT  وجود دارد که اینکار را انجام می‌دهد. دقت کنید حتما باید در انتهای دستور select قرار گیرد و اگر از کلمه کلیدی OFFSET استفاده شود از رکوری که گفته شده جداسازی انجام می‌شود. همچنین اینکار پس از ساخت پس و جو در آخر کار انجام می‌شود.

به مثالها دقت کنید:

SELECT * FROM tbl1 LIMIT 10


فقط ده رکورد اول


SELECT * FROM tbl1 LIMIT 10,20


از رکورد ۱۰ و ۲۰ رکورد.


 SELECT * FROM tbl1 LIMIT 10 OFFSET 20


از رکورد ۲۰ و ۱۰ رکورد.

(تفاوت OFFSET و کاما را ببینید.)

تفاوت در دیتابیسهای معروف:



SELECT * FROM T *LIMIT 10* 
PostgreSQL, MySQL, SQLite, H2   
SELECT * from T *WHERE ROWNUM <= 10* Oracle (also supports the standard, since Oracle8i)

  SELECT * FROM T *FETCH FIRST 10 ROWS ONLY* DB2 (also supports the standard, since DB2 v8)

  
SELECT *TOP 10* * FROM T 
MS SQL Server (also supports the standard, since SQL Server 2005), Sybase ASE, SQL_Anywhere, MS Access   
 

دقت کنید که این جزئی از استاندارد نیست.

----------


## rahro

> خطا چیه؟
> 
> اگر کمپایل نشده باشه خطا ندارد؟


خطا هستش: Feature not available
در صورتی که بصورت App کمپایل بشه یا Fxp رو اجرا کنم ایراد نمیگیره ! این ایراد در صورتیه که پروژه Exe بشه.

----------


## rezaTavak

این خطا میگه که این syntax برای این نگارش درست نیست!

عجیبه!

----------


## rezaTavak

چیزی که در ORDER BY یادم رفته بود:

DESC و ASC برای ترتیب نزولی و صعودی است به مثال توجه کنید:


SELECT * FROM tbl1 ORDER BY cNAME ASC, cDate DESC


دقت کنید اولی صعودی مرتب شده و دومین فیلد نزولی.

----------


## rahro

> این خطا میگه که این syntax برای این نگارش درست نیست!
> 
> عجیبه!


من این دستور رو تو  FOX2.6 نوشتم ! یعنی چی ؟!!!

----------


## rezaTavak

من فاکس قدیمی ندارم اما مطمئنید که:
INTO CURSOR TEMP


در فاکس ۲.۶ هم هست؟

----------


## rahro

> من فاکس قدیمی ندارم اما مطمئنید که:
> INTO CURSOR TEMP
> 
> در فاکس ۲.۶ هم هست؟


آره  :متفکر: 
CURSOR <cursor> - Stores query results in a cursor named <cursor>. 
   If you specify the name of an open table/.DBF, FoxPro closes the
   table/.DBF and creates a cursor by that name without warning if 
   SET SAFETY is OFF.  After SELECT is executed, the temporary cursor 
   remains open and is active but is read-only.  Once you close this 
   temporary cursor, it is deleted.  Cursors can exist as a temporary
   file on the SORTWORK drive.

----------


## rezaTavak

بهتره این بحث را به جایی دیگر منتقل کنید شاید دوستان در آنجا بتوانند کمک کنند.

من که می گم مشکل از جایی دیگر است برای این منظور خط آخری که دستور است را غیر فعال کن ببین باز هم خطا میده؟

----------


## rezaTavak

بحت SQL تمام شد اگر دوستان چیزی جا مانده ادامه دهند.

برای دانستن بیشتر به:

http://www.w3schools.com/sql/default.asp

----------


## mehran_337

چند مورد :
در ویژوال فاکس برای هر شی به طور مستقیم با بانک ارتباط می دهیم مثل کمبو و یا ...  و این مراحل کار را بسیار کوتاه می کند اما آیا اگر دیتابیس sql باشد همش باید کرسری با دستور select اجرا شود ؟؟؟ یعنی وقتی کمبویی قرار می دهیم باید با دستورات آن را سورس دهی کنیم؟
در کل برداشت من تایپ دستور sql ، ایجاد کرسر و مجددا استفاده از بروز رسانی است ؟؟؟؟
مورد بعد اینکه ما در دیتا منیجر از تریگر ها استفاده زیادی می کنیم در sql چگونه می توانیم کدنویسی کنیم؟

----------


## rezaTavak

سلام

من اینجا فقط اصولی را گفتم که در همه دیتابیسها باشد.

بقیه بحثها بستگی به نوع مدیر آن دارد.

در فاکس هم می توانید Remote view  بسازید و مانند جدول با آن رفتار کنید. همان چیزی که در بحث MySQL گفته ام.

اینها برای این بود که بدانید کسان دیگر در مثلا بیسیک یا جاوا چگونه کار میکنند!

البته جاوا مثلا ResultSet دارد که یه چیزی تو مایه های table خودمونه و بیسیک با ADO بهینه شده اما به پای فاکس نمی رسند!

----------


## mehran_337

اتفاقا نکته خوبی را اشاره کردید برای من هم سوال بود که زبانهای دیگه باید از دستورات مذکور استفاده کنند و فاکس علاوه بر روشهای فوق جداول مخصوص به خود را داراست.
مورد بعد اینکه سوال من پاسخ داده نشد آیا با توجه به توضیحاتی که دادید زبانهای دیگر برای هر عمل مثلا تنظیم سورس یک کمبو هم ناچارا از نوشتن دستورات sql باید استفاده کنند و نهایتا آپدیت بانک؟؟

----------


## rezaTavak

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


منتها آدمهای خوش ذوق برای ساده تر کردن کار برای اینکار کلاس مرتبط می سازند مثلا نمونه ای از این کلاس برای java وجود دارد که تمام کنترلهای آنرا برای ارتباط با بانک مهیا کرده است:
http://*swingset*.sourceforge.net
که من در netbeans (یک IDE برای جاوا) با آن بصورت ویژوال کار میکنم.

حتی برای ساخت گزارش هم در زبانهای دیگر کلاس مرتبط وجود دارد مثلا در جاوا:
jasperreport
یا حتی ساخت چارت از روی اطلاعات بانک jfreechart و...

و حتی محیط ویژوال مانند iReport برای دو کلاس بالایی!


زبانهای دیگر را مطلع نیستم اما مطمئن باشید اصول دستورات  SQL است که شما می توانید قدرتمند باشید.

----------


## mehran_337

با سلام
جناب توکل با وجودیکه قبلا مطالب فوق را خواندم اما استفاده نکرده بودم تا اینکه دست به کار شدم و تصمیم گرفتم در پروژه های جدید از بانکی بغیر از فاکس استفاده کنم. خیلی جالب بود و از راحتی کار به وجد آمدم اما :

1 - پس از نصب متوجه شدم sqlite 2 utf-8 نیز وجود دارد می خواستم ببینم این فایل چیست ؟
2 - پس از ساختن دیتابیس دیدم فقط یک فایل دارم که به راحتی با برنامه sqliteadmin باز می شود پس امنیت بانک چطور ایجاد می شود.
3 - امنیت اکسس که لو رفته است آیا برای این نیز تا کنون راه نفوذی پیدا کرده اند ؟
4 - هنگامیکه از طریق پنل پروژه دیتابیسی ایجاد می کنم و ریموت ویو می کنم پیغام
file is encrypted or not a database می دهد حال آنکه با دستوراتی که گفتید به راحتی کانکشن ایجاد شد و مشکلی نداشتم.
5 - کدنویسی در تریگر این دیتابیس با چه زبانی نوشته می شود نقش فاکس در این بخش چیست؟
6 - نوشته شده بود در sql ها کنترل کار رکوردها در شبکه به عهده خود دیتابیس است نه برنامه نویس ، اعمالی از قبیل بافرینگ و لاک کردن و جلوگیری از کانفلیگ و ... در این برنامه چطور؟
چنانچه از درون فاکس و دستور insert مقدار فارسی را به تیبل می ریزم توسط brow می بینم آن رکورد خالی است و درون sqliteadmin می بینم حروف ناخوانا پر شده است حال آنکه از ادمین اگر عبارت فارسی در تیبل بریزم در فاکس قابل رویت است.
اگر می شود در این زمینه ها راهنمایی کنید
با تشکر

----------


## rezaTavak

۱- من چون توی لینوکس کار میکنم نمی دانم واقعا  چه چیزی است.
۲ - این بانک ساده است و فقط برای کارهای کوچک است. امنیت در دیتابیس منیجرهایی است که تازه آن هم کلی اصول دارد.
۳ - گذاشتن رمز امنیت نیست. امنیت یعنی اینکه مثلا شما بتوانید از یک کامپیوتر راه دور به یک دیتابیس منیجر بطور غیر مجاز دسترسی داشته باشید. این دیتابیس در حدی ساده است که روی موبایل هم هست.
۴ - ریموت باید اول دیتابیس وجود داشته بعد به آن وصل شوید. شما در واقع دیتابیسی نساخته اید.
۵ - کد آن با خود همان زبانی است که در sqlite است یعنی همان sql استاندارد. 
6 - ببینید منظور من این بود که مثل آن چیزی که در فاکس شماره رکورد در ذهن دارید انتظار نداشته باشید. یعنی فقط به دستورات اکتفا کنید.

شما باید اول داده خود را به یونیکد یا utf8 تبدیل کنید و سپس انتقال دهید تا همه جا درست باشد.

----------

