PDA

View Full Version : مشکل در کدینگ #C



shotshat
شنبه 05 خرداد 1386, 13:08 عصر
سلام
اگه میشه کد برنامه ی login کردن در C# رو برام بذارید. من خودم این کد رو نوشتم به نظرمم درسته ولی ارور میده ببینید می فهمید مشکلش کجاس؟


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Login
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SqlConnection cn = new SqlConnection();
private void Form1_Load(object sender, EventArgs e)
{
cn.ConnectionString = "Server=.;DataBase=Login;UID=sa";
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
SqlDataAdapter da = new SqlDataAdapter(cmd);

}
private void button1_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlDataReader dr;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SELECT Password,UserName FROM checku" + txtpass.Text;

dr = cmd.ExecuteReader();
while (dr.Read())
{
string Password = dr["Password"].ToString();
if (txtpass.Text == Password)
{
Form2 f2 = new Form2();
f2.Show();
}
else
{
MessageBox.Show("Invalid UserName or Password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

ارورشم اینه:

ExecuteReader requires an open and available Connection. The connection's current state is closed.

iranrose63
شنبه 05 خرداد 1386, 13:23 عصر
دوست عزیز قبل از استفاده از یک connection باید اون رو open کنی و بعد از اینکه دیگه نیازی بهش نداشتی اونو close کنی در قسمت Load فرمت که ConnectoinString رو مقدار دهی کردی
اینکار رو بکن
;()cn.open

Mojtaba_ss
شنبه 05 خرداد 1386, 13:30 عصر
اول connection رو open کن متد ExecuteReader رو اجرا کن و بعدشم connection رو close کن


if (oConnection.State != System.Data.ConnectionState.Open)
oConnection.Open();
oDataReader = oCommand.ExecuteReader(System.Data.CommandBehavior .CloseConnection);

حالا کدهای مورد نظرتو بنویس

shotshat
شنبه 05 خرداد 1386, 15:16 عصر
سلام.

من فکر می کردم که اگه open و close رو نذاریم خود برنامه کار باز و بسته کردنش رو به عهده می گیره ! به هر حال وقتی هم که open و close رو گذاشتم و برنامه رو ران کردم و username و password رو وارد کردم قسمت dr = cmd.ExecuteReader(); رو مشخص کردو این ارور رو داد

Could not find stored procedure 'SELECT Password,UserName FROM checku1234' .

Keramatifar
شنبه 05 خرداد 1386, 15:19 عصر
دوست عزیز
میتونی از FormsAuthentication که در خود دات نت موجود است استفاده کنی

Mojtaba_ss
شنبه 05 خرداد 1386, 15:22 عصر
دوست عزیز
میتونی از FormsAuthentication که در خود دات نت موجود است استفاده کنی


آیا تو windows هم وجود داره،تو وب میدونم چطوریه!
اگه میشه طریقشو تو windows با یه مثال بگید.
ممنون.

iranrose63
یک شنبه 06 خرداد 1386, 07:55 صبح
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SELECT Password,UserName FROM checku" + txtpass.Text;[/RIGHT]

وقتی یک کوئری برای بازیابی اطلاعات از DataBase نوشتی CommandType رو باید از نوعTextبذاری (که البته حالت پیش فرض هم همینه)
تو اول اومدی CommandType رو StoreProcedure قرار دادی و بعد یه کوئری نوشتی
باید یکی از دو کار زیر رو بکنی
1- اگه یه کوئری داری CommandType رو Text بذار و بعد کوئری رو بنویس
;cmd.CommandType = CommandType.Text
;cmd.CommandText = "SELECT Password,UserName FROM checku" + txtpass.Text
2- اگه یه SttoreProcedure داری CommandType رو بذارStoreProcedure و بعد CommandText رو بذار اسم اونپروسجر
;cmd.CommandType = CommandType.StoredProcedure
;"cmd.CommandText = "StoreProcedureName

Keramatifar
یک شنبه 06 خرداد 1386, 11:51 صبح
آیا تو windows هم وجود داره،تو وب میدونم چطوریه!
اگه میشه طریقشو تو windows با یه مثال بگید.
ممنون.

نه فقط توی وب کاربرد داره ولی نوشتنش برای ویندوز کار سختی نیست

shotshat
دوشنبه 07 خرداد 1386, 09:13 صبح
وقتی یک کوئری برای بازیابی اطلاعات از DataBase نوشتی CommandType رو باید از نوعTextبذاری (که البته حالت پیش فرض هم همینه)
تو اول اومدی CommandType رو StoreProcedure قرار دادی و بعد یه کوئری نوشتی
باید یکی از دو کار زیر رو بکنی
1- اگه یه کوئری داری CommandType رو Text بذار و بعد کوئری رو بنویس
;cmd.CommandType = CommandType.Text
;cmd.CommandText = "SELECT Password,UserName FROM checku" + txtpass.Text
2- اگه یه SttoreProcedure داری CommandType رو بذارStoreProcedure و بعد CommandText رو بذار اسم اونپروسجر
;cmd.CommandType = CommandType.StoredProcedure
;"cmd.CommandText = "StoreProcedureName


سلام.
فکر کنم شما درست میگید اما بازم یه مشکل دیگه پیش میاد (انگار این C#قصد نداره با ما راه بیاد):گریه:
مشکل اینه که وقتی ; cmd.CommandType = CommandType.Text
رو گذاشتم ارور دادکه :sys.data.commandtype doesnt contain a definition text
منم اون خط رو حذف کردم و وقتی برنامه رو اجرا کردم هم شرط if اجرا شد هم else (هم form2 رو باز کرد هم message box!) !!!!!!!!! عجیب نیست؟:متفکر:

iranrose63
دوشنبه 07 خرداد 1386, 09:38 صبح
اگه دقت کنی میبینی که من نوشتم مقدار پیش فرض CommandType برای یک SqlCommand حالت Text است بنابراین وقتی تو خط cmd.CommandType = CommandType.StoredProcedure رو حذف کردی در واقع همون مقدار Text شده
موفق باشی در ضمن این ماییم که باید یاد بگیریم از #C استفاده کنیم اون قرار نیست مطابق میل ما عمل کنه اونم وقتی داریم یه جایی اشتباه میکنیم

shotshat
دوشنبه 07 خرداد 1386, 09:51 صبح
من فعلا توی C# خیلی مبتدی ام با اینکه یه کتاب آموزشی اش رو خوندم(نصفه نیمه) و از چند تا نمونه مثالم یه چیزایی یاد گرفتم ولی هنوز روشم در رفع ارور ها سعی وخطاس (اگه سورس خوب واسه یادگیری سراغ دارید ممنون میشم کمکم کنید) .
بگذریم حالا من چی کار کنم؟ ارور sys.data.commandtype doesnt contain a definition text مال چیه؟ چه جوری میشه برطرفش کرد؟

iranrose63
دوشنبه 07 خرداد 1386, 09:58 صبح
فعلا کد زیر میتونه کارت رو راه بندازه امتحان کن و ببین به دردت میخوره یا نه

private void login_Click(object sender, EventArgs e)
{
System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection("connectionstring");
con.Open();
System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand("select username,password from login where username=@user and password=@password", con);
com.Parameters.Clear();
com.Parameters.AddWithValue("@user", tbuser.Text);
com.Parameters.AddWithValue("@password", tbpassword.Text);
System.Data.SqlClient.SqlDataReader reader = com.ExecuteReader();
if (reader.Read())
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
else
MessageBox.Show("Invalid UserName or Password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
reader.Close();
con.Close();
}
امیدوارم به دردت بخوره
در مورد سورس هم باید بهت بگم اگه یه سرچ تو سایت بکنی کلی مرجع پیدا میکنی
موفق باشی

iranrose63
دوشنبه 07 خرداد 1386, 10:08 صبح
ارور sys.data.commandtype doesnt contain a definition text مال چیه؟ چه جوری میشه برطرفش کرد؟
مطمئن نیستم ولی فکر کنم توی تایپ کردن Text رو درست ننوشتی چون من با تغییر دادن Text به text با همین خطا مواجه شدم

shotshat
سه شنبه 08 خرداد 1386, 15:43 عصر
یه مشکل اورژانسی دیگه:
من تو فرمم یه datagrid گذاشتم و یه textbox میخوام برنامه سطرهایی از table رو توی datagrid نشون بده که کاربر مشخصاتش رو وارد می کنه.
من کد زیر رو واسش نوشتم ولی کار نمی کنه:

objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection =
objConnection;
objDataAdapter.SelectCommand.CommandText =

"l"SELECT * from table1 where ID=textbox1.text

objDataAdapter.SelectCommand.CommandType =
CommandType.Text

وقتی جای textbox1.text یه عدد ثابت میذارم مثلا'1234' کار می کنه ولی نمی دونم چرا بامحتوای textbox کار نمی کنه

مشکل دوم:
چه جوری میشه از محتوای یه textbox که کاربر در فرم قبلی وارد کرده در فرم دیگه ای استفاده کرد?

ممنون از کمکهاتون

iranrose63
سه شنبه 08 خرداد 1386, 15:51 عصر
قبل از هر چیز بگو ببینم مشکل قبلیت حل شد یا نه؟
اما در مورد سوالت اگه تو کدی که من واست گذاشتم دقت کنی من Username و Password رو به Command پاس دادم برای این منظور از SqlCommand.Parameters استفاده کردم


command.CommandTex"select * from tabel1 whre ID=@parametrname";
command.Parameters.Clear();
command.paremeters.AddWithValues("@parametername",TextBox1.Text;

shotshat
سه شنبه 08 خرداد 1386, 15:55 عصر
دو تا مشکل اورژانسی :
من تو فرمم یه datagrid گذاشتم و یه textbox میخوام برنامه سطرهایی از table رو توی datagrid نشون بده که کاربر مشخصاتش رو وارد می کنه.
من کد زیر رو واسش نوشتم ولی کار نمی کنه:
da.selectcommand=new sqlcommand();
da.selectcommand.conection=cn();
d.selectcommand.commandtext="SELECT * FROM table1 WHERE id=textbox1.text"l
da.selectcommand.commandtype=commandtype.text

وقتی جای textbox1.text یه عدد ثابت میذارم کار می کنه اما نمیدونم چرا با محتوای textbox کار نمی کنه

مشکل دوم:
چه جوری میشه از محتوای یه textbox که کاربر در فرم قبلی وارد کرده در فرم دیگه ای استفاده کرد؟

ممنون از کمکاتون

shotshat
سه شنبه 08 خرداد 1386, 15:58 عصر
نه قبلی حل نشد ولی این یکی اورژانسی تره. اونو گذاشتم بعدا که سرم خلوت تر شد روش بیشتر فکر کنم. اگه دوست داشتین اگه به نتیجه ای رسیدم بهتون میگم

iranrose63
سه شنبه 08 خرداد 1386, 16:07 عصر
میشه بگی چرا مشکل قبلیت حل نشد کدی که من برات گذاشتم کدیه که خودم توی تمام برنامه هام ازش استفاده می کنم پس باید درست باشه
در مورد سوال دومت یکی از راه ها اینه که Text اون TextBox رو به عنوان پارامتر به فرم دومت پاس بدی برای این منظور باید سازنده فرم دومت رو هم عوض کنی


string text="";
public Form2(string temp)
{
text=temp;
InitializeComponent();
}

موقع فراخوانی فرم دومت محتوای TextBox رو به اون پاس بده


f2=new Form2(TextBox1.Text);
f2.showdialog();

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

shotshat
سه شنبه 08 خرداد 1386, 16:22 عصر
دستت واقعا درد نکنه. کار کرد D:
سوال دوم رو چی میدونی؟

iranrose63
سه شنبه 08 خرداد 1386, 16:25 عصر
جواب سوال دومت رو هم نوشتم فقط اگه مشکلت با Login با کد من حل نشد بهم خبر بده چون من تو تمام برنامه هام ازش استفاده کردم اگه استثناء داشته باشه باید بدونم

shotshat
سه شنبه 08 خرداد 1386, 16:53 عصر
خیلی کارت درسته. اینم کار کرد. امروز از 3 نفر پرسیدم همه چرت وپرت گفتن اما دم تو یکی گرم.
اون login هم یه بررسی دیگه می کنم ایشالا اونم کار کنه.
بازم ممنون

shotshat
شنبه 19 خرداد 1386, 08:24 صبح
سلام
یک سوال دیگه از خدمت دوستان و استادان ارجمند داشتم:
چه جوری میشه یک دستور select در c# نوشت، بعد گفت اگه این دستور جوابی داشت فلان کار رو بکن؟
مثلا:
objDataAdapter.SelectCommand = new SqlCommand();
objDataAdapter.SelectCommand.Connection =objConnection;
objDataAdapter.SelectCommand.CommandText ="SELECT * from student WHERE st#='1234'";
objDataAdapter.SelectCommand.CommandType =CommandType.Text;

بعد بخوایم بگیم اگه select بالا جواب داشت فلان کار رو بکن ؟

Mojtaba_ss
شنبه 19 خرداد 1386, 09:16 صبح
نتیجه رو تو یه دیتاست بریز
System.Data.Dateset ds=new Dataset();objDataAdapter.Fill(ds,"student");حالا چک کن که دیتاست سطری داره یانهاگه سطری داشت یعنی Select نتیجه داشته
if(ds.Tables["student"].rows.count!=0){ MessageBox.Show("Return Rows: "+ds.Tables["student"].rows.count.ToString())}

shotshat
شنبه 19 خرداد 1386, 11:18 صبح
راستش برنامه من یه خورده از این مثالی که نوشتم پیچیده تره یه خورده به راهنمایی بیشتری نیاز دارم.
توی برنامه من دانشجو می تونه درس مورد نظرش رو انتخاب کنه بعدش درسی که کدش رو وارد کرده توی فایلش ثبت میشه.
حالا میخوام بگم این درس رو که کدش رو وارد کرده از جدول دروس پیش نیاز پیدا کنه ونگاه کنه ببینه پیش نیاز این درس (prelesson#) از جدول پیش نیازها توی جدول دروسی که دانشجو قبلا اخذ کرده(CaughtLesson) هست یا نه.
یعنی این دستور:
objCommand.CommandText = " SElECT * from PreLesson,CaughtLesson where PreLesson.Lesson#=@code and prelesson# IN (SELECT lesson# FROM CaughtLesson WHERE grade>=10) ";

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

private void btnAdd_Click(object sender, EventArgs e)
{
SqlConnection objConnection = new SqlConnection("Server=localhost;Database=uni1;User ID=sa;Password=;");
SqlCommand objCommand = new SqlCommand();
objCommand.Connection = objConnection;
objCommand.CommandText = "INSERT INTO choosedclass(stId,code)VALUES(@stId,@code)";
objCommand.Parameters.AddWithValue("@stId", txtID.Text);
objCommand.Parameters.AddWithValue("@code", txtCode.Text);
objConnection.Open();
objCommand.ExecuteNonQuery();
objConnection.Close();
// Display a ready status...
toolStripStatusLabel1.Text = "Added";

}
حالا چه جوری باید کدی که گفتی رو واردش کنم؟
جای student در اون کد اینجا چی باید بذارم؟

ببخشید یه خورده (فقط!!!) طولانی شد.

iranrose63
شنبه 19 خرداد 1386, 12:32 عصر
SqlCommand.CommandText=your query;
System.Data.SqlClient.SqlDataReade dr=SqlCommand.ExecuteReader();
if(dr.Read())
{
//کد ثبت
}

Mojtaba_ss
شنبه 19 خرداد 1386, 13:57 عصر
SqlCommand.CommandText=your query;
System.Data.SqlClient.SqlDataReade dr=SqlCommand.ExecuteReader();
if(dr.Read())
{
//کد ثبت
}

اینم میشه:

if(dr.HasRows)
{
//کد ثبت
}