健康一贴灵,专注医药行业管理信息化

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);
            }
        }
        //
    }
}
复制代码

 

posted @   一贴灵  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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
学以致用,效率第一
点击右上角即可分享
微信分享提示