PDA

View Full Version : سوال: مشکل این کد چیه فقط یک رکورد تو بانک قرار میگیره



programer1389
شنبه 22 اسفند 1388, 14:34 عصر
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{

SqlConnection conn =new SqlConnection();
conn.ConnectionString=@"data source=mydb-79be705532\sqlexpress;initial catalog=model;integrated security=true";
conn.Open();
string str_tsql = "select id,tel,name from table1";
SqlCommand cmd=new SqlCommand(str_tsql,conn);
SqlDataReader sqlreader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;
sqlreader.Read();
OleDbConnection conn2 = new OleDbConnection();
conn2.ConnectionString = @"provider=microsoft.jet.oledb.4.0;" + @"data source=d:\northwind1.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter();
da.InsertCommand = new OleDbCommand();
da.InsertCommand.Connection = conn2;

while (sqlreader.Read())
{
da.InsertCommand.CommandText = "insert into table1 (id,tel,name) values (@id,@tel,@name)";
da.InsertCommand.Parameters.AddWithValue("id" , sqlreader[0].ToString().Trim());
da.InsertCommand.Parameters.AddWithValue("tel" , sqlreader[1].ToString().Trim());
da.InsertCommand.Parameters.AddWithValue("name" , sqlreader[2].ToString().Trim());
da.InsertCommand.Connection.Open();
da.InsertCommand.ExecuteNonQuery();
da.InsertCommand.Connection.Close();
}

sqlreader.Close();


}
}
}

slashslash2009
شنبه 22 اسفند 1388, 15:47 عصر
من زیاد با sqlreader کار نکردم وارد نیستم ولی یک راهه ساده تر هم هست شما باید نتیجه select رو در یک دیتا تیبل بریزی بعدش طول اون data table رو بدست بیاری و در یک حلقه تکرار این کارو انجام بدی

for (int i = 0; i < dt1.Rows.Count; i++)

FastCode
شنبه 22 اسفند 1388, 15:52 عصر
da.InsertCommand.Connection.Open();
da.InsertCommand.ExecuteNonQuery();
da.InsertCommand.Connection.Close();
اون دستور Connection.Open فکر میکنم بیشتر از 10 میلیون CPU Cycle باشه.و در ضمن ایراد کدتون هم همینه.
باید connection رو قبل از حلقه باز کنید. و بعد از انو ببندید.
و پارامتر ها رو هم یک بار ایجاد کنید و در دفعات بعد فقط مقدار بدید.

slashslash2009
شنبه 22 اسفند 1388, 16:13 عصر
da.InsertCommand.Connection.Open();
قبل از پارامتراتون بزارید بعد از دستور insert

programer1389
دوشنبه 24 اسفند 1388, 07:39 صبح
من زیاد با sqlreader کار نکردم وارد نیستم ولی یک راهه ساده تر هم هست شما باید نتیجه select رو در یک دیتا تیبل بریزی بعدش طول اون data table رو بدست بیاری و در یک حلقه تکرار این کارو انجام بدی

for (int i = 0; i < dt1.Rows.Count; i++)


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

programer1389
دوشنبه 24 اسفند 1388, 07:46 صبح
da.InsertCommand.Connection.Open();
da.InsertCommand.ExecuteNonQuery();
da.InsertCommand.Connection.Close();
اون دستور Connection.Open فکر میکنم بیشتر از 10 میلیون CPU Cycle باشه.و در ضمن ایراد کدتون هم همینه.
باید connection رو قبل از حلقه باز کنید. و بعد از انو ببندید.
و پارامتر ها رو هم یک بار ایجاد کنید و در دفعات بعد فقط مقدار بدید.

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

slashslash2009
دوشنبه 24 اسفند 1388, 09:02 صبح
for (int i = 0; i < dataGridViewX1.Rows.Count; i++)
{
strSQL = "Insert INTO input(name,value,vahed,date,projeh,factor,part,cos t,costall)values(" +
"@nm,@val,@vh,@dt,@prj,@fc,@prt,@cst,@cstall)";
con.Open();
com = new SqlCommand(strSQL, con);
com.Parameters.Add("@nm", SqlDbType.Char).Value = dataGridViewX1.Rows[i].Cells[3].Value;
com.Parameters.Add("@val", SqlDbType.Float).Value = dataGridViewX1.Rows[i].Cells[2].Value;
com.Parameters.Add("@vh", SqlDbType.Char).Value = dataGridViewX1.Rows[i].Cells[1].Value;
com.Parameters.Add("@dt", SqlDbType.Char).Value = strdate;
com.Parameters.Add("@prj", SqlDbType.Char).Value = dataGridViewX1.Rows[i].Cells[0].Value;
com.Parameters.Add("@fc", SqlDbType.Int).Value = textBox3.Text;
com.Parameters.Add("@prt", SqlDbType.Char).Value = dataGridViewX1.Rows[i].Cells[4].Value;
com.Parameters.Add("@cst", SqlDbType.Char).Value = dataGridViewX1.Rows[i].Cells[5].Value;
com.Parameters.Add("@cstall", SqlDbType.Char).Value = dataGridViewX1.Rows[i].Cells[6].Value;
com.ExecuteNonQuery();
con.Close();
}

programer1389
دوشنبه 24 اسفند 1388, 09:25 صبح
ممنون از شما
دوستات دیگه نظری ندارن چون فکر نکنم اصلا راهش این چیزی که مد نظر ما باشه نیست چون تو خود sql server خیلی سرعت انتقال اطلاعات بیشتره

Himalaya
دوشنبه 24 اسفند 1388, 11:05 صبح
اول اینکه چرا از سطر دوم شروع میکنه
چون یه بار تو این جا (قبل از حلقه)


SqlDataReader sqlreader = cmd.ExecuteReader(CommandBehavior.CloseConnection) ;
sqlreader.Read();
OleDbConnection conn2 = new OleDbConnection();

دستوری که با رنگ قرمز مشخص کردم رو نوشتید و یه بار هم تو خود شرط while


while (sqlreader.Read())

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


da.InsertCommand.CommandText = "insert into table1 (id,tel,name) values (@id,@tel,@name)";
da.InsertCommand.Connection.Open();
da.InsertCommand.Connection.Close();

این 3 خط کد هم لازم نیست داخل حلقه باشن.... چون فقط یک بار مقدار دهی میشن
خلاصه اینکه while برنامه تون رو اینطوری بنویسید


conn2.ConnectionString = @"provider=microsoft.jet.oledb.4.0;" + @"data source=d:\northwind1.mdb;";
OleDbDataAdapter da = newOleDbDataAdapter();
da.InsertCommand = newOleDbCommand();
da.InsertCommand.Connection = conn2;
da.InsertCommand.CommandText = "insert into table1 (id,tel,name) values (@id,@tel,@name)";
da.InsertCommand.Connection.Open();
while (sqlreader.Read())
{
da.InsertCommand.Parameters.Clear();
da.InsertCommand.Parameters.AddWithValue("id", sqlreader[0].ToString().Trim());
da.InsertCommand.Parameters.AddWithValue("tel", sqlreader[1].ToString().Trim());
da.InsertCommand.Parameters.AddWithValue("name", sqlreader[2].ToString().Trim());
da.InsertCommand.ExecuteNonQuery();
}
da.InsertCommand.Connection.Close();
sqlreader.Close();