PDA

View Full Version : خطا هنگام پاس دادن پارامتر به StoredProcedure



itman.jam
دوشنبه 05 بهمن 1394, 09:16 صبح
دوستان من یک سرچ ساده دارم پروسیجر به شکل زیر که نمیتونم بهش پارامتر ارسال کنم . خیلی سرچ کردم ولی متاسفانه نتیجه ای نداشت.

CREATE PROCEDURE [dbo].[spstest]
(
@model NVARCHAR (20)
)
AS
begin
SELECT * from Table where model = @model

end


سپس در سی شارپ میخوام پارامتر model را که در یک تمست باکس وارد میشه به پروسیجر پاس بدم ولی با خطا روبرو میشم .

SqlCommand comm = new SqlCommand();
comm.CommandType = CommandType.StoredProcedure;
comm.Connection = con;
comm.CommandText = "sptest" ;

comm.Parameters.AddWithValue("@model", textBox1.Text);
SqlDataAdapter da1 = new SqlDataAdapter();
da1.SelectCommand = comm;
DataTable dt = new DataTable();
da1.Fill(dt);


خطا :
Procedure sptest has no parameters and arguments were supplied.

Mahmoud Zaad
دوشنبه 05 بهمن 1394, 09:37 صبح
سلام
یکی اینکه توی sp اسمش رو نوشتید pstest ولی سمت برنامه نوشتید sptest
دوم اینکه وقتی از like استفاده می کنید در هنگام مقداردهی بسته به نیاز باید از % در طرفین عبارت استفاده کنید مثلاً "%"+textBox1.Text (البته شاید دلیل اون خطا این مورد نباشه)
سوم اینکه وقتی از dataAdapter استفاده میکنید نیازی نیست از command هم استفاده کنید خود دیتاآداپتر خاصیت SelectCommand داره میتونید ازش استفاده کنید.

itman.jam
دوشنبه 05 بهمن 1394, 10:17 صبح
سلام
یکی اینکه توی sp اسمش رو نوشتید pstest ولی سمت برنامه نوشتید sptest
دوم اینکه وقتی از like استفاده می کنید در هنگام مقداردهی بسته به نیاز باید از % در طرفین عبارت استفاده کنید مثلاً "%"+textBox1.Text (البته شاید دلیل اون خطا این مورد نباشه)
سوم اینکه وقتی از dataAdapter استفاده میکنید نیازی نیست از command هم استفاده کنید خود دیتاآداپتر خاصیت SelectCommand داره میتونید ازش استفاده کنید.

ممنون از پاسختون مورد اول و دوم بخاطر غلط املایی بود در برنامه درست نوشته شده .
مورد سوم هم بله ولی بدون اون هم تست کردم و نشد .

در کل من وقتی این خط را حذف کنم برنامه بدون ایراد کار میکنه و خروجی دارم ولی به محض اینکه این خط را اضافه کنم اون خطا را میده :

comm.Parameters.AddWithValue("@model", textBox1.Text);

ahmad.jafery
دوشنبه 05 بهمن 1394, 11:53 صبح
سلام دوست عزیز
در اینجا باید نوع پارامتر رو ذکر کنی و در نهایت مقدار رو ست کنی

comm.Parameters.Add("@model", SqlDbType.NVarChar, 50).Value = textBox1.Text;
و در ضمن دیتا اداپتر باید حتما بهش دستور کوئری رو بدید اونی که شما نوشتید کامندی هست که نام یک پارامتر درونش هست پس قبول نمیکنه

روش ساده تره اینه

string cmd = "select * from Table where model ='" + textBox1.Text + "'";
con.Open();
SqlDataAdapter info = new SqlDataAdapter(cmd, con);
DataTable dt = new DataTable();
info.Fill(dt);
dataGridView1.DataSource = dt;
con.Close();

اگر هم با پروسیجر میخوای بنویسی از دیتا ریدر استفاده کن
https://www.csharp-station.com/Tutorial/AdoDotNet/Lesson04

این خیلی بهت کمک میکنه
https://msdn.microsoft.com/en-us/library/d7125bke.aspx

SqlConnection sqlConnection1 = new SqlConnection("Your Connection String");
try
{
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
cmd.CommandText = "StoredProcedureName";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConnection1;
sqlConnection1.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
// get the results of each column
string contact = (string) reader["نام ستون هات"];
string company = (string) reader["نام ستون بعدی"];
string city = (string) reader["هر چندتا ستون رو به ترتیب دریافت کن "];
reader.NextResult();
}
// data access code
}
finally
{
// 3. close the reader
if (reader != null)
{
reader.Close();
}

sqlConnection1.close(); // close the connection too }
}

itman.jam
دوشنبه 05 بهمن 1394, 12:41 عصر
سلام دوست عزیز
در اینجا باید نوع پارامتر رو ذکر کنی و در نهایت مقدار رو ست کنی


comm.Parameters.Add("@model", SqlDbType.NVarChar, 50).Value = textBox1.Text;

و در ضمن دیتا اداپتر باید حتما بهش دستور کوئری رو بدید اونی که شما نوشتید کامندی هست که نام یک پارامتر درونش هست پس قبول نمیکنه



روش ساده تره اینه



string cmd = "select * from Table where model ='" + textBox1.Text + "'";
con.Open();


SqlDataAdapter info = new SqlDataAdapter(cmd, con);


DataTable dt = new DataTable();
info.Fill(dt);
dataGridView1.DataSource = dt;
con.Close();


ممنون دوست عزیز . روش دوم که خب خیلی خوب نیست میخوام از پروسیجر استفاده کنم .
الان مشکلی با فراخوانی پروسیجر ندارم . ینی همین کد که نوشتم داره کار میکنه ولی مشکل من اینجاست که میخوام مقدار یک تکست باکس را به پروسیجر پاس بدم ولی با نوشتن کد مربوطه ارور میده .

الان با توجه به این پروسیجر اگر ما بخوایم یک مقدار را بهش پاس بدیم تا در شرط ازش استفاده کنه چه کدی باید بنویسیم ؟ من 2 روزه دارم سرچ میکنم ولی نمیتونم مشکل را پیدا کنم .

امیتونید کدی که روی سیستم خودتون جواب میده را بزارید ؟

CsharpNevisi
دوشنبه 05 بهمن 1394, 13:31 عصر
SqlParameter[] param = new SqlParameter[]{
new SqlParameter("@model",textBox1.Text)
};

comm.Parameters.AddRange(param);


اینو تست کن

ahmad.jafery
دوشنبه 05 بهمن 1394, 13:46 عصر
سلام
نحوه ی ارسال پارامتر


;com1.Parameters.Add("@parametrname", SqlDbType.NVarChar,50).Value = txtname.Text


parametrname اسم پارامتر خودتو بذار
قسمت دوم هم نوع شو مشخص کن همونی که در اس کیو ال مشخص کردی

اگر هم پارامتر ارسالیت از نوع عدد هست باید تبدیل بشه

;(com1.Parameters.Add("@id", SqlDbType.Int).Value = Convert.ToInt32(cmbid.Text

itman.jam
دوشنبه 05 بهمن 1394, 15:09 عصر
ممنون دوستان مشکل حل شد . نمیدونم چرا وقتی پروسیجر را بستم و دوباره اجرا کردم خط تعریف پارامترش پاک شده بود و دیدم پارامتری داخلش نیست !!! سی شارپ بی زبون هم همش میگفت این پارامتر نداره و من میگفتم داره !!
به هر حال با باز و بسته کردن پروسیجر مشکل مشخص شد .:لبخندساده: