PDA

View Full Version : سوال :کدهای فرم ثبت نام به وسیله Procedure



angel farahani
یک شنبه 10 فروردین 1393, 12:37 عصر
سلام دوستان ، من یک پروسجر درج در دو جدول نوشتم و فرم هم در asp.net طراحی کردم و کدهای زیر را در دکمه ثبت نام نوشتم ، اما نمی دونم چرا در جداول چیزی رو درج نمی کنه ، فکر میکنم انگار کدهام کامل نیست ، پروسجر هم بدون خطا در sql اجرا گرفتم خطایی نمی ده . لطف کنید راهنماییم کنید . ممنونم از اینجا

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


protected void Button1_Click(object sender, EventArgs e) {
String conString = ConfigurationManager.ConnectionStrings["OnlineResturansConnectionString"].ToString();
SqlConnection sqlcon = new SqlConnection(conString);
SqlCommand cmd = new SqlCommand("InsertUserandShop", sqlcon);
cmd.Connection.Open();
DataSet ds = new DataSet();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@shopname",TextBox1.Text);
cmd.Parameters.AddWithValue("@phone", TextBox2.Text);
cmd.Parameters.AddWithValue("@address", TextBox3.Text);
cmd.Parameters.AddWithValue("@shoptypeid", DropDownList1.SelectedValue);
cmd.Parameters.AddWithValue("@description", TextBox4.Text);
cmd.Parameters.AddWithValue("@wifi", RadioButtonList2.DataValueField);
cmd.Parameters.AddWithValue("@freeship", RadioButtonList1.DataValueField);
cmd.Parameters.AddWithValue("@workhours",TextBox5.Text);
cmd.Parameters.AddWithValue("@website",TextBox6.Text);
cmd.Parameters.AddWithValue("@parkingplace",DropDownList2.SelectedValue);
cmd.Parameters.AddWithValue("@economylevel",DropDownList3.SelectedValue);
cmd.Parameters.AddWithValue("@userfname",TextBox7.Text);
cmd.Parameters.AddWithValue("@userlname", TextBox8.Text);
cmd.Parameters.AddWithValue("@email", TextBox9.Text);
cmd.Parameters.AddWithValue("@cellphone", TextBox10.Text);
cmd.Parameters.AddWithValue("@username", TextBox11.Text);
cmd.Parameters.AddWithValue("@password", TextBox12.Text);
try
{
SqlDataAdapter sqlda = new SqlDataAdapter(cmd);
sqlcon.Open();
cmd.ExecuteNonQuery();
RegisterLbl.Visible = true;
}
catch
{
NonRegisterLbl.Visible = true;
sqlcon.Close();
}
TextBox1.Text = "";
TextBox2.Text = "";
TextBox3.Text = "";
TextBox4.Text = "";
TextBox5.Text = "";
TextBox6.Text = "";
TextBox7.Text = "";
TextBox8.Text = "";
TextBox9.Text = "";
TextBox10.Text = "";
TextBox11.Text = "";
TextBox12.Text = "";
NonRegisterLbl.Visible = false;
RegisterLbl.Visible = false;



}

ali.n93
یک شنبه 10 فروردین 1393, 13:08 عصر
چون توی try نوشتی متوجه نمیشی که خطا از کجاست. نیازی به تعریف sqldataadapter هم نیست. قبل از این که sqlcon رو open کنی خط قبلش close کن. احتمالا مشکل از همینه

angel farahani
یک شنبه 10 فروردین 1393, 14:54 عصر
آره Try را برداشتم متوجه شدم که از یک فیلدم در procedure ایراد میگیره ، این procedure درج در دو جدول است که فیلد shopid در هردو جدول باید درج بشه و این فیلد خودش autonumber است و اضافه میشه . حال ایراد از procedure هست یا از کد برنامه که به shopid من مقدار نمی دم ؟؟؟ ممنونم

خطای : 117439


اینم proccedure :


ALTER Procedure [dbo].[InsertUserandShop]@shopid int,
@shopname varchar(30),
@phone varchar(30),
@address varchar(100),
@shoptypeid int,
@description varchar(100),
@wifi bit,
@freeship bit,
@workhours varchar(30),
@stars tinyint,
@website varchar(30),
@parkingplace tinyint,
@economylevel tinyint,
@userfname varchar(30),
@userlname varchar(50),
@email varchar(50),
@cellphone varchar(15),
@registerdate date,
@username varchar(25),
@password varchar(15)
as
INSERT INTO [shop]
([shopid],[shopname],[phone]
,[address],[shoptypeid],[registerdate],[description],[wifi],[freeship],[workhours],[stars],[website]
,[parkingplace],[economylevel])
VALUES
(@shopid,@shopname,@phone
,@address,@shoptypeid,GETDATE(),@description,@wifi ,@freeship,@workhours,@stars,@website,@parkingplac e,@economylevel);

INSERT INTO [users]
([userfname]
,[userlname],[email],[phone],[cellphone],[registerdate],[username],[password],[usertypeid],[shopid])
VALUES
(@userfname
,@userlname,@email,@phone,@cellphone,GETDATE(),@us ername,@password,2,@shopid);


exec InsertUserandShop;

aslan
یک شنبه 10 فروردین 1393, 17:03 عصر
آره Try را برداشتم متوجه شدم که از یک فیلدم در procedure ایراد میگیره ، این procedure درج در دو جدول است که فیلد shopid در هردو جدول باید درج بشه و این فیلد خودش autonumber است و اضافه میشه . حال ایراد از procedure هست یا از کد برنامه که به shopid من مقدار نمی دم ؟؟؟ ممنونم

خطای : 117439


اینم proccedure :


ALTER Procedure [dbo].[InsertUserandShop]@shopid int,
@shopname varchar(30),
@phone varchar(30),
@address varchar(100),
@shoptypeid int,
@description varchar(100),
@wifi bit,
@freeship bit,
@workhours varchar(30),
@stars tinyint,
@website varchar(30),
@parkingplace tinyint,
@economylevel tinyint,
@userfname varchar(30),
@userlname varchar(50),
@email varchar(50),
@cellphone varchar(15),
@registerdate date,
@username varchar(25),
@password varchar(15)
as
INSERT INTO [shop]
([shopid],[shopname],[phone]
,[address],[shoptypeid],[registerdate],[description],[wifi],[freeship],[workhours],[stars],[website]
,[parkingplace],[economylevel])
VALUES
(@shopid,@shopname,@phone
,@address,@shoptypeid,GETDATE(),@description,@wifi ,@freeship,@workhours,@stars,@website,@parkingplac e,@economylevel);

INSERT INTO [users]
([userfname]
,[userlname],[email],[phone],[cellphone],[registerdate],[username],[password],[usertypeid],[shopid])
VALUES
(@userfname
,@userlname,@email,@phone,@cellphone,GETDATE(),@us ername,@password,2,@shopid);


exec InsertUserandShop;

سلام
چون shopid اتونامبره پس این شکلی نمیتونید insert کنید .... اونواز دستور اینزرت حذف کنید ( در جدول shop ) ..
در جدول دوم نیز اگر shopid اتونامبره .....( عین توضیحات بالا ...............)
اگر مقدار shopid در هر دوجدول یکسانه ( که باحتمال زیاد اینطوره ) مشکل دیگه ای که براتون باحتال زیاد پیش میاد اینه که احتمال داره مقادیر اینزرت شده برای shopid در دوجدول یکسان نباشه ( علت های مختلفی میتونه داشته باشه ....... ) .................
اگر همچین مشکلی داشته باشین یک راه حل میتونه این باشه که shopid را در یکی از جداول از حالت اتونامبر خارج کنید و بعد از اینزرت در جدول اول مقدار اون را بدست بیارین و در جدول دوم بهمراه مقادیر سایر فیلدها ذخیره کنید .................
موفق باشید

