PDA

View Full Version : سوال: مشکل این کد چیه؟؟



saba106
جمعه 21 اسفند 1388, 16:33 عصر
سلام. مشکل کد زیر چیه؟؟


DataTable dt = new DataTable();
datetoday = ps.DateToPersian(DateTime.Now).ShortDate.ToString( );
SqlCommand cmd = new SqlCommand("select * from users where iduser in (select iduser from amanat where dateback1 =" + datetoday + ")", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows == true)
{
flag = 1;
dt.Load(reader);
foreach (DataRow row in dt.Rows)
{
iduser = row[0].ToString();
nameuser = row[1].ToString();
family = row[2].ToString();
semat = row[3].ToString();
codemeli = row[5].ToString();
tell = row[6].ToString();
address = row[7].ToString();
}
}
reader.Close();
con.Close();
status = "در حال انتظار ";
if (flag == 1)
{
SqlCommand cmd1 = new SqlCommand();
cmd1.CommandText = "dbo.insertbinazmi";
cmd1.Connection = con;
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.AddWithValue("@iduser", iduser);
cmd1.Parameters.AddWithValue("@nameuser", nameuser);
cmd1.Parameters.AddWithValue("@family", family);
cmd1.Parameters.AddWithValue("@semat", semat);
cmd1.Parameters.AddWithValue("@codemeli", codemeli);
cmd1.Parameters.AddWithValue("@status", status);
cmd1.Parameters.AddWithValue("@tell", tell);
cmd1.Parameters.AddWithValue("@address", address);
//cmd.Parameters.Add(picparameter);
con.Open();
cmd1.ExecuteNonQuery();
con.Close();
getmessage2(iduser);
}

اروری که میده میگه نمیتونه دو تا کلید اصلی مشابه وارد جدول کنه در صورتیکه جدول خالیه. مشکل از چیه؟
یه سوال دیگه هم داشتم reader.hasrows میگه که اگه datareader سطری داشت دستورات مشخص شده رو اجرا کنه دیگه نه؟ وقتی که شرط selectcommand برقرار نباشه هم باز دستورات رو رجرا میکنه و همون ارور رو میده. مشکل از چیه؟
مرسی

hakelberfin
شنبه 22 اسفند 1388, 01:36 صبح
سلام

اروری که میده میگه نمیتونه دو تا کلید اصلی مشابه وارد جدول کنه
کلید اصلیتون چیه؟ منظور از مشابه چیه؟
لطفا کد SP ای که عمل Insert رو انجام میده رو بذارید.
کد بعد if رو به این صورت تغییر بده


