نمایش نتایج 1 تا 9 از 9

نام تاپیک: مشکل این کد چیه فقط یک رکورد تو بانک قرار میگیره

  1. #1

    مشکل این کد چیه فقط یک رکورد تو بانک قرار میگیره

    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();


    }
    }
    }

  2. #2

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

    من زیاد با sqlreader کار نکردم وارد نیستم ولی یک راهه ساده تر هم هست شما باید نتیجه select رو در یک دیتا تیبل بریزی بعدش طول اون data table رو بدست بیاری و در یک حلقه تکرار این کارو انجام بدی
    for (int i = 0; i < dt1.Rows.Count; i++)

  3. #3
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

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

                 da.InsertCommand.Connection.Open();
    da.InsertCommand.ExecuteNonQuery();
    da.InsertCommand.Connection.Close();

    اون دستور Connection.Open فکر میکنم بیشتر از 10 میلیون CPU Cycle باشه.و در ضمن ایراد کدتون هم همینه.
    باید connection رو قبل از حلقه باز کنید. و بعد از انو ببندید.
    و پارامتر ها رو هم یک بار ایجاد کنید و در دفعات بعد فقط مقدار بدید.
    آخرین ویرایش به وسیله FastCode : شنبه 22 اسفند 1388 در 16:08 عصر

  4. #4

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

    da.InsertCommand.Connection.Open();
    قبل از پارامتراتون بزارید بعد از دستور insert

  5. #5

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

    نقل قول نوشته شده توسط slashslash2009 مشاهده تاپیک
    من زیاد با sqlreader کار نکردم وارد نیستم ولی یک راهه ساده تر هم هست شما باید نتیجه select رو در یک دیتا تیبل بریزی بعدش طول اون data table رو بدست بیاری و در یک حلقه تکرار این کارو انجام بدی
    for (int i = 0; i < dt1.Rows.Count; i++)

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

  6. #6

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

    نقل قول نوشته شده توسط FastCode مشاهده تاپیک
                 da.InsertCommand.Connection.Open();
    da.InsertCommand.ExecuteNonQuery();
    da.InsertCommand.Connection.Close();

    اون دستور Connection.Open فکر میکنم بیشتر از 10 میلیون CPU Cycle باشه.و در ضمن ایراد کدتون هم همینه.
    باید connection رو قبل از حلقه باز کنید. و بعد از انو ببندید.
    و پارامتر ها رو هم یک بار ایجاد کنید و در دفعات بعد فقط مقدار بدید.
    ببینید من منظورم این نیست که مشکل کد از نظر ساخت یافته بودن چی هست مشکل الان من این هست که اگه تو sql پنج تا رکورد باشه فقط رکورد شماره 2 تو بانک اکسس ذخیره میشه
    و بقیه رکورد ها تو بانک اکسس مثل رکورد شماره 2 در بانک sqlتکرار میشن

  7. #7

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

    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();
    }

  8. #8

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

    ممنون از شما
    دوستات دیگه نظری ندارن چون فکر نکنم اصلا راهش این چیزی که مد نظر ما باشه نیست چون تو خود sql server خیلی سرعت انتقال اطلاعات بیشتره

  9. #9

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

    اول اینکه چرا از سطر دوم شروع میکنه
    چون یه بار تو این جا (قبل از حلقه)

    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();
    آخرین ویرایش به وسیله Himalaya : دوشنبه 24 اسفند 1388 در 11:30 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •