トランザクション操作を有効にし、sqlite、mssqlなどのデータベースの一括挿入や更新にかかる時間の問題を解決します.

27524 ワード

        private void button1_Click(object sender, EventArgs e)

        {

            //Sqlite                

            DateTime starttime = DateTime.Now;

            using (SQLiteConnection con = new SQLiteConnection(connStr))

            {

                con.Open();

                DbTransaction trans = con.BeginTransaction();//         

                SQLiteCommand cmd = new SQLiteCommand(con);

                try

                {

                    cmd.CommandText = "INSERT INTO MyTable(username,useraddr,userage) VALUES(@a,@b,@c)";

                    for (int n = 0; n < 100000; n++)

                    {

                        cmd.Parameters.Add(new SQLiteParameter("@a", DbType.String)); //MySql   MySqlDbType.String

                        cmd.Parameters.Add(new SQLiteParameter("@b", DbType.String)); //MySql   MySql.Data.dll

                        cmd.Parameters.Add(new SQLiteParameter("@c", DbType.String));

                        cmd.Parameters["@a"].Value = "  " + n;

                        cmd.Parameters["@b"].Value = "  " + n;

                        cmd.Parameters["@c"].Value = 10 + n;

                        cmd.ExecuteNonQuery();

                    }

                    trans.Commit();//      

                    DateTime endtime = DateTime.Now;

                    MessageBox.Show("    ,  " + (endtime - starttime).TotalMilliseconds);



                }

                catch(Exception ex)

                {

                    MessageBox.Show(ex.Message);

                }

            }

        }



//MySql              

try

{

    using (MySqlConnection con = new MySqlConnection(MySqlStr))

    {

    con.Open();

    DbTransaction trans = con.BeginTransaction();//      



    #region       

    //    Sqlite     

    for (int i = 0; i < count; i++)

    {

        DataRow dr = ds.Tables[0].Rows[i];

        string sqlDelete = "delete from packect where proimei=@d";

        MySqlCommand cmd1 = new MySqlCommand(sqlDelete, con);                           

        cmd1.Parameters.Add(new MySqlParameter("@d", MySqlDbType.String));

        cmd1.Parameters["@d"].Value = dr["proimei"];

        cmd1.ExecuteNonQuery();

    }

    #endregion





    #region     

    //    Sqlite     

    for (int i = 0; i < count; i++)

    {

        DataRow dr = ds.Tables[0].Rows[i];

        string sqlInsert = "insert into packect(proimei, prokg, proadddate) values(@a,@b,@c)";

        MySqlCommand cmd2 = new MySqlCommand(sqlInsert, con);  

        cmd2.Parameters.Add(new MySqlParameter("@a", MySqlDbType.String));

        cmd2.Parameters.Add(new MySqlParameter("@b", MySqlDbType.Decimal));

        cmd2.Parameters.Add(new MySqlParameter("@c", MySqlDbType.DateTime));

        cmd2.Parameters["@a"].Value = dr["proimei"];

        cmd2.Parameters["@b"].Value = dr["prokg"];

        cmd2.Parameters["@c"].Value = dr["proadddate"];

        cmd2.ExecuteNonQuery();

    }

    #endregion



    trans.Commit();//        

    DateTime endtime = DateTime.Now;

    MessageBox.Show("      ,  " + (endtime - starttime).TotalMilliseconds + "  !");

    //       

    SQLiteHelper.ExecuteNonQuery(connStr, "delete from table1", CommandType.Text);

    }

}

catch (Exception ex)

