C# 如何将dataGridView里的数据批量插入access

时间:2021-12-07 09:04:18
前几天弄了半天那个csv读取用 
http://www.codeproject.com/KB/database/CsvReader.aspx
还是没搞定 具体看我最下面的留言
http://topic.csdn.net/u/20110103/22/8631dd1a-f789-4871-9f0b-882014f0e3f3.html

我纠结啊。。 弄了个别的读取方法 现在凑合实现快速读取了。
新问题来了。

这个不能直接从csv转access 因为 csv的头三行是和下面数据不一样规则的几行说明 所以我读出来后删除了前面3行
然后绑定到dataGridView 现在需要导入access数据库。。希望高手来帮帮忙 谢谢了。

由于数据量大 怎么能实现快速的将dataGridView数据批量插入access数据库 我没绑定 通过按钮导入
数据量大概3W行。。
急需啊 明天上午要写好的 我愁了。。

只能100分 会弄的来 要实例代码 thank u

26 个解决方案

#1


路过 期待答案 学习一下

#2


额 报表

#3


#4


引用 3 楼 fengqingtao2008 的回复:
http://topic.csdn.net/u/20100414/15/00b08dd3-de07-4d8a-8b80-1ce214b52d8b.html
参看,可以考虑下用事务来实现。。


这个好像是vb的哦。 不过可以试试

#5


晕哦 米人来帮忙么。 100分啊。。
呼叫梦大到来。。

#6


跟我的问题一样,只是我是SQL2008而已。

#7


该回复于2011-01-11 09:32:04被版主删除

#8


该回复于2011-01-11 10:18:43被版主删除

#9


该回复于2011-01-11 10:20:07被版主删除

#10


access不熟,但3W行的数据也很小啊,你循环插入都非常的快。

#11


该回复于2011-01-11 10:20:05被版主删除

#12


该回复于2011-01-11 10:27:01被版主删除

#13


该回复于2011-01-11 10:17:44被版主删除

#14



/// <summary>
        /// database update - delete, insert, modify
        /// </summary>
        /// <param name="cmdText"></param>
        private void ExecuteAccessNonQuery(string cmdText)
        {
            if (!dbConnectOK)
                return;

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();

                OleDbCommand cmd = new OleDbCommand(cmdText, conn);
                cmd.CommandType = CommandType.Text;

                using (OleDbTransaction trans = conn.BeginTransaction())
                {
                    cmd.Transaction = trans;

                    try
                    {
                        cmd.ExecuteNonQuery();

                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        throw;
                    }
                }

            }
        }


//遍历datagridview,构造sql语句,调用上面的方法插入

string sqlCmd = string.empty;
foreach(Datagridview row in datagridview1.Rows)
{
   sqlCmd = string.format(@"insert into Table_Name (column1, column2, ...) Values ({0}, '{1}', ...)", intValue, StringValue, ...);

   ExecuteAccessNonQuery(sqlCmd);
}

#15


循环插入
14楼方法可行

#16


引用 14 楼 rabbitlzx 的回复:
C# code

