PDA

View Full Version : سوال: پر نشدن فیلد auto number در عمل insert



niloofar21
پنج شنبه 10 فروردین 1391, 11:40 صبح
سلام دوستان. من میخوام عمل insert و update را برای یک جدول در sql انجام بدهم؛ اما با زدن دکمه مربوط به insert ، فیلدی که به صورت auto number تعریف شده پر نمی شود و این پیغام خطا رو دریافت میکنم :

Column 'fRowNumber' does not allow nulls.


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

hamid_shrk
پنج شنبه 10 فروردین 1391, 12:10 عصر
برای اینکه پر بشه چیکار کردید تو sql?
Is Identity رو باید yes کرده باشید ،درسته؟
اگه آره جدولتون رو بزارید

ahmad156
پنج شنبه 10 فروردین 1391, 12:11 عصر
سوالتون واضح نیست.نام ستون رو توی insert ذکر کردین؟:افسرده:

niloofar21
پنج شنبه 10 فروردین 1391, 12:18 عصر
بله identity را yes کردم و در خود جدول در sql پر شدن فیلد مشکلی نداره اما در برنامه موقع insert یا update یک رکورد با مشکلی که گفتم مواجه میشم .
توی پست هایی که در این مورد خوندم نوشته بود که نیازی به آوردن این فیلد در دستورات مربوط به insert نیست و به صورت اتوماتیک باید پر بشه اما نمیشه و خطای خالی بودن فیلد رو میده .
ضمنا من از data set استفاده میکنم برای insert , ...

hamid_shrk
پنج شنبه 10 فروردین 1391, 12:26 عصر
دستور insert رو بذارید

niloofar21
پنج شنبه 10 فروردین 1391, 12:51 عصر
این کد مربوط به دسترات insert و update است که البته در صفحات و موارد دیگه ای که فیلد auto number وجود ندارد به خوبی کار می کنه و نکته دیگه اینکه کلید اصلی در این جدول ترکیب 5 فیلد است که 4 تای اون در 4 سظر اول دستورات اومده و 5 امی همون RowNumber است که auto number در نظر گرفته شده :


protected void BtnSave_Click(object sender, EventArgs e)
{
tHardware_DetailsTableAdapter sda = new tHardware_DetailsTableAdapter();
DstHardware ds = new DstHardware();
bool success = sda.FillByCityHardwareCode(ds.tHardware_Details, Int32.Parse(ddlOstan.SelectedValue.ToString()), Int32.Parse(ddlShahrestan.SelectedValue.ToString() ), Int32.Parse(ddlCity.SelectedValue.ToString()), Int32.Parse(DdlTypeHardware.SelectedValue.ToString ())) > 0;
if (success)
{
ds.tHardware_Details.Rows[0][ds.tHardware_Details.fCityCodeColumn] = ddlCity.SelectedValue.ToString();
ds.tHardware_Details.Rows[0][ds.tHardware_Details.fShahrestanCodeColumn] = ddlShahrestan.SelectedValue.ToString();
ds.tHardware_Details.Rows[0][ds.tHardware_Details.fOstanCodeColumn] = ddlOstan.SelectedValue.ToString();
ds.tHardware_Details.Rows[0][ds.tHardware_Details.fHardwareCodeColumn] = DdlTypeHardware.SelectedValue.ToString();
ds.tHardware_Details.Rows[0][ds.tHardware_Details.fHealthstatusColumn] = DdlStatus.SelectedValue.ToString();
ds.tHardware_Details.Rows[0][ds.tHardware_Details.fMarkColumn] = TbxMark.Text;
}
else
{
DataRow MyRow = ds.tHardware_Details.NewRow();
MyRow[ds.tHardware_Details.fCityCodeColumn] = ddlCity.SelectedValue.ToString();
MyRow[ds.tHardware_Details.fShahrestanCodeColumn] = ddlShahrestan.SelectedValue.ToString();
MyRow[ds.tHardware_Details.fOstanCodeColumn] = ddlOstan.SelectedValue.ToString();
MyRow[ds.tHardware_Details.fHardwareCodeColumn] = DdlTypeHardware.SelectedValue.ToString();
MyRow[ds.tHardware_Details.fHealthstatusColumn] = DdlStatus.SelectedValue.ToString();
MyRow[ds.tHardware_Details.fMarkColumn] = TbxMark.Text.Trim();
ds.tHardware_Details.Rows.Add(MyRow);
}
sda.Update(ds.tHardware_Details);
LblMsg.Text = "تغییرات مورد نظر شما با موفقیت ذخیره شد.";
Clear();
BindGrid();
GvHardware.SelectedIndex = -1;

}

hamid_shrk
پنج شنبه 10 فروردین 1391, 13:02 عصر
تو این خط



bool success = sda.FillByCityHardwareCode(ds.tHardware_Details, Int32.Parse(ddlOstan.SelectedValue.ToString()), Int32.Parse(ddlShahrestan.SelectedValue.ToString() ), Int32.Parse(ddlCity.SelectedValue.ToString()), Int32.Parse(DdlTypeHardware.SelectedValue.ToString ())) > 0;


دارید از یکی از متد های کلاستون استفاده میکنید یعنی متد درج کردن ، درسته؟
کد این متد رو بذارید

niloofar21
پنج شنبه 10 فروردین 1391, 13:22 عصر
این یه متد ساده است که در دیتا ست آمده و چون برای آن از stored procedure استفاده کردم stored procedure مربوطه را میگذارم :


ALTER PROCEDURE UPS_Prg20_SelectHardwareDetails_tHardware_Details
(
@fOstanCode int,
@fShahrestanCode int,
@fCityCode int,
@fHardwareCode int
)
AS
SET NOCOUNT ON;
SELECT fOstanCode, fShahrestanCode, fCityCode, fRowNumber, fHardwareCode, fMark, fHealthstatus,
(SELECT fHardwareType
FROM tHardwareType
WHERE (tHardware_Details.fHardwareCode = fHardwareCode)) AS fHardwareType

FROM tHardware_Details
WHERE (fOstanCode = @fOstanCode) AND (fShahrestanCode = @fShahrestanCode) AND (fCityCode = @fCityCode) AND (fHardwareCode = @fHardwareCode)


یه شکی که خودم کردم این بود که چون توی این دستور fill اون فیلد fRowNumber نیست مشکل ایجاد شده ولی تست کردم و به این موضوع هم ظاهرا مرتبط نبود :ناراحت:

hamid_shrk
پنج شنبه 10 فروردین 1391, 13:33 عصر
یه سوال :
چرا برای insert کردن تو تیبل از دستور insert معمولی استفاده نکردین؟
راستش من از این کد زیاد سر در نیاوردم..
شما برای تست این یک کوئری ایجاد کنید و بنویسید :
excec UPS_Prg20_SelectHardwareDetails_tHardware_Details
وبه عنوان ورودی هم ورودی ها رو توی ' ' بذارید.

clover
پنج شنبه 10 فروردین 1391, 15:01 عصر
شما باید خاصیت 'AutoIncrement' رو برای فیلد مورد نظر در دیتاست فعال کنید.
موفق باشید