{

    MessageBox.Show(ex.Message);

}





    /*

        DataTable dt = new DataTable();

        //         ,              

        dt.Columns.Add("username");

        dt.Columns.Add("useraddr");

        dt.Columns.Add("userage");

        for (int i = 0; i < 10000; i++)

        {

            dt.Rows.Add("  " + i, "  " + i, i);

        }

        DateTime starttime = DateTime.Now;

        SqlBulkCopyInsert(dt, "mytable");

        DateTime endtime = DateTime.Now;

        Response.Write("    ,  " + (endtime - starttime).TotalSeconds + " ");     

     */

    /// <summary>    

    ///   SqlBulkCopy    ,  SQLServer,              

    /// </summary>    

    /// <param name="table">   DataTable,       ,    </param>    

    /// <param name="tableName">       </param>      

    public void SqlBulkCopyInsert(DataTable table, string tableName)

    {

        SqlBulkCopy sbc = new SqlBulkCopy(MSCL.Until.GetApp("SqlConnStr"));

        sbc.DestinationTableName = tableName;



        for (int i = 0; i < table.Columns.Count; i++)

        {

            sbc.ColumnMappings.Add(table.Columns[i].ColumnName, table.Columns[i].ColumnName);

        }

        sbc.WriteToServer(table);

    } 



    /// <summary>  

    ///   SqlBulkCopy    ,  SQLServer,           

    ////// </summary>  

    /// <param name="table">   DataTable,       ,    </param>  

    /// <param name="tableName">       </param>  

    /// <param name="columns">          </param>  

    public void SqlBulkCopyInsert(DataTable table, string tableName, string[] columns)

    {

        SqlBulkCopy sbc = new SqlBulkCopy("     ");

        sbc.DestinationTableName = tableName;

        foreach (string col in columns)

        {

            sbc.ColumnMappings.Add(col, col);

        }

        sbc.WriteToServer(table);

    }





    /// <summary>  

    ///     ,Connection/Command/DataAdapter            

    ///            

    /// </summary>  

    /// <param name="ds">         </param>  

    /// <returns>     </returns>  

    public int MultyInsert(DataSet ds)

    {

        int result = 0;

        IDbConnection con = new OracleConnection("     ");

        con.Open();

        IDbCommand cmd = new OracleCommand();

        cmd.CommandText = "Insert into Member(UserName,Password) values(@name,@password)";

        IDbDataParameter namePar = cmd.CreateParameter();

        namePar.ParameterName = "@name";

        namePar.SourceColumn = "UserName";

        namePar.SourceVersion = DataRowVersion.Original;

        namePar.DbType = DbType.String;

        cmd.Parameters.Add(namePar);



        IDbDataParameter passPar = cmd.CreateParameter();

        passPar.ParameterName = "@pass";

        passPar.DbType = DbType.String;

        passPar.SourceColumn = "Password";

        passPar.SourceVersion = DataRowVersion.Original;

        cmd.Parameters.Add(passPar);



        IDbDataAdapter adpt = new OracleDataAdapter();

        adpt.InsertCommand = cmd;

        try

        {

            result = adpt.Update(ds);

        }

        catch (Exception)

        {



            throw;

        }

        finally

        {

            con.Close();

        }

        return result;

    }  



/*

 * Oracle                

*/

////  

//using System.Data;

//using System.Data.OracleClient;

//using Oracle.DataAccess.Client; //Oracle           : $Oracle    $/bin/Oracle.DataAccess.dll

//           

string connectStr = "User Id=scott;Password=tiger;Data Source=";

OracleConnection conn = new OracleConnection(connectStr);

OracleCommand command = new OracleCommand();

command.Connection = conn;

//    ,          ,       

//                 

int recc = 10000000;

command.ArrayBindCount = recc;

//       ,     ,       ,            

//      ,       ,         

command.CommandText = "insert into dept values(:deptno, :deptname, :loc)";

conn.Open();

//        ,        ,            

int[] deptNo = new int[recc];

string[] dname = new string[recc];

string[] loc = new string[recc];

//       ,          ,         

//                 ,       

OracleParameter deptNoParam = new OracleParameter("deptno", OracleType.Int32);

deptNoParam.Direction =  ParameterDirection.Input;

deptNoParam.Value = deptNo;

command.Parameters.Add(deptNoParam);

OracleParameter deptNameParam = new OracleParameter("deptname", OracleType.VarChar);

deptNameParam.Direction = ParameterDirection.Input;

deptNameParam.Value = dname; command.Parameters.Add(deptNameParam);

OracleParameter deptLocParam = new OracleParameter("loc", OracleType.VarChar);

deptLocParam.Direction = ParameterDirection.Input;

deptLocParam.Value = loc;

command.Parameters.Add(deptLocParam);

//       ,       ,            SQL

for (int i = 0; i < recc; i++)

{

    deptNo[i] = i;

    dname[i] = i.ToString();

    loc[i] = i.ToString();

}

//            SQL,       

command.ExecuteNonQuery();