PDA

View Full Version : مبتدی: مشکل در دستیابی به اطلاعات از طرق stored procedure



mahtab.kamali
یک شنبه 25 فروردین 1392, 19:41 عصر
با سلام

سمت بانک یک stored procedure با کوئری selectایجاد کرده ایم به این شکل :



USE [d1]
GO
/****** Object: StoredProcedure [dbo].[Procedure1] Script Date: 04/13/2013 20:19:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Name
-- Create date:
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[Procedure1]
-- Add the parameters for the stored procedure here
@id int = 0,
@name NVarChar = 0
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT @id, @name
END

سمت برنامه هم با این دستورات می خواهیم دیتا گرید رو بهstored procedureمتصل نماییم
اما موقع اجرا چیزی درون دیتا گرید نشون داده نمی شه

به نظر شما ایراد از چیست؟:ناراحت:



private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();

SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\d1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

SqlCommand cmd = new SqlCommand("Procedure1", conn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = "%" + Name + "%";

SqlDataAdapter da = new SqlDataAdapter(cmd);

da.Fill(dt);

dataGridView1.DataSource = da;

}

veniz2008
یک شنبه 25 فروردین 1392, 19:52 عصر
سلام.
sp که نوشتید اشتباه هست. کل عبارت رو پاک کنید و خودتون شروع به نوشتن sp کنید.
یه sp که بخوای براساس name جستجو کنی به اینصورته:


create proc SelectUser
@name nvarchar(50)
as
select * from TblName where Name = @name
go

منظور از TblName همون نام جدول شماست.
منظور از name@ هم پارامتر برای فیلدی هست که میخواید جستجو رو براساس اون انجام بدید.
بعد از نوشتن sp باید اونو اجرا کنید (با دکمه قرمز رنگ ! ).

mahtab.kamali
یک شنبه 25 فروردین 1392, 19:59 عصر
موقع اجرای کوئری ارور می ده

aliasghar2
یک شنبه 25 فروردین 1392, 20:02 عصر
این خطا نشون میده که قبلا یم stored procedure

به همین نام وجود داره

veniz2008
یک شنبه 25 فروردین 1392, 20:09 عصر
همونطور که دوستمون هم گفتن قبلا یه sp با همین نام ایجاد شده.
یه اسم جدید برای sp انتخاب کنید و دوباره اجرا کنید. ( فقط کلمه selectuser رو تغییر بدید).

Arash_janusV3
یک شنبه 25 فروردین 1392, 20:12 عصر
درج رکورد با استفاده از Stored Procedure (http://barnamenevis.org/showthread.php?346847-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C&p=1575357&viewfull=1#post1575357)
فیلتر کردن جدول از طریق Stored Procedure (http://barnamenevis.org/showthread.php?346847-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C&p=1576340&viewfull=1#post1576340)
جستجوی جدول از طریق Stored Procedure بر اساس یک مقدار ورودی (http://barnamenevis.org/showthread.php?346847-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C&p=1577378&viewfull=1#post1577378)

mahtab.kamali
یک شنبه 25 فروردین 1392, 20:14 عصر
همونطور که دوستمون هم گفتن قبلا یه sp با همین نام ایجاد شده.
یه اسم جدید برای sp انتخاب کنید و دوباره اجرا کنید. ( فقط کلمه selectuser رو تغییر بدید).
ممنون از پاسختون
مشکل stored procedur حل شد اما باز وضعیت برنامه فرق نکرد وچیزی توی دیتا گرید نشون نمی ده:ناراحت:

veniz2008
یک شنبه 25 فروردین 1392, 20:16 عصر
کد سی شارپ رو اینطور بنویسید:

private void Form1_Load(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\d1.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlDataAdapter da = new SqlDataAdapter("SpName",conn);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@name", TxtName.Text.Trim());
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
}
به جای کلمه SpName باید نام sp ای که ساختید رو بنویسید.

aliasghar2
یک شنبه 25 فروردین 1392, 20:27 عصر
اگه داری از این SP استفاده می کنی
create proc SelectUser
@name nvarchar(50)
as
select * from TblName where Name = @name

go



من توش like نمی بینم که شما به عنوان ورودی % رو هم اضافه می کنی

mahtab.kamali
یک شنبه 25 فروردین 1392, 20:29 عصر
ممنون حل شد :لبخندساده:

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

چه تغییراتی بایستی در سمت برنامه یا بانک بدهم

aliasghar2
یک شنبه 25 فروردین 1392, 20:33 عصر
می تونی از همون sp استفاده کنی با ایت تفاوت که پارامتر خالی بفرستی

veniz2008
یک شنبه 25 فروردین 1392, 20:49 عصر
اگر میخواید بدون هیچ فیلتری تمام اطلاعات رو نمایش بدید باید شرط رو از sp حذف کنید. روی sp کلیک راست کنید و گزینه Modify رو بزنید.
در پنجره باز شده از داخل کوئری عبارت where رو حذف کنید. (فقط کوئری رو بصورت زیر تغییر بدید) :

select * from TblName
بر روی ! کلیک کنید تا تغییرات ذخیره بشه. درون برنامه هم دیگه نیازی به ارسال پارامتر ندارید. پس خط زیر رو پاک کنید:

da.SelectCommand.Parameters.AddWithValue("@name", TxtName.Text.Trim());

mahtab.kamali
یک شنبه 25 فروردین 1392, 23:00 عصر
سلام

من سمت بانک تغییرات رو انجام دادم



توی برنامه هم اون خط رو حذفش کردم موقع اجرا این ارور رو میده

veniz2008
یک شنبه 25 فروردین 1392, 23:14 عصر
داخل sp اون خط که پارامتر رو تعریف کردید باید حذف بشه. یعنی :

@name nvarchar(50)
رو حذف کنید و با زدن ! تغییرات رو ذخیره کنید.

mahtab.kamali
دوشنبه 26 فروردین 1392, 13:28 عصر
با سلام

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

حالا دو سوال دارم
1 . برای هر یک از دستورات افزودن و پاک کردن رکورها در یک جدول بایستی یه stored procedureجداگانه براشون بنویسیم و حتمااین کار به تعداد جداول بایستی صورت بگیره؟

2 . در سمت برنامه اگه بخواهیم یه کلاس برای دستورات بنویسیم به نحوی که در هر فرم دستورات تکرار نشه آیا امکان پذیر هست و به چه شکلی ؟

veniz2008
دوشنبه 26 فروردین 1392, 14:15 عصر
ممنونم از راهنمایی های دوستان مشکل کاملا حل شد:لبخندساده:

گفته بودم که sp ها ساده و دوست داشتنی هستن.


1 . برای هر یک از دستورات افزودن و پاک کردن رکورها در یک جدول بایستی یه stored procedureجداگانه براشون بنویسیم و حتمااین کار به تعداد جداول بایستی صورت بگیره؟

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

2 . در سمت برنامه اگه بخواهیم یه کلاس برای دستورات بنویسیم به نحوی که در هر فرم دستورات تکرار نشه آیا امکان پذیر هست و به چه شکلی ؟
بله امکان پذیر هست و بهترین راه هم همینه. دنبال برنامه نویسی چند لایه بگردید. بارها در سایت دربارش بحث شده. حجم کدنویسی رو خیلی کم میکنه (کدهای تکراری یک بار نوشته میشه).
موفق باشید.

mahtab.kamali
دوشنبه 26 فروردین 1392, 16:23 عصر
با سلام

در ارتباط با stored procedure قصد داشتم با تعریف یک procedure واحد عمل حذف و اضافه و جستجو رو انجام بدم به این شکل که درسمت sql اینطور تعریف کرده ام



USE [spdata]
GO
/****** Object: StoredProcedure [dbo].[spdata] Script Date: 04/14/2013 16:51:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



ALTER Procedure [dbo].[spdata]
(
--variable declareations
@Action Varchar (10), --to perform operation according to string passed to this varible such as Insert,update,delete,select
@id int=null, --id to perform specific task
@Fname nvarchar(50) =null, -- for FirstName
@MName nvarchar(50) =null, -- for MName
@Lname nvarchar(50) =null -- for LastName -- for LastName

)
AS
BEGIN
SET NOCOUNT ON;

If @Action='Insert'
Begin
Insert Into tina(FirstName,MName,LastName)values(@Fname,@MName ,@Lname)
End

else if @Action='Select'
Begin
select *from tina
end

else if @Action='Update'
Begin
update tina set FirstName=@Fname,MName=@MName,LastName=@Lname where id=@id
End
Else If @Action='delete'
Begin
delete from tina where id=@id
end
End

ودر سمت برنامه اینطوری نوشته ام:


SqlConnection con = new SqlConnection(strConnString);

com = new SqlCommand();

con.Open();

com.Connection = con;

com.CommandText = "spdata";

com.CommandType = CommandType.StoredProcedure;

com.Parameters.Add(new SqlParameter("@Action", SqlDbType.VarChar, 10));

com.Parameters["@Action"].Value = "Select";

sqlda = new SqlDataAdapter(com);

ds = new DataSet();

sqlda.Fill(ds);

dataGridView1.DataSource = ds;

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

veniz2008
دوشنبه 26 فروردین 1392, 21:04 عصر
سمت برنامه اینطور بنویسید :

SqlConnection con = new SqlConnection(strConnString);
SqlDataAdapter da = new SqlDataAdapter("spdata", con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@Action","Select");
DataTable dt = new DataTable();
da.Fill(dt);
datagridview1.DataSource = dt;

mahtab.kamali
دوشنبه 26 فروردین 1392, 21:23 عصر
سمت برنامه اینطور بنویسید :

SqlConnection con = new SqlConnection(strConnString);
SqlDataAdapter da = new SqlDataAdapter("spdata", con);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@Action","Select");
DataTable dt = new DataTable();
da.Fill(dt);
datagridview1.DataSource = dt;
عالی بود درست شد
به نظرتون این شیوه بهتره یا اینکه برای حذف و اضافه و جستجو procedure جدا نوشته بشه

veniz2008
دوشنبه 26 فروردین 1392, 21:28 عصر
عالی بود درست شد
به نظرتون این شیوه بهتره یا اینکه برای حذف و اضافه و جستجو procedure جدا نوشته بشه
این مورد خیلی قابل استفاده نیست مخصوصا در موجودیت های مختلف که فیلدهای متفاوتی دارند. باید یه لیست بلند بالا از پارامترها رو ذکر کنید و همه رو null بدید.
در کل به نظرم خوانایی در این مورد پایینه و پیشنهاد هم نمیکنم از این روش استفاده کنید.