/// <summary>
        /// database update - delete, insert, modify
        /// </summary>
        /// <param name="cmdText"></param>
        private void ExecuteAccessNonQuery(string cm……

这个foeach里应该怎么获得 我当前读到的这行的每列数据呢。

#17


!dbConnectOK 这是个什么东西。

connectionString 这个我知道是连接字符串。。

#18


话说 那个我改成for循环了。

if (this.dgv_show.DataSource != null)
            {
                DialogResult result = MessageBox.Show("确定保存至数据库?(存储前请务必核对准确)", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (result == DialogResult.OK)
                {
                    for (int i = 0; i < dgv_show.Rows.Count - 1; i++)
                    {
                        string cmdInsert = String.Empty;
                        cmdInsert = "insert into web_content (data1,data2,data3)";
                        cmdInsert += "VALUES('" + this.dgv_show.Rows[i].Cells[0].Value + "'";
                        cmdInsert += ",'" + this.dgv_show.Rows[i].Cells[1].Value + "'";
                        cmdInsert += "," + this.dgv_show.Rows[i].Cells[2].Value + ")";
                        ExecuteAccessNonQuery(cmdInsert);
                    }
                }
                else
                {
                    MessageBox.Show("未存储!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

#19


该回复于2011-01-12 10:05:28被版主删除

#20


引用 16 楼 wy811007 的回复:
这个foeach里应该怎么获得 我当前读到的这行的每列数据呢
!dbConnectOK 这是个什么东西。


这个代码就是参考的,dbConnectionOK是一个bool变量,ExecuteAccessNonQuery方法我是放到一个类中的,在这个方法的构造函数里我尝试连接数据库,并且标记dbConnectionOK的值,你也可以把它去掉

foreach那块是我直接写的,语法可能不正确,下面的是正确的,使用foreach要比for好


            string v1 = string.Empty;
            string v2 = string.Empty;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                v1 = row.Cells[0].Value.ToString(); //第一列的值
                v2 = row.Cells[1].Value.ToString(); // 第二列的值
            }


#21


引用 20 楼 rabbitlzx 的回复:
引用 16 楼 wy811007 的回复:

这个foeach里应该怎么获得 我当前读到的这行的每列数据呢
!dbConnectOK 这是个什么东西。


这个代码就是参考的,dbConnectionOK是一个bool变量,ExecuteAccessNonQuery方法我是放到一个类中的,在这个方法的构造函数里我尝试连接数据库,并且标记dbConnectionOK的值,你也可以把它去掉……

额 明白了。。
不过 我那个用for的 写入数据库 感觉要卡死了 等半天才好1000行数据测试。 
但是我实际问题 要解决3W行数据。。 怎么能做到不卡呢。

#22


access好像不支持同时执行多条sql语句(像SQL Server那样),好像只能一条条执行,
下面的代码应该比你的for循环效率高


string cmdInsert = String.Empty;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                cmdInsert = string.Format(@"insert into web_content (data1,data2,data3) values('{0}','{1}','{2}')", 
                    row.Cells[0].Value.ToString(), 
                    row.Cells[1].Value.ToString(), 
                    row.Cells[2].Value.ToString());


                ExecuteAccessNonQuery(cmdInsert);
            }

#23


郁闷哦 感觉速度差不多 看来我有必要加一个导入进度条了 好显示的人性化些

#24


所谓的 批量  也是 一行一行来的

或者你  把 在 外面的整张表  insert 到 数据库表 

#25


有DataTable没?有的话我来救场.

#26


o(︶︿︶)o 唉 尼玛j8 boss 收完人家预付的钱 我给写了个半成品就给人家了 木有做细致的筛选.
反正我也离开了 但是尼玛倒霉boss竟然这个项目没给我money. 555
现在结贴了 回答的都有分

#1


路过 期待答案 学习一下

#2


额 报表

#3


#4


引用 3 楼 fengqingtao2008 的回复:
http://topic.csdn.net/u/20100414/15/00b08dd3-de07-4d8a-8b80-1ce214b52d8b.html
参看,可以考虑下用事务来实现。。


这个好像是vb的哦。 不过可以试试

#5


晕哦 米人来帮忙么。 100分啊。。
呼叫梦大到来。。

#6


跟我的问题一样,只是我是SQL2008而已。

#7


该回复于2011-01-11 09:32:04被版主删除

#8


该回复于2011-01-11 10:18:43被版主删除

#9


该回复于2011-01-11 10:20:07被版主删除

#10


access不熟,但3W行的数据也很小啊,你循环插入都非常的快。

#11


该回复于2011-01-11 10:20:05被版主删除

#12


该回复于2011-01-11 10:27:01被版主删除

#13


该回复于2011-01-11 10:17:44被版主删除

#14



/// <summary>
        /// database update - delete, insert, modify
        /// </summary>
        /// <param name="cmdText"></param>
        private void ExecuteAccessNonQuery(string cmdText)
        {
            if (!dbConnectOK)
                return;

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();

                OleDbCommand cmd = new OleDbCommand(cmdText, conn);
                cmd.CommandType = CommandType.Text;

                using (OleDbTransaction trans = conn.BeginTransaction())
                {
                    cmd.Transaction = trans;

                    try
                    {
                        cmd.ExecuteNonQuery();

                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        throw;
                    }
                }

            }
        }


//遍历datagridview,构造sql语句,调用上面的方法插入

string sqlCmd = string.empty;
foreach(Datagridview row in datagridview1.Rows)
{
   sqlCmd = string.format(@"insert into Table_Name (column1, column2, ...) Values ({0}, '{1}', ...)", intValue, StringValue, ...);

   ExecuteAccessNonQuery(sqlCmd);
}

#15


循环插入
14楼方法可行

#16


引用 14 楼 rabbitlzx 的回复:
C# code

/// <summary>
        /// database update - delete, insert, modify
        /// </summary>
        /// <param name="cmdText"></param>
        private void ExecuteAccessNonQuery(string cm……

这个foeach里应该怎么获得 我当前读到的这行的每列数据呢。

#17


!dbConnectOK 这是个什么东西。

connectionString 这个我知道是连接字符串。。

#18


话说 那个我改成for循环了。

if (this.dgv_show.DataSource != null)
            {
                DialogResult result = MessageBox.Show("确定保存至数据库?(存储前请务必核对准确)", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (result == DialogResult.OK)
                {
                    for (int i = 0; i < dgv_show.Rows.Count - 1; i++)
                    {
                        string cmdInsert = String.Empty;
                        cmdInsert = "insert into web_content (data1,data2,data3)";
                        cmdInsert += "VALUES('" + this.dgv_show.Rows[i].Cells[0].Value + "'";
                        cmdInsert += ",'" + this.dgv_show.Rows[i].Cells[1].Value + "'";
                        cmdInsert += "," + this.dgv_show.Rows[i].Cells[2].Value + ")";
                        ExecuteAccessNonQuery(cmdInsert);
                    }
                }
                else
                {
                    MessageBox.Show("未存储!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

#19


该回复于2011-01-12 10:05:28被版主删除

#20


引用 16 楼 wy811007 的回复:
这个foeach里应该怎么获得 我当前读到的这行的每列数据呢
!dbConnectOK 这是个什么东西。


这个代码就是参考的,dbConnectionOK是一个bool变量,ExecuteAccessNonQuery方法我是放到一个类中的,在这个方法的构造函数里我尝试连接数据库,并且标记dbConnectionOK的值,你也可以把它去掉

foreach那块是我直接写的,语法可能不正确,下面的是正确的,使用foreach要比for好


            string v1 = string.Empty;
            string v2 = string.Empty;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                v1 = row.Cells[0].Value.ToString(); //第一列的值
                v2 = row.Cells[1].Value.ToString(); // 第二列的值
            }


#21


引用 20 楼 rabbitlzx 的回复:
引用 16 楼 wy811007 的回复:

这个foeach里应该怎么获得 我当前读到的这行的每列数据呢
!dbConnectOK 这是个什么东西。


这个代码就是参考的,dbConnectionOK是一个bool变量,ExecuteAccessNonQuery方法我是放到一个类中的,在这个方法的构造函数里我尝试连接数据库,并且标记dbConnectionOK的值,你也可以把它去掉……

额 明白了。。
不过 我那个用for的 写入数据库 感觉要卡死了 等半天才好1000行数据测试。 
但是我实际问题 要解决3W行数据。。 怎么能做到不卡呢。

#22


access好像不支持同时执行多条sql语句(像SQL Server那样),好像只能一条条执行,
下面的代码应该比你的for循环效率高


string cmdInsert = String.Empty;
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                cmdInsert = string.Format(@"insert into web_content (data1,data2,data3) values('{0}','{1}','{2}')", 
                    row.Cells[0].Value.ToString(), 
                    row.Cells[1].Value.ToString(), 
                    row.Cells[2].Value.ToString());


                ExecuteAccessNonQuery(cmdInsert);
            }

#23


郁闷哦 感觉速度差不多 看来我有必要加一个导入进度条了 好显示的人性化些

#24


所谓的 批量  也是 一行一行来的

或者你  把 在 外面的整张表  insert 到 数据库表 

#25


有DataTable没?有的话我来救场.

#26


o(︶︿︶)o 唉 尼玛j8 boss 收完人家预付的钱 我给写了个半成品就给人家了 木有做细致的筛选.
反正我也离开了 但是尼玛倒霉boss竟然这个项目没给我money. 555
现在结贴了 回答的都有分