angel farahani
یک شنبه 10 فروردین 1393, 18:00 عصر
در پروسجر shopid رو برداشتم و در جدول users گذاشتم باشه ، چون shopid در جدول users کلید خارجی هست حالت autonumber آن اصلا فعال نبود . با برداشتن shopid باز هم خطای Procedure or function 'InsertUserandShop' expects parameter '@shopid', which was not supplied. رو میده . حالا پیشنهاد شما چیه ؟ به نظر شما کد رستورانها رو autonumber دادن درسته ؟ آخه من اگر یک رستوران رو پاک کنم ، که کدش 3 باشه ، دیگه کد 3 تولید نمیشه . اونوقت کدهای رستوران بهم ریخته میشه . ممنونم اگه جواب بدین

angel farahani
یک شنبه 10 فروردین 1393, 20:40 عصر
آیا میشه که کد shopid را در جدول shop وارد کرد و بعد آن را به فیلد shopid در جدول users پاس داد ؟؟ لطفا بگید چطوری میتونم ؟؟ مثلا نمیشه با querystring از یک گرید به گرید بعدی در یک صفحه دیگر ارسال کرد ؟ من تست کردم نشد :( راه دیگه چیه ؟

aslan
یک شنبه 10 فروردین 1393, 21:47 عصر
آیا میشه که کد shopid را در جدول shop وارد کرد و بعد آن را به فیلد shopid در جدول users پاس داد ؟؟ لطفا بگید چطوری میتونم ؟؟ مثلا نمیشه با querystring از یک گرید به گرید بعدی در یک صفحه دیگر ارسال کرد ؟ من تست کردم نشد :( راه دیگه چیه ؟
ببینید دوست عزیز
شما میخواهید بعد از اینزرت در جدول اول مقدار موجود در فیلد shopid را بهمراه مقادیر سایر فیلدها در جدول دوم اینزرت کنید . درسته ؟
حالا باید مشخص کنید که بعد از اینزرت در جدول اول مقدار فیلد shopid ( مثلا عدد x ) چگونه باید واکشی شود تا امکان ذخیره آن در جدول دوم مهیا شود ؟
راهکارهای متفاوتی برای شناسایی مقدار آن ( با توجه به بانک اطلاعاتی ...... ) وجود خواهد داشت ...........
بهر حال اگر مشکلهای اشاره شده حل شده و باز هم کدهاتون خطا میده ............. کدهاتون را اینجا قرار بدین ..........

Majid.Stu66
یک شنبه 10 فروردین 1393, 21:48 عصر
با سلام
دوست عزیز شما دو تا دستور Insert داری داخل یک پروسیجر . اگر میخواید عدد اتو نامبر تولید شده در یک جدول رو بدست بیارید و به عنوان ورودی در دستور Insert بعدی استفاده کنید می تونید بصورت زیر عمل کنید :



DECLARE @ShopID int

INSERT INTO [users]
([userfname]
,[userlname],[email],[phone],[cellphone],[registerdate],[username],[password],[usertypeid],[shopid])
VALUES
(@userfname,@userlname,@email,@phone,@cellphone,GE TDATE(),@us ername,@password,2,@shopid);

SET @ShopID = SCOPE_IDENTITY()

INSERT INTO [shop]
([shopid],[shopname],[phone]
,[address],[shoptypeid],[registerdate],[description],[wifi],[freeship],[workhours],[stars],[website]
,[parkingplace],[economylevel])
VALUES
( @ ShopID,@shopname,@ph one,@address,@shoptypeid,GETDATE(),@description,@w ifi ,@freeship,@workhours,@stars,@website,@parkingplac e,@economylevel);


*من فقط پست آخر رو خوندم امیدوارم درست متوجه منظورتون شده باشم *

angel farahani
یک شنبه 10 فروردین 1393, 22:27 عصر
سپاس از شما ، یعنی ما بقی فیلدها رو بعد declare ننویسم ؟؟ فقط shopid باشه ؟؟ یک سوال دیگه اینکه یک فیلدی که autonumber است مثلا مقدارش 3 هست و حذف می کنیم ، چطور میشه دوباره اون عدد 3 را مجدد بده ؟؟ چون رکورد بعدیش 4 میشه و دیگه 3 را پایگاه نمی ده .

ali.n93
یک شنبه 10 فروردین 1393, 23:44 عصر
سپاس از شما ، یعنی ما بقی فیلدها رو بعد declare ننویسم ؟؟ فقط shopid باشه ؟؟ یک سوال دیگه اینکه یک فیلدی که autonumber است مثلا مقدارش 3 هست و حذف می کنیم ، چطور میشه دوباره اون عدد 3 را مجدد بده ؟؟ چون رکورد بعدیش 4 میشه و دیگه 3 را پایگاه نمی ده .
این کد رو توی sql server اجرا کنید. به جای table_name اسم table خودتون رو بنویسید و اون عدد 2 هم که نوشتم باعث میشه رکورد بعدی 3 بشه.
dbcc checkident('table_name',reseed,2)

Majid.Stu66
دوشنبه 11 فروردین 1393, 12:56 عصر
ShopID یه متغیر هستش که قراره مقداری رو نگه داره و در جای دیگه استفاده شه ( همنام با فیلد در نظر گرفته شده تا مشخص شه قراره چه مقداری رو نگه داره ) . اگه شما می خواید از اعداد اتونامبر رکورد هایی که حذف می کنید مجددا استفاده کنید بهتره بجای حذف رکورد ، فیلدی رو از نوع bit در جدول در نظر بگیرید که صفر بودن این فیلد به معنای این باشه که این رکورد حذف شده و یک بودن این فیلد به معنای عدم حذف رکورد باشه . حالا موقع درج رکورد جدید اول یک کوئری بزنید ببینید رکوردی که مقدار این فیلد آن صفر باشه وجود داره در صورت وجود این رکورد رو با داده های جدید آپدیت کنید و در صورت عدم وجود با دستور Insert اطلاعات رو وارد جدول کنید . مقدار این فیلد خودتون در دستورهای Insert برای جدول با مقدار پیش فرض یک تنظیم کنید .( شاید راه بهتری هم وجود داشته باشه که دوستان لطف کنن راهنمایی کنن )

دستوری که دوستمون نوشتن مقدار اتونامبر رو برای جدول ری ست می کنه و مقداردهی رو از عدد 3 د رنظر میگیره حالا اگه داخل جدول رکوردهای بیشتری داشته باشیم . یعنی رکورد های چهارم ، پنجم و غیره ، در دستور های Insert بعدی با خطا مواجه میشیم چون SQL نمی تونه مقداری رو که از قبل وجود داره (مقدار اتونامبر تولید شده برای رکورد های چهارم ، پنجم و الی آخر )دوباره تولید کنه .

angel farahani
دوشنبه 11 فروردین 1393, 13:27 عصر
کلا این shopid اذیت میکنه :( الان میخوام عکس با فایل آپلود به جدول pic ارسال کنم به shopid خطا می گیره ، shopid را فعلا null درج میکنم که بدونم چیکارش کنم . آره میخوام کد رو اتونامبر بدم ، اما اگر میتونید مطلبی در ارتباط با حذف منطقی بزارید ، چون با حذف یک رستوران کد آن یعنی shopid کلا از چایگاه حذف میشه ، خوب اگر این کاری که شما میگید انجام بدم خیلی منطقی تر هست . ممنونم

angel farahani
سه شنبه 12 فروردین 1393, 23:22 عصر
بله درسته میخوام بعد از درج فیلد shopid که اتونامبر است ، در جدول shop ، مقدار shopid را در جدول users ثبت کند ، . ولی این کد زیر رو اجرا کردم خطای زیر رو میده ، مشکلش چیه ؟

Msg 137, Level 15, State 2, Line 7
Must declare the scalar variable "@userfname".
Msg 137, Level 15, State 2, Line 16
Must declare the scalar variable "@shopname".

angel farahani
سه شنبه 12 فروردین 1393, 23:24 عصر
با سلام
دوست عزیز شما دو تا دستور Insert داری داخل یک پروسیجر . اگر میخواید عدد اتو نامبر تولید شده در یک جدول رو بدست بیارید و به عنوان ورودی در دستور Insert بعدی استفاده کنید می تونید بصورت زیر عمل کنید :



DECLARE @ShopID int

INSERT INTO [users]
([userfname]
,[userlname],[email],[phone],[cellphone],[registerdate],[username],[password],[usertypeid],[shopid])
VALUES
(@userfname,@userlname,@email,@phone,@cellphone,GE TDATE(),@us ername,@password,2,@shopid);

SET @ShopID = SCOPE_IDENTITY()

INSERT INTO [shop]
([shopid],[shopname],[phone]
,[address],[shoptypeid],[registerdate],[description],[wifi],[freeship],[workhours],[stars],[website]
,[parkingplace],[economylevel])
VALUES
( @ ShopID,@shopname,@ph one,@address,@shoptypeid,GETDATE(),@description,@w ifi ,@freeship,@workhours,@stars,@website,@parkingplac e,@economylevel);


*من فقط پست آخر رو خوندم امیدوارم درست متوجه منظورتون شده باشم *





بله درسته میخوام بعد از درج فیلد shopid که اتونامبر است ، در جدول shop ، مقدار shopid را در جدول users ثبت کند ، . ولی این کدی که دادین رو اجرا کردم خطای زیر رو میده ، مشکلش چیه ؟

Msg 137, Level 15, State 2, Line 7
Must declare the scalar variable "@userfname".
Msg 137, Level 15, State 2, Line 16
Must declare the scalar variable "@shopname".

angel farahani
چهارشنبه 13 فروردین 1393, 23:54 عصر
لطفا بفرمایید که ایراد این پروسجرم چی هست ؟

Majid.Stu66
جمعه 15 فروردین 1393, 02:08 صبح
مشکل شما به احتمال زیاد مربوط به پارامترها هستش ( از اونجا که تعداد پارامترها زیاده احتمالا یه ناسازگاری ، اشتباه تایپی یا هر چیزه دیگه ای بین پارامترها وجود داره )
من بصورت زیر یه پروسجر ایجاد کردم :


ALTER PROCEDURE dbo.InserInfo(@shopName nvarchar(50),@userName nvarchar(50))
AS
Declare @shid int

insert into Shop(shopname)
values(@shopName)

set @shid=SCOPE_IDENTITY()

insert into [User](username,shopid)
values(@userName,@shid)
RETURN

کدهای CSharp بصورت زیر :


String constr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=H:\WareRegist er\WareRegister\LearnAndTest.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection sqlcon = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand("InserInfo", sqlcon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@shopName", txtShopName.Text);
cmd.Parameters.AddWithValue("@userName", txtUserName.Text);

try
{
sqlcon.Open();
cmd.ExecuteNonQuery();
sqlcon.Close();
}
catch
{
NonRegisterLbl.Visible = true;
}


دو جدول با نام های Shop و User دارم که جدول Shop دارای ستون های shopid (اتو نامبر و کلید اصلی ) و shopName می باشد و همچنین جدول User دارای ستون های userid (اتونامبر و کلید اصلی می باشد ) ، username و shopid ( کلید خارجی ) است.
این کدها به درستی کار می کنن .

*لازم به ذکره که برای فیلدهای که در جدول بصورت اتونامبر هستن نیازی نیست به پروسیجر پارامتر ارسال و همچنین در دستور Insert نام اون فیلد رو ذکر کنید*