PDA

View Full Version : سوال: مشکل با فیلد autonumber



farshid_82
شنبه 29 بهمن 1390, 11:54 صبح
سلام
من یک فیلد autonumber در جدولم درست کردم ولی تو برنامه موقع ذخیره اررور میده که باید فیلدم value داشته باشه.
دیتابیسم firebird هست و تو دیتابیس امتحان کردم درست کار میکنه

BORHAN TEC
شنبه 29 بهمن 1390, 21:53 عصر
لطفاً متن کامل خطا را بدون کم و کاست برای بررسی قرار دهید.

farshid_82
یک شنبه 30 بهمن 1390, 12:38 عصر
خیلی ممنون از توجه شما.
اینم خطا-فیلد ID کلید و از autonumber هست

82908

Mask
یک شنبه 30 بهمن 1390, 13:11 عصر
فیلدهای اتو نامبر رو شما نباید مقدار بدید.

farshid_82
یک شنبه 30 بهمن 1390, 19:30 عصر
بله درسته منم مقداری ندادم ولی این ارور میاد

BORHAN TEC
دوشنبه 01 اسفند 1390, 00:28 صبح
کاش ذکر می کردید که در چه محیطی نوع فیلد مربوطه رو به autonumber تغییر داده اید.
من فکر می کنم که فیلد ID که شما تعریف کرده اید Not Null هست و بخاطر همینه که برنامه خطا میده و بخاطر همین شما باید مقداری را به آن نسبت دهید(مثلاً عدد 0).
و اگر هم نمی خواهید به آن مقدار دهید باید آنرا از حالت notNull خارج کنید.

مثالی در رابطه با یکی از روشهای حل این مشکل:
من در محیط SQL Manager For Interbase and Firebird خواص فیلد مربوطه را مطابق تصویری که در ضمیمه می بینید تنظیم کرده ام و برای اضافه کردن رکورد هم در محیط Delphi XE2 از کد زیر استفاده کردم و برنامه به درستی کار کرد و مشکلی هم نداشت.
uses
Data.DBXCommon;

procedure TForm1.Button1Click(Sender: TObject);
var
dbxCommand: TDBXCommand;
begin
SQLConnection1.Params.Values['DataBase'] := 'C:\gh.fdb';
// SQLConnection1.Params.Values['Username'] := 'username';
// Set Password & Other values...

SQLConnection1.Open();

dbxCommand := SQLConnection1.DBXConnection.CreateCommand();
try
dbxCommand.Text :=
Format('INSERT INTO MYTABLE (NAME) VALUES (%s);',
['''Ashayeri''']);

dbxCommand.ExecuteQuery();
finally
FreeAndNil(dbxCommand);
end;
end;
همانطور که در کد بالا می بینید به فیلد MYTABLE_FLD که در شکل زیر قابل مشاهده است و به صورت Not Null و AutoIncrement value است به هیچ عنوان مقداری را نسبت نداده ام.

farshid_82
دوشنبه 01 اسفند 1390, 19:21 عصر
من با SQL Manager For Interbase and Firebird کار میکند و فیلدم کلید هست.البته field default هم دادم ولی باز نشد.

BORHAN TEC
سه شنبه 02 اسفند 1390, 12:00 عصر
دوست عزیز، چون فیلد ID شما به عنوان PrimaryKey است قطعاً نمی تواند خالی رها شود و حتماً باید مقداری یکتا در هر سطر در درون پایگاه داده ثبت شود.

یک راه حل ساده برای حل این مشکل:
برای حل این مسئله شما باید تریگر مربوط با فیلد ID را کمی تغییر دهید. اگر از محیط SQL Manager For Interbase and Firebird می خواهید استفاده کنید از قسمت سمت چپ به قسمت Triggers رفته تریگر مربوط به فیلد مورد نظرتان را باز کرده و به عنوان نمونه کد زیر را :
BEGIN
IF (NEW.MYTABLE_FLD IS NULL) THEN
NEW.MYTABLE_FLD = GEN_ID(MYTABLE_MYTABLE_FLD_GEN, 1);
END
به کد زیر تغییر دهید.(به عبارتی خط مربوط به If را حذف کنید)
BEGIN
NEW.MYTABLE_FLD = GEN_ID(MYTABLE_MYTABLE_FLD_GEN, 1);
END
حال خواهید دید که کدی که در پست قبلی قرار داده ام به درستی کار می کند و دیگر نیازی نیست که به فیلد مربوط به Primary Key مقدار بدهید. :چشمک:

farshid_82
سه شنبه 02 اسفند 1390, 16:38 عصر
از شما خیلی ممنون با همین کار مشکل حل شد:بوس: