ورود

View Full Version : مشكل غير منطقي sql ودلفي



Modernidea
جمعه 30 اسفند 1387, 12:08 عصر
سلام
يك نگاهي به اين كد بندازين:


var
str1, name, pass: String;
begin
str1:= 'Select * from tblUsers where (UserName like'+QuotedStr(EditUsername.Text)+') And (Pass like '+QuotedStr(EditPass.Text)+')';

DM.AQLogin.SQL.Clear;
DM.AQLogin.SQL.Add(str1);
DM.AQLogin.Open;

name:= DM.AQLogin.FieldByName('UserName').AsString;
pass:= DM.AQLogin.FieldByName('Pass').AsString;

if (EditUsername.Text = name) and (EditPass.Text = pass) and (name <>'') then
begin
Hide;
frmMain.Show;
end
else
begin
MessageBeep(50);
ShowMessage('نام كاربري و يا رمز ورود اشتباه است');
EditUsername.SetFocus;
EditPass.Clear;
end;




مشكل من اينه كه وقتي داده ها رو مقايسه ميكنه فيلد خالي بر مي گردونه!!
حتي يك كار ديگه هم كردم. اومد اول داده ها رو ريختم تو Editbox بعد مقايسه كردم ولي باز هم فايده نداشت.

در ضمن با Sql Server 2088 كار مي كنم.

Ahmad Chehreghani
جمعه 30 اسفند 1387, 13:03 عصر
سلام
DM.AQLogin.RecordCount رو چک کنيد ببينيد بيشتر از صفر مي ده يا نه.
اگه اشتباه نکنم داريد براي ورود کاربر به نرم افزار برنامه مي نويسيد.
شباهت دوطرفه در like در نظر بگيريد.(که البته شما اين را در چند خط پايين تر نقض کرديد، باشرط مساوي)
کد شما رو تغيير دادم، البته تا اونجا که به کار ورود کاربر مربوط باشه


if (DM.AQLogin.Locate('UserName',EditUsername.Text,[loCaseInsensitive])) and
(DM.AQLoginPass.AsString=EditPass.Text) then
begin
Hide;
frmMain.Show;
end else
begin
MessageBeep(50);
ShowMessage('نام كاربري و يا رمز ورود اشتباه است');
EditUsername.SetFocus;
EditPass.Clear;
end;

اينم بگم که ابتدا شما در ورود نام کاربر بايد چک کنيد که نام کاربري تکراري نباشه.

موفق باشيد

Modernidea
جمعه 30 اسفند 1387, 18:25 عصر
سلام
DM.AQLogin.RecordCount رو چک کنيد ببينيد بيشتر از صفر مي ده يا نه.
اگه اشتباه نکنم داريد براي ورود کاربر به نرم افزار برنامه مي نويسيد.
شباهت دوطرفه در like در نظر بگيريد.(که البته شما اين را در چند خط پايين تر نقض کرديد، باشرط مساوي)
کد شما رو تغيير دادم، البته تا اونجا که به کار ورود کاربر مربوط باشه
[code]
if (DM.AQLogin.Locate('UserName',EditUsername.Text,[loCaseInsensitive])) and
.....

سلام
ممنونم از جوابتون.
اما من از كد شما هم استفاده كردم و نتيجه نداد. يعني پيغامي كه مشخص كردم رو نشون ميده.
كد شما بسيار جالبتر و حرفه اي تر بود اما با كدي كه من نشوتم تفاوتي نداشت.
اصلا انگار كه كاراكتر هايي كه ما به كار برديم با نوع كاراكتر هايي كه در بانك ذخيره شده فرق ميكنه.
چون با كد شما هم فيلد خالي برمي كردونه. اين رو زماني فهميدم كه يك دي بي گريد به اين ado متصل كردم و ديدم به محض اجرا كردن دستور فوق، جدول خالي مي شود.

نوع collation من در بانك sql از نوع arabic است. ممكن است كه مشكل از اين باشه؟
در ضمن من فعلا يك كاربر در بانك اضافه كردم (يعني يك user و pass در بانك دارم)و اون رو هم از طريق خود Sql Server ايجاد كردم.
اين دوتا رو گفتم شايد اشتباهم به اينها مربوط بشه و زودتر مشخص بشه.

shervin farzin
جمعه 30 اسفند 1387, 19:30 عصر
سلام
كدي كه دوستمون ahmad_che نوشتند بسيار جالبه اما زماني به كار شما مياد كه قبل از اين
كد يك select بودن شرط از جدول tblUsers بگيريد و بين خروجي ها با دستور Locate جستجو
كنيد . اما به نظرم اومد كه شما مايل نيستيد كه تمام فيلدهاي جدول رو برگردونيد داخل dataset
و فقط فيلد مشخصي رو مي خوايد ( كه شايد از بعضي نظرات بهتر باشه ) .
پيشنهاد ميكنم به كاراكتر Space ( فاصله ) چه در EditBox هاي فرمتون و چه در فيلدهاي جدول
دقت كنيد . از اونجا كه از علامت % درون دستور Like استفاده نمي كنيد ، يك Space ميتونه كار
رو خراب كنه .
شرط IF كه در خط 10 از كد خودتون قرار داره به نوعي بديهي به حساب مياد ، چون متغيير هاي
Pass و name پر نميشند مگر دستور Select نتيجه اي رو برگردونه ، كه اون نتيجه هم مربوط به
محتويات Editusername و Editpass ميشه . پيشنهاد ميكنم به جاي اون از شرط زير استفاده
كنيد :

if DM.AQLogin.RecordCount <> 0 Then
اگر ميخوايد مطمئن بشين كه مشكل از Collation جدول نيست ( كه فكر نمي كنم باشه ) موقتا
از Username و Password با حروف انگليسي استفاده كنيد .
موفق باشيد .

Modernidea
جمعه 30 اسفند 1387, 19:45 عصر
سلام
كدي كه دوستمون ahmad_che نوشتند بسيار جالبه اما زماني به كار شما مياد كه قبل از اين
كد يك select بودن شرط از جدول tblUsers بگيريد و بين خروجي ها با دستور Locate جستجو
كنيد . اما به نظرم اومد كه شما مايل نيستيد كه تمام فيلدهاي جدول رو برگردونيد داخل dataset
و فقط فيلد مشخصي رو مي خوايد ( كه شايد از بعضي نظرات بهتر باشه ) .
پيشنهاد ميكنم به كاراكتر Space ( فاصله ) چه در EditBox هاي فرمتون و چه در فيلدهاي جدول
دقت كنيد . از اونجا كه از علامت % درون دستور Like استفاده نمي كنيد ، يك Space ميتونه كار
رو خراب كنه .
.....

سلام همشهري چاكرم سال نو مبارك باشه

حاجي spacy در كار نيست. با حروف انگليسي هم وارد كردم نشد.
حتي اومدم براي مثال محتويات مربوط به فيلد UserName رو ريختم توي يك Editbox بعد با با يك رشته با همون مشخصات مقايسه كردم ولي هيچ عمل خاصي انجام نشد.
يعني اين كار رو كردم:
اول محتويات فيلد كه براي مثال 'myname' است رو ريختم در edit1 وبعد

if edit1.text = 'myname' then showmessage('aa')//t

تشكر.كمك

ahmadr
شنبه 01 فروردین 1388, 00:39 صبح
str1:= 'Select * from tblUsers where (UserName='+QuotedStr(EditUsername.Text)+') And (Pass='+QuotedStr(EditPass.Text)+')';

shervin farzin
شنبه 01 فروردین 1388, 02:02 صبح
سلام همشهري ، سال نو شما و بقيه دوستان مبارك .
آقا فيلدهاي UserName و Pass رو در جدول از نوع Char به طول مثلا 10 اگر مشخص كرده باشي و
داخلش رشته اي به طول مثلا 4 كاركتر ذخيره كني ، به طور خودكار به انتهاي رشته ورودي شما
6 كاركتر Space اضافه ميشه تا طول كل رشته به 10 برسه . منظور من از Space در فيلد اين نوع
بود . شما خطوط 8 و 9 از كد خودت رو به شكل زير تغيير بده :

name := trim(DM.AQLogin.FieldByName('UserName').AsString);
pass := trim(Dm.AQLogin.FieldByName('Pass').AsString);

حالا مجددا امتحان كن ببين درست شده يا نه . اگر كار كرد راه بهتر ديگه اينه كه نوع فيلدهاي
UserName و Pass رو در جدولت nVarChar در نظر بگيري تا مشكل توليد Space رو نداشته باشيد .
اميدوارم مشكل حل بشه .
موفق باشيد .

Ahmad Chehreghani
شنبه 01 فروردین 1388, 11:22 صبح
سلام همشهري ، سال نو شما و بقيه دوستان مبارك .
آقا فيلدهاي UserName و Pass رو در جدول از نوع Char به طول مثلا 10 اگر مشخص كرده باشي و
داخلش رشته اي به طول مثلا 4 كاركتر ذخيره كني ، به طور خودكار به انتهاي رشته ورودي شما
6 كاركتر Space اضافه ميشه تا طول كل رشته به 10 برسه . منظور من از Space در فيلد اين نوع
بود . شما خطوط 8 و 9 از كد خودت رو به شكل زير تغيير بده :

name := trim(DM.AQLogin.FieldByName('UserName').AsString);
pass := trim(Dm.AQLogin.FieldByName('Pass').AsString);

حالا مجددا امتحان كن ببين درست شده يا نه . اگر كار كرد راه بهتر ديگه اينه كه نوع فيلدهاي
UserName و Pass رو در جدولت nVarChar در نظر بگيري تا مشكل توليد Space رو نداشته باشيد .
اميدوارم مشكل حل بشه .
موفق باشيد .

اولا اگر قرار هست که کاراکتر غير انگليسي استفاده بشه فيلد ها رو nVarChar در نظر بگيريد(در فيلد nVarChar هم کاراکتر فاصله ميتونه باشه)
دوما اصلا کدي که من نوشتم هيچ کاري روي جدول شما انجام نمي ده و فقط پيمايش مي کنه، اشکال از کدينگ خودتونه!
شما بايد اول کدي که من گذاشتم يا اول اجراي نرم افزارتون اين کد رو بنويسيد


DM.AQLogin.SQL.Clear;
DM.AQLogin.SQL.text:='Select * from tblUsers';
DM.AQLogin.Open;


کدي که نوشتم بايد جواب بده.
به جاي ADOQuery از ADOTable استفاده کنيد چون خيلي کم پيش مياد که شما بخواهيد از جدول کاربران خودتون بخواهيد Select بگيريد.
اگر مي خواهيد Select بگيريد مشکلي نيست اما به فکر اين باشيد که کاربر شما با يک کدينگ ساده مي تونه به جاي وارد کردن نام کاربري يک کد SQL بنويسه و به راحتي وارد نرم افزارتون بشه.

شما مي تونيد کد مربوط به ورود کاربرانتون را همراه بانک در اين تاپيک قرار بديد تا بچه ها اونا رو اصلاح کنن.
موفق و پيروز باشيد ، سال نو مبارک

Modernidea
شنبه 01 فروردین 1388, 14:33 عصر
تشكر تشكر تشكر

مشكل از بي تجربگي و مطالعه كم من بود.
مشكل اين بود كه نوع داده ها از نوع char بود و همون فضاي خالي رو ايجاد مي كرد و در مقايسه اشكا پيش ميومد.
با اين حال خيلي چيزها ياد گرفتم.

پوزش و تشكر فراوان از همه.