if (reader.HasRows == true)
{
reader.Read();
flag = 1;
dt.Load(reader);


این متغییر ها(iduser و ...) از چه نوعی هستند؟ منظور از نوع متغییر های تعریف شده یا TextBox یا ...

iduser = row[0].ToString();
nameuser = row[1].ToString();
family = row[2].ToString();
semat = row[3].ToString();
codemeli = row[5].ToString();
tell = row[6].ToString();
address = row[7].ToString();

و یه توضیح مختصر در مورد کاری که میخوای انجام بدی بگو

saba106
شنبه 22 اسفند 1388, 17:52 عصر
سلام. من میخام اول برنامه یه کلاس اجرا بشه که اگه امانت هایی که تاریخ برگشتشون از تاریخ امروز گذشته به جدول دیگه ای مشخصاتشونو وارد کنم. نوع تمام متغیرها از نوع nchar هست. بانکم پاک شده بود به. وقتی sp شو نوشتم اینجا میذارم.
کلید اصلی iduser هس. ارورش مثل زمانیه که مثلا بخوایم iduser=12 رو وارد کنیم در حالیکه همچین iduser ای تو جدول هست.
مرسی

saba106
شنبه 22 اسفند 1388, 18:04 عصر
sp:


ALTER PROCEDURE dbo.insertbinazmi

(
@iduser nchar(20),
@nameuser nchar(50),
@family nchar(50),
@semat nchar(20),
@codemeli nchar(10),
@tell nchar(15),
@address nchar(500),
@status nchar(15),
@day_ekhraj nchar(10)
)

AS
SET NOCOUNT ON;

insert into mahruman(iduser,nameuser,family,semat,codemeli,tel l,address,status,day_ekhraj)
values(@iduser,@nameuser,@family,@semat,@codemeli, @tell,@address,@status,@day_ekhraj)
RETURN

به کدها day_ekhraj هم اضافه شده

Himalaya
شنبه 22 اسفند 1388, 18:49 عصر
DataTable dt = newDataTable();
.
.
.
if (reader.HasRows == true)
{
flag = 1;
dt.Load(reader);
foreach (DataRow row in dt.Rows)
{
iduser = row[0].ToString();
nameuser = row[1].ToString();
family = row[2].ToString();
semat = row[3].ToString();
codemeli = row[5].ToString();
tell = row[6].ToString();
address = row[7].ToString();
}
}

این چه کاریه؟
اومدید یه دیتا تیبل تعریف کردید بعد با ریدر کوئری گرفتید و نتیجه کوئری که الان تو ریدر هست رو ریختید تو دیتا تیبل و بعد از دیتا تیبل خوندید!!!
خوب از همون ریدر سطر به سطر بخون دیگه...احتیاجی هم به foreach و دیتا تیبل نداری


while (reader.Read())
{
iduser = reader.GetSqlString(0).Value;
nameuser = reader.GetSqlString(1).Value;
family = reader.GetSqlString(2).Value;
semat = reader.GetSqlString(3).Value;
codemeli = reader.GetSqlString(5).Value;
tell = reader.GetSqlString(6).Value;
address = reader.GetSqlString(7).Value;
}

البته به نظر میرسه کوئری اولت باید همیشه یه سطر برکردونه...چون در غیر این صورت همیشه نتیجه آخرین سطر از جواب کوئری تو این متغیرها ریحته میشه

ضمن اینکه تو کوئری دوم که واسه ورود اطلاعات هستش شما 8 پارامتر رو مقداردهی کردی در حالی که تو پراسیژر 9 پارامتر داری ...تو کوئری دوم تاریخ رو وارد نکردید

saba106
شنبه 22 اسفند 1388, 20:07 عصر
مرسی. تعداد پارامترهارو درس کردم.

saba106
شنبه 22 اسفند 1388, 20:09 عصر
مرسی. تعداد پارامترهارو درس کردم.
من مبتدی هستم:خجالت: این روش رو تو یه پروژه دیدم ازش استفاده کردم.
به هر حال مرسی از لطفتون

saba106
یک شنبه 23 اسفند 1388, 20:33 عصر
البته به نظر میرسه کوئری اولت باید همیشه یه سطر برکردونه...چون در غیر این صورت همیشه نتیجه آخرین سطر از جواب کوئری تو این متغیرها ریحته میشه

میشه برای حل این مشکل از یک آرایه استفاده کنم و به اندازه عناصرش تو جدول hnsert کنم؟

Himalaya
یک شنبه 23 اسفند 1388, 21:35 عصر
خوب چندتا کار میتونی انجام بدی، یکیش هم اینه
یه نکته:چه لزومی داره که مقادیر هر سطری رو که توسط کوئری اول به دست میاری تو چند تا متغیر بریزی؟

به نظرم اون متغیرها رو فقط واسه اینکه تو کوئری اینزرت ازشون استفاده کنی تعریف و مقداردهی کردی...
خوب احتیاجی به اونا نیست ...خاصیت ریدر اینه که وقتی شما یه ریدر رو با یه سلکت پر میکنید اگه نتیجه کوئری مثلا 10 تا سطر داشته باشه با 5 ستون، این جدول عینا تو ریدر قرار میگیره و بعد از این شما هر دفعه که دستور reader.read() رو اجرا میکنید میتونید به سطر بعدی دسترسی داشته باشید.به خاطر همین گفتم
while (reader.Read()) نتیجه آخرین سطر رو واسه شما تو متغیرها قرار میده (یه پیمایش رو به جلو تو سطرهایی که در ریدر قرار گرفتن)
کافیه تو کدهای زیر


while (reader.Read())
{
iduser = reader.GetSqlString(0).Value;
nameuser = reader.GetSqlString(1).Value;
family = reader.GetSqlString(2).Value;
semat = reader.GetSqlString(3).Value;
codemeli = reader.GetSqlString(5).Value;
tell = reader.GetSqlString(6).Value;
address = reader.GetSqlString(7).Value;
}

قسمت قرمز رنگ رو پاک کنید و دستور اینزرت خودتونو تو اون بنویسید و مثلا از

reader.GetSqlString(0).Value
به عنوان یکی از پارامترهای دستور اینزرت استفاده کنید (معادل همون iduser هستش، پس دیگه به متغیری به اسم iduser احتیاجی نیست)
یه چیز دیگه ...موقع خوندن مقادیر از ریدر به نوع اون مقادیر تو پایگاه داده خودتون توجه کنید...اگه مثلا تو جدولتون یه ستون از نوع int وجود داره با


reader.GetSqlInt32(7).Value

قابل دسترسی هستش ( البته اگه سلکتش کرده باشید). اون اندیس هم اندیس ستونتون تو دستور سلکت هستش که از 0 شروع میشن

saba106
یک شنبه 23 اسفند 1388, 22:19 عصر
کدهارو به این صورت تغییر دادم:


SqlCommand cmd1 = new SqlCommand();
datetoday = ps.DateToPersian(DateTime.Now).year.ToString() + ps.DateToPersian(DateTime.Now).month.ToString() + ps.DateToPersian(DateTime.Now).day.ToString();
SqlCommand cmd = new SqlCommand("select * from users where iduser in (select iduser from amanat where dateback1 <" + datetoday + ")", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows == true)
{
while(reader.Read())
{
cmd1.CommandText = "dbo.insertbinazmi";
cmd1.Connection = con;
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.AddWithValue("@iduser", reader.GetSqlString(0).Value);
cmd1.Parameters.AddWithValue("@nameuser", reader.GetSqlString(1).Value);
cmd1.Parameters.AddWithValue("@family", reader.GetSqlString(2).Value);
cmd1.Parameters.AddWithValue("@semat", reader.GetSqlString(3).Value);
cmd1.Parameters.AddWithValue("@codemeli", reader.GetSqlString(5).Value);
cmd1.Parameters.AddWithValue("@status", "در حال انتظار ");
cmd1.Parameters.AddWithValue("@tell", reader.GetSqlString(6).Value);
cmd1.Parameters.AddWithValue("@address", reader.GetSqlString(7).Value);
cmd1.Parameters.AddWithValue("@day_ekhraj", "0");
//cmd.Parameters.Add(picparameter);
}
}
reader.Close();
con.Close();
con.Open();
cmd1.ExecuteNonQuery();
FMessageBox.Show("لطفا برای مشاهده بی نظمی به فرم محروم کردن اعضا مراجعه کنید!", "ثبت بی نظمی", FMessageBoxButtons.OK, FMessageBoxIcons.Warning, FMessageBoxDefaultButtons.Button1);
con.Close();

اطلاعات تو جدول درج شد. ولی بعد از درج این ارور رو داد:

Violation of PRIMARY KEY constraint 'PK_mahruman'. Cannot insert duplicate key in object 'dbo.mahruman'.
The statement has been terminated.

saba106
یک شنبه 23 اسفند 1388, 22:23 عصر
جدول خالی بوده و این اولین رکوردش بود. و رکوردی با iduser مشابه اون تو جول نیست

Himalaya
یک شنبه 23 اسفند 1388, 22:31 عصر
مطمئنید که همه سطرها ثبت شد؟؟؟ چون اینطوری دستور cmd1.ExecuteNonQuery(); فقط یکبار اجرا میشه و فکر کنم باز فقط سطر آخر رو تو جدول میریزه... این دستور باید تو حلقه باشه تا به ازای هر سطر یکبار اجرا بشه ... این ارور هم داره میگه که شما سعی کردید تو ستون کلیدتون اطلاعات تکراری وارد کنید...خوب شما که پارامترها رو دارید به sp پاس میدید مطمئنا کلید هم جزئ همون پارامترهاست... تو همون sp چک کنید که اگه سطری وجود داره که مقدار فیلد ستونش با کلید ارسالی یکی هست عمل درج انجام نشه (از sp خیلی وقته استفاده نکردم ولی فکر کنم بشه این کار رو کرد... هرچند تو خود vs هم میشه این کار رو کرد که این نیازمند نوشتن یه سلکت بیشتره
karaji_333 آیدی یاهوی منه... اگه میتونی با مسنجر ان شو...یه پی ام بده...این طوری خیلی کندپیش میره

saba106
یک شنبه 23 اسفند 1388, 22:40 عصر
اگه سطرها بیشتر از یکی باشن ارور میده. اگه cmd1.ExecuteNonQuery();رو بعد از پارامترها بذارم به خاطر reader ارور میده. راهی که گفتین هم امتحان میکنم. مرسی

saba106
یک شنبه 23 اسفند 1388, 22:55 عصر
sp رو براش نوشتم:


ALTER PROCEDURE dbo.insertbinazmi

(
@iduser nchar(20),
@nameuser nchar(50),
@family nchar(50),
@semat nchar(20),
@codemeli nchar(10),
@tell nchar(15),
@address nchar(500),
@status nchar(15),
@day_ekhraj nchar(10)
)

AS
SET NOCOUNT ON;

if not exists(select * from mahruman where iduser=@iduser)
begin
insert into mahruman(iduser,nameuser,family,semat,codemeli,tel l,address,status,day_ekhraj)
values(@iduser,@nameuser,@family,@semat,@codemeli, @tell,@address,@status,@day_ekhraj)
end
RETURN

با sp جدید messagebox تو یه حلقه بینهایت میافته و برنامه رو همون میمونه. نمیدونم چرا اینجوری میشه:گریه:

Himalaya
یک شنبه 23 اسفند 1388, 23:45 عصر
مسیج باکس رو ه تو while نزار... اونو بزار بیرون while ... بزار برنامه کارشو بکنه :گیج:

saba106
دوشنبه 24 اسفند 1388, 00:30 صبح
مسیج باکس رو ه تو while نزار... اونو بزار بیرون while ... بزار برنامه کارشو بکنه :گیج:
messagebox بیرون while هست. ولی مرتبا اجرا میشه

saba106
چهارشنبه 04 فروردین 1389, 19:35 عصر
سلام سال نو همگی مبارک
من کدم رو به صورت زیر تغییر دادم


i = 0;
flag = 0;
flag1 = 0;
flag2 = 0;
string[] iduser = new string[100];
string[] nameuser = new string[100];
string[] family = new string[100];
string[] codemeli = new string[100];
string[] tell = new string[100];
string[] address = new string[100];
datetoday = ps.DateToPersian(DateTime.Now).year.ToString() + ps.DateToPersian(DateTime.Now).month.ToString() + ps.DateToPersian(DateTime.Now).day.ToString();
SqlCommand cmd = new SqlCommand("select * from student where iduser in (select iduser from amanat where dateback1 <" + datetoday + ")", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows == true)
{
while(reader.Read())
{
iduser[i] = reader.GetSqlString(0).Value;
nameuser[i] = reader.GetSqlString(1).Value;
family[i] = reader.GetSqlString(2).Value;
codemeli[i] = reader.GetSqlString(4).Value;
tell[i] = reader.GetSqlString(5).Value;
address[i] = reader.GetSqlString(6).Value;
i++;
flag = 1;
}
}
reader.Close();
con.Close();
int j = 0;
if (flag == 1)
{
for (j = 0; j <= i; j++)
{
SqlCommand cmd1 = new SqlCommand();
cmd1.CommandText = "dbo.insertbinazmi";
cmd1.Connection = con;
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.AddWithValue("@iduser", iduser[j]);
cmd1.Parameters.AddWithValue("@nameuser", nameuser[j]);
cmd1.Parameters.AddWithValue("@family", family[j]);
cmd1.Parameters.AddWithValue("@codemeli", codemeli[j]);
cmd1.Parameters.AddWithValue("@status", "در حال انتظار ");
cmd1.Parameters.AddWithValue("@tell", tell[j]);
cmd1.Parameters.AddWithValue("@address", address[j]);
cmd1.Parameters.AddWithValue("@date_ekhraj", "0");
//cmd.Parameters.Add(picparameter);
con.Open();
cmd1.ExecuteNonQuery();
flag1 = 1;
con.Close();
j++;
}

}
return flag1;

وقتی که بیشتر از یک رکورد باید ثبت بشه error زیر رو میده

Procedure or function 'insertbinazmi' expects parameter '@iduser', which was not supplied.
من واقعا نمیدونم مشکل از کجاست. میشه کمکم کنین؟؟
مرسی

Himalaya
چهارشنبه 04 فروردین 1389, 19:47 عصر
اول اینکه شاید اینا مفهومشون فرق کنه ولی اینجا هر دوشون یه کار انجام میدن... if رو حذف کن

while(reader.Read())


if (reader.HasRows == true)

دوم اینکه همین چیزایی که داری میگی رو تو یه برنامه کوچولو موچولو :چشمک: قرار بده و اونو بزار اینجا تا ببینیم چیه

saba106
چهارشنبه 04 فروردین 1389, 20:09 عصر
همین چیزایی که داری میگی رو تو یه برنامه کوچولو موچولو :چشمک: قرار بده و اونو بزار اینجا تا ببینیم چیه
باشه برنامشو که نوشتم همین جا میذارم. مرسی

saba106
چهارشنبه 04 فروردین 1389, 21:11 عصر
حجم برنامه زیاد شد نشد اینجا بذارم
دانلود: http://www.4shared.com/account/file/248467932/e424e64/WindowsFormsApplication2.html
فقط قبل از اجرا Table2 رو خالی کنین تا همون error رو بده
برنامه با ویژوال 2010 نوشته شده

Himalaya
پنج شنبه 05 فروردین 1389, 14:27 عصر
اول اینکه نوع ستون توی دیتابیسو nvarchar بگیر (یه پیشنهاد بود)
دوم اینکه j < i + 1 اشتباهه (j < i) اروری هم که میداد واسه همین بود
سوم اینکه لازم نیست چند بار کانکشن رو باز کنی و ببندی ... اول اینو بزار


if (con.State == ConnectionState.Closed)
con.Open();

وقتی عملیات انجام شد در آخر اونو ببند
چهارم اینکه اصلا خطاها رو مدیریت نکردی (اگه وسط کار اروری به وجود اومد اونوقت چیکار میکنی (ضمن اینکه بهتره کانکشنت رو توی finally ببندی
پنجم اینکه خود for داره به j یکی یکی اضافه میکنه... لازم نیست شما تو حلقه ++j بنویسی
ششم اینکه اصلا روشت واسه ریختن یه سری اطلاعات از یه جدول یه جدول دیگه درست نیست (بیشتر منظورم استفاده از چندتا آرایه به طول 100 هستش) اگه قرار باشه 101 سطر به جدول دوم منتقل بشه چی؟؟؟ البته منظورم این نبود که بری طول آرایه هاتو بیشتر کنی)


if (flag == 1)
{
if (con.State == ConnectionState.Closed)
con.Open();
for (int j = 0; j < i; j++)
{
SqlCommand cmd1 = newSqlCommand("insert into Table2(id,name) values(@id,@name)", con);
cmd1.Parameters.AddWithValue("@id", id[j]);
cmd1.Parameters.AddWithValue("@name", name[j]);
cmd1.ExecuteNonQuery();
}
con.Close();
}



کد بالا کارتونو راه میندازه ولی بجای استفاده از آرایه از این استفاده کنید
نکته: con1 دقیقا همون con هستش ولی اگه بخواید به جای con1 از con استفاده کنید ارور زیر رو بهتون میده
There is already an open DataReader associated with this Command which must be closed first



SqlCommand cmd = new SqlCommand("select * from Table1 where name='sara'", con);
if (con.State == ConnectionState.Closed)
con.Open();
SqlDataReader sqlreader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;
SqlDataAdapter da = new SqlDataAdapter();
da.InsertCommand = new SqlCommand();
da.InsertCommand.Connection = con1;
da.InsertCommand.CommandText = "insert into Table2(id,name) values(@id,@name)";
if (con1.State == ConnectionState.Closed)
con1.Open();
while (sqlreader.Read())
{
da.InsertCommand.Parameters.Clear();
da.InsertCommand.Parameters.AddWithValue("id", sqlreader.GetSqlString(0).Value);
da.InsertCommand.Parameters.AddWithValue("name", sqlreader.GetSqlString(1).Value);
da.InsertCommand.ExecuteNonQuery();
}
sqlreader.Close();
// Refresh grid 2
da.SelectCommand = new SqlCommand("Select * from Table2", con);
DataSet ds = new DataSet();
da.Fill(ds, "Table2");
dataGridView2.DataSource = ds;
dataGridView2.DataMember = "Table2";
con.Close();
con1.Close();

saba106
پنج شنبه 05 فروردین 1389, 15:00 عصر
واقعا از لطفتون ممنونم. مشکل برطرف شد.:قلب:
تو حلقه j++ رواز بی حواسی گذاشته بودم:لبخند:
از راهنماییتون واقعا ممنونم.

FastCode
جمعه 06 فروردین 1389, 00:06 صبح
1.شما میدونید IDENT_CURRENT چیه؟
2.میدونی با اون table schema تمام sql رو بردی زیر سوال؟

id bigint,
iduser bigint,
status tinyint,
day_ekhraj int
فکر میکنم این که من دادم 53 برابر سریعتره.

Himalaya
جمعه 06 فروردین 1389, 02:08 صبح
1.شما میدونید IDENT_CURRENT چیه؟
2.میدونی با اون table schema تمام sql رو بردی زیر سوال؟

:متفکر:
با من بودی یا با کسی که این تاپیکو ایجاد کرده؟

saba106
یک شنبه 08 فروردین 1389, 17:27 عصر
کد بالا کارتونو راه میندازه ولی بجای استفاده از آرایه از این استفاده کنید
نکته: con1 دقیقا همون con هستش ولی اگه بخواید به جای con1 از con استفاده کنید ارور زیر رو بهتون میده
There is already an open DataReader associated with this Command which must be closed first



SqlCommand cmd = newSqlCommand("select * from Table1 where name='sara'", con);
if (con.State == ConnectionState.Closed)
con.Open();
SqlDataReader sqlreader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;
SqlDataAdapter da = newSqlDataAdapter();
da.InsertCommand = newSqlCommand();
da.InsertCommand.Connection = con1;
da.InsertCommand.CommandText = "insert into Table2(id,name) values(@id,@name)";
if (con1.State == ConnectionState.Closed)
con1.Open();
while (sqlreader.Read())
{
da.InsertCommand.Parameters.Clear();
da.InsertCommand.Parameters.AddWithValue("id", sqlreader.GetSqlString(0).Value);
da.InsertCommand.Parameters.AddWithValue("name", sqlreader.GetSqlString(1).Value);
da.InsertCommand.ExecuteNonQuery();
}
sqlreader.Close();
// Refresh grid 2
da.SelectCommand = newSqlCommand("Select * from Table2", con);
DataSet ds = newDataSet();
da.Fill(ds, "Table2");
dataGridView2.DataSource = ds;
dataGridView2.DataMember = "Table2";
con.Close();
con1.Close();

مرسی از لطفتون

saba106
یک شنبه 08 فروردین 1389, 18:19 عصر
1.شما میدونید IDENT_CURRENT چیه؟

اگه منظورتون من بودم نه نمیدونم چیه


2.میدونی با اون table schema تمام sql رو بردی زیر سوال؟

id bigint,
iduser bigint,
status tinyint,
day_ekhraj int
فکر میکنم این که من دادم 53 برابر سریعتره.
راستش این اولین برنامه c# من بود و برای یادگیری نوشتمش. چون تازه شروع کردم اطلاعات زیادی ندارم. مرسی از راهنماییتون

FastCode
دوشنبه 09 فروردین 1389, 01:04 صبح
راستش این اولین برنامه C#‎ من بود و برای یادگیری نوشتمش. چون تازه شروع کردم اطلاعات زیادی ندارم. مرسی از راهنماییتون
اگر واقعا" اولین برنامتون بوده باید بگم که عالی کار کردید.

منظورم از IDENT_CURRENT این بود که راجع بهش تحقیق کنید جون مقداری از مشکلتون رو حل میکنه.

saba106
دوشنبه 09 فروردین 1389, 21:23 عصر
سلام من از کدها به صورت زیر استفاده کردم


flag1 = 0;
datetoday = ps.DateToPersian(DateTime.Now).year.ToString() + ps.DateToPersian(DateTime.Now).month.ToString() + ps.DateToPersian(DateTime.Now).day.ToString();
SqlCommand cmd = new SqlCommand("select * from student where iduser in (select iduser from amanat where (dateback1 <" + datetoday + ") OR (dateback1 =" + datetoday + "))", con);
if (con.State == ConnectionState.Closed)
con.Open();
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;
SqlCommand cmd1 = new SqlCommand();
cmd1.CommandText = "dbo.insertbinazmi";
cmd1.Connection = con1;
cmd1.CommandType = CommandType.StoredProcedure;
if (con1.State == ConnectionState.Closed)
con1.Open();
while (reader.Read())
{
cmd1.Parameters.Clear();
cmd1.Parameters.AddWithValue("@iduser", reader.GetSqlString(0).Value);
cmd1.Parameters.AddWithValue("@nameuser", reader.GetSqlString(1).Value);
cmd1.Parameters.AddWithValue("@family", reader.GetSqlString(2).Value);
cmd1.Parameters.AddWithValue("@codemeli", reader.GetSqlString(4).Value);
cmd1.Parameters.AddWithValue("@status", "در حال انتظار ");
cmd1.Parameters.AddWithValue("@tell", reader.GetSqlString(5).Value);
cmd1.Parameters.AddWithValue("@address", reader.GetSqlString(6).Value);
cmd1.Parameters.AddWithValue("@date_ekhraj", "0");
cmd1.Parameters.AddWithValue("@flag", flag1);
flag1 = cmd1.ExecuteNonQuery();
}
reader.Close();
con.Close();
con1.Close();
return flag1;

به جای dataadaptor از sqlcommand استفاده کردم. چون ارور میداد. همچنین تو برنامه از storedprocedure استفاده کردم که یه مقدار رو برمی گردونه


ALTER PROCEDURE dbo.insertbinazmi

(
@iduser nchar(20),
@nameuser nchar(50),
@family nchar(50),
@codemeli nchar(10),
@tell nchar(15),
@address nchar(500),
@status nchar(15),
@date_ekhraj nchar(10),
@flag int output
)

AS
SET NOCOUNT ON;

if not exists(select * from mahruman where iduser=@iduser)
begin
insert into mahruman(iduser,nameuser,family,codemeli,tell,addr ess,status,date_ekhraj)
values(@iduser,@nameuser,@family,@codemeli,@tell,@ address,@status,@date_ekhraj)
set @flag=1
end
RETURN (@flag)

کد بالا پروسیجر هست.
flag رو برای این گذاشتم که وقتی درج انجام شد به کاربر درج شدن رو خبر بده. این توابع تو یه کلاس انجام میشه که مقدار همون flag به فرم اصلی فرستاده میشه تا تو یه notification درج رو به کاربر خبر بده. ولی حالا این notification کار نمیکنه. ولی وقتی که آرایه ها بودن کار میکرد.
تو کدهایی که دادین نمیشه از پروسیجر استفاده کرد که این مشکل پیش اومده یا من درست ازشون استفاده نکردم؟
پیشاپیش از کمکتون ممنونم

saba106
چهارشنبه 11 فروردین 1389, 15:38 عصر
سلام
CommandBehavior تو کد زیر برای چی استفاده شده؟

SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;