C#DataGridView数据批量插入数据库中(测试未果)
datagridview表格的数据要导入后台数据库表中时,如果记录比较多,用SQL速度慢,尝试用批量导入,未能成功,继续努力;
using Npgsql; using NpgsqlTypes; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TestPgsqlTrans { public partial class Form1 : Form { static string ConnectionString = DBHelperPg.ConnectionString; NpgsqlConnection conn = new NpgsqlConnection(ConnectionString); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //打开文件对话框 OpenFileDialog ofd = new OpenFileDialog(); string importFileName; if (ofd.ShowDialog() == DialogResult.OK) { importFileName = ofd.FileName; dataGridView1.DataSource = Excel.ExcelToDataTable(importFileName, true); } } private void button2_Click(object sender, EventArgs e) { } private void button4_Click(object sender, EventArgs e) { DateTime beginTime = DateTime.Now; string sql; // 建立临时表 sql = @"CREATE UNLOGGED TABLE dinners ( name varchar(30) default '', devicename varchar(30) default '', department varchar(30) default '', date varchar(30) default '', time varchar(30) default '', flag varchar(30) default '', type varchar(30) default '', authortype varchar(30) default '', userid varchar(30) default '', amont decimal(10,2))"; //int t = PostgreHelper.ExecuteSQL(sql); string tmpTabelName = "dinners"; string id, name, devicename, department, date, time, flag, type, authortype, userid, amont; string connectionString = PostgreHelper.ConnectionString; for (int i = 0; i < dataGridView1.RowCount; i++) { name = Convert.ToString(dataGridView1.Rows[i].Cells["姓名"].Value).Trim(); devicename = Convert.ToString(dataGridView1.Rows[i].Cells["设备"].Value).Trim(); department = Convert.ToString(dataGridView1.Rows[i].Cells["部门"].Value).Trim(); date = Convert.ToString(dataGridView1.Rows[i].Cells["日期"].Value).Trim(); time = Convert.ToString(dataGridView1.Rows[i].Cells["时间"].Value).Trim(); flag = Convert.ToString(dataGridView1.Rows[i].Cells["通行标签"].Value).Trim(); type = Convert.ToString(dataGridView1.Rows[i].Cells["识别类型"].Value).Trim(); authortype = Convert.ToString(dataGridView1.Rows[i].Cells["权限类型"].Value).Trim(); userid = Convert.ToString(dataGridView1.Rows[i].Cells["用户ID"].Value).Trim(); amont = "0"; sql = "Insert into " + tmpTabelName + " (name,devicename,department,date,time,flag,type,authortype,userid,amont)"; sql += " values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}',{9})"; sql = String.Format(sql, name, devicename, department, date, time, flag, type, authortype, userid, amont); DBHelperPg.ExecuteSQL(sql); } // MessageBox.Show("数据保存完成!"); MessageBox.Show("页面导入完成,用时" + (DateTime.Now - beginTime).ToString(), "提示"); } private void button2_Click_1(object sender, EventArgs e) { string connString = PostgreHelper.ConnectionString; string sql = ""; DateTime beginTime = DateTime.Now; string tmpTabelName = "dinners"; string id, name, devicename, department, date, time, flag, type, authortype, userid, amont; using (var conn = new NpgsqlConnection(connString)) { //启用事务后,这个连接只打开一次,不用每次打开又关闭 conn.Open(); using (var transaction = conn.BeginTransaction()) { try { for (int i = 0; i < dataGridView1.RowCount; i++) { name = Convert.ToString(dataGridView1.Rows[i].Cells["姓名"].Value).Trim(); devicename = Convert.ToString(dataGridView1.Rows[i].Cells["设备"].Value).Trim(); department = Convert.ToString(dataGridView1.Rows[i].Cells["部门"].Value).Trim(); date = Convert.ToString(dataGridView1.Rows[i].Cells["日期"].Value).Trim(); time = Convert.ToString(dataGridView1.Rows[i].Cells["时间"].Value).Trim(); flag = Convert.ToString(dataGridView1.Rows[i].Cells["通行标签"].Value).Trim(); type = Convert.ToString(dataGridView1.Rows[i].Cells["识别类型"].Value).Trim(); authortype = Convert.ToString(dataGridView1.Rows[i].Cells["权限类型"].Value).Trim(); userid = Convert.ToString(dataGridView1.Rows[i].Cells["用户ID"].Value).Trim(); amont = "0"; sql = "Insert into " + tmpTabelName + " (name,devicename,department,date,time,flag,type,authortype,userid,amont) values "; sql += " ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}',{9})"; sql = String.Format(sql, name, devicename, department, date, time, flag, type, authortype, userid, amont); using (var cmd = new NpgsqlCommand(sql, conn)) { cmd.ExecuteNonQuery(); } } transaction.Commit(); MessageBox.Show("页面导入完成,用时" + (DateTime.Now - beginTime).ToString(), "提示"); } catch (Exception) { transaction.Rollback(); } } } } // //public void BulkCopy(string tableName, DataTable dt) //{ // List<string> lsColNames = new List<string>(); // for (int i = 0; i < dt.Columns.Count; i++) // { // lsColNames.Add($"\"{dt.Columns[i].ColumnName}\""); // } // string copyString = $"COPY \"{tableName}\" ( {string.Join(",", lsColNames) } ) FROM STDIN (FORMAT BINARY)"; // using (NpgsqlConnection conn = new NpgsqlConnection(ConnectionString)) // { // if (conn.State == ConnectionState.Closed) // conn.Open(); // var writer = conn.BeginBinaryImport(copyString); // foreach (DataRow row in dt.Rows) // { // writer.StartRow(); // IEnumerable<KeyValuePair<string, JToken>> JRowData = DataConvert.ToJObject(row); // foreach (var kvp in JRowData) // { // NpgsqlParameter colParam = GetParameter(tableName, kvp); // writer.Write(colParam.Value, colParam.NpgsqlDbType); // } // } // writer.Complete(); // conn.Close(); // } //} //public NpgsqlParameter GetParameter(string tableName, KeyValuePair<string, JToken> columnValuePair) //{ // string columnDBypeName = _DBTableDefProvider.GetTableColumn(tableName, columnValuePair.Key).data_type.ToLower(); // NpgsqlParameter p = new NpgsqlParameter("@" + columnValuePair.Key, // columnDBypeName == "timestamp" || columnDBypeName == "timestamp without time zone" ? NpgsqlDbType.Timestamp // : columnDBypeName == "timestamp with time zone" ? NpgsqlDbType.TimestampTz // : columnDBypeName == "date" ? NpgsqlDbType.Date // : columnDBypeName == "time" || columnDBypeName == "time without time zone" ? NpgsqlDbType.Time // : columnDBypeName == "time with time zone" ? NpgsqlDbType.TimeTz // : columnDBypeName == "smallint" ? NpgsqlDbType.Smallint // : columnDBypeName == "integer" || columnDBypeName == "serial" ? NpgsqlDbType.Integer // : columnDBypeName == "bigint" || columnDBypeName == "bigserial" ? NpgsqlDbType.Bigint // : columnDBypeName == "double precision" ? NpgsqlDbType.Double // : columnDBypeName == "real" ? NpgsqlDbType.Real // : columnDBypeName == "boolean" ? NpgsqlDbType.Boolean // : columnDBypeName == "uuid" ? NpgsqlDbType.Uuid // : columnDBypeName == "bit" ? NpgsqlDbType.Bit //eg:0|1 // : columnDBypeName == "json" ? NpgsqlDbType.Json // : columnDBypeName == "money" ? NpgsqlDbType.Money // : columnDBypeName == "numeric" ? NpgsqlDbType.Numeric // : columnDBypeName == "bit varying" ? NpgsqlDbType.Varbit //eg:01010101 // : columnDBypeName == "text" ? NpgsqlDbType.Text // : columnDBypeName == "character varying" ? NpgsqlDbType.Varchar //NpgsqlDbType.Varchar可以直接用NpgsqlDbType.Text // : columnDBypeName == "\"char\"" || columnDBypeName == "character" ? NpgsqlDbType.Char //NpgsqlDbType.Char可以直接用NpgsqlDbType.Text // //: columnDBypeName == "array" ? NpgsqlDbType.Array|NpgsqlDbType.Json //ARRAY需要匹配各个基础类型的Array,且不能直接以string传值,不常用不做处理 // : columnDBypeName == "interval" ? NpgsqlDbType.Interval // //: NpgsqlDbType.Text); // : NpgsqlDbType.Unknown); // p.Value = columnValuePair.Value.Type == JTokenType.Null ? DBNull.Value // : columnDBypeName.StartsWith("timestamp") || columnDBypeName == "date" || columnDBypeName.StartsWith("time") ? Convert.ToDateTime(((JValue)columnValuePair.Value).Value) // : columnDBypeName == "smallint" ? Convert.ToInt16(columnValuePair.Value) // : columnDBypeName == "integer" || columnDBypeName == "serial" ? Convert.ToInt32(((JValue)columnValuePair.Value).Value) // : columnDBypeName == "bigint" || columnDBypeName == "bigserial" ? Convert.ToInt64(((JValue)columnValuePair.Value).Value) // : columnDBypeName == "double precision" ? Convert.ToDouble(((JValue)columnValuePair.Value).Value) // : columnDBypeName == "real" ? Convert.ToSingle(((JValue)columnValuePair.Value).Value) // : columnDBypeName == "boolean" ? Convert.ToBoolean(((JValue)columnValuePair.Value).Value) // : columnDBypeName == "uuid" ? Guid.Parse((string)columnValuePair.Value) // : columnDBypeName == "bit" ? Convert.ToString(Convert.ToInt32(columnValuePair.Value), 2).Last().ToString() // : columnDBypeName == "json" ? JObject.Parse((string)columnValuePair.Value).ToString() // : columnDBypeName == "money" || columnDBypeName == "numeric" ? Convert.ToDecimal(((JValue)columnValuePair.Value).Value) // : columnDBypeName == "text" || columnDBypeName == "character varying" || columnDBypeName == "character" ? (string)columnValuePair.Value // : columnDBypeName == "interval" ? TimeSpan.Parse(Regex.Replace((string)columnValuePair.Value, "days?", ".", RegexOptions.IgnoreCase).Replace(" ", "")) // : (object)(string)((JValue)columnValuePair.Value).Value; // return p; //} private void button3_Click(object sender, EventArgs e) { DataTable dt = (DataTable)dataGridView1.DataSource; WriteToServer(dt); } // public void WriteToServer(DataTable dataTable) { string DestinationTableName = "dinners"; try { conn.Open(); if (DestinationTableName == null || DestinationTableName == "") { throw new ArgumentOutOfRangeException("DestinationTableName", "目标表名必须要设置"); } int colCount = dataTable.Columns.Count; NpgsqlDbType[] types = new NpgsqlDbType[colCount]; int[] lengths = new int[colCount]; string[] fieldNames = new string[colCount]; using (var cmd = new NpgsqlCommand("SELECT * FROM " + DestinationTableName + " LIMIT 1", conn)) { using (var rdr = cmd.ExecuteReader()) { if (rdr.FieldCount != colCount) { throw new ArgumentOutOfRangeException("dataTable", "Column count in Destination Table does not match column count in source table."); } var columns = rdr.GetColumnSchema(); for (int i = 0; i < colCount; i++) { types[i] = (NpgsqlDbType)columns[i].NpgsqlDbType; lengths[i] = columns[i].ColumnSize == null ? 0 : (int)columns[i].ColumnSize; fieldNames[i] = columns[i].ColumnName; } } } var sB = new StringBuilder(fieldNames[0]); for (int p = 1; p < colCount; p++) { sB.Append(", " + fieldNames[p]); } using (var writer = conn.BeginBinaryImport("COPY " + DestinationTableName + " (" + sB.ToString() + ") FROM STDIN (FORMAT BINARY)")) { for (int j = 0; j < dataTable.Rows.Count; j++) { DataRow dR = dataTable.Rows[j]; writer.StartRow(); for (int i = 0; i < colCount; i++) { if (dR[i] == DBNull.Value) { writer.WriteNull(); } else { switch (types[i]) { case NpgsqlDbType.Bigint: writer.Write((long)dR[i], types[i]); break; case NpgsqlDbType.Bit: if (lengths[i] > 1) { writer.Write((byte[])dR[i], types[i]); } else { writer.Write((byte)dR[i], types[i]); } break; case NpgsqlDbType.Boolean: writer.Write((bool)dR[i], types[i]); break; case NpgsqlDbType.Bytea: writer.Write((byte[])dR[i], types[i]); break; case NpgsqlDbType.Char: if (dR[i] is string) { writer.Write((string)dR[i], types[i]); } else if (dR[i] is Guid) { var value = dR[i].ToString(); writer.Write(value, types[i]); } else if (lengths[i] > 1) { writer.Write((char[])dR[i], types[i]); } else { var s = ((string)dR[i].ToString()).ToCharArray(); writer.Write(s[0], types[i]); } break; case NpgsqlDbType.Time: case NpgsqlDbType.Timestamp: case NpgsqlDbType.TimestampTz: case NpgsqlDbType.Date: writer.Write((DateTime)dR[i], types[i]); break; case NpgsqlDbType.Double: writer.Write((double)dR[i], types[i]); break; case NpgsqlDbType.Integer: try { if (dR[i] is int) { writer.Write((int)dR[i], types[i]); break; } else if (dR[i] is string) { var swap = Convert.ToInt32(dR[i]); writer.Write((int)swap, types[i]); break; } } catch (Exception ex) { string sh = ex.Message; } writer.Write((object)dR[i], types[i]); break; case NpgsqlDbType.Interval: writer.Write((TimeSpan)dR[i], types[i]); break; case NpgsqlDbType.Numeric: case NpgsqlDbType.Money: writer.Write((decimal)dR[i], types[i]); break; case NpgsqlDbType.Real: writer.Write((Single)dR[i], types[i]); break; case NpgsqlDbType.Smallint: try { if (dR[i] is byte) { var swap = Convert.ToInt16(dR[i]); writer.Write((short)swap, types[i]); break; } writer.Write((short)dR[i], types[i]); } catch (Exception ex) { string ms = ex.Message; } break; case NpgsqlDbType.Varchar: case NpgsqlDbType.Text: writer.Write((string)dR[i], types[i]); break; case NpgsqlDbType.Uuid: writer.Write((Guid)dR[i], types[i]); break; case NpgsqlDbType.Xml: writer.Write((string)dR[i], types[i]); break; } } } } writer.Complete(); } } catch (Exception ex) { throw new Exception("Error executing NpgSqlBulkCopy.WriteToServer(). See inner exception for details", ex); } } // } }
活到老,学到老。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2023-01-16 学习python 爬虫之pyppteer
2023-01-16 尝试python 爬虫新工具playwright