首页 > 数据库 >C#DataGridView数据批量插入数据库中(测试未果)

C#DataGridView数据批量插入数据库中(测试未果)

时间:2024-01-16 14:11:27浏览次数:29  
标签:未果 Convert NpgsqlDbType C# columnDBypeName writer Value DataGridView string

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

 

标签:未果,Convert,NpgsqlDbType,C#,columnDBypeName,writer,Value,DataGridView,string
From: https://www.cnblogs.com/lrzy/p/17967538

相关文章

  • docker jmeter分布式压测部署 jmeter websocket压测
    测试场景:1.多名用户加入房间。2.房间人数为固定人数(比如4人) 3.有人进入时,进入用户会收到反馈当前房间人员列表。4.其他人会收到反馈新加入用户的信息消息。5.当人数已满时,会自动推送消息给所有人。6.在人满后,每个人需要按固定序列,发送消息。7.所有人发送特定消息后,推进房......
  • Codeforces Round 920 (Div. 3)
    基本情况A、C秒的很快。B、D都错了一发才过。E博弈论属于是短板。E.EattheChipProblem-E-Codeforces首先考虑谁可能赢。因为\(Alice\)只能向下,\(Bob\)只能向上,而\(Alice\)先手。显然两者行差为奇数时\(Alice\)有可能赢,偶数时\(Bob\)有可能赢。再考虑平......
  • crontab 环境变量的问题
    1、大致功能就是找出未在fstab中挂载的磁盘,并发送到云平台告警。#!/bin/bashsource/etc/profileremote_address="http://1.1.1.1:6666"user=xxxxpass=xxxxexcept_block=("/dev/sr0""/dev/cdrom""/dev/dvd")blkid_output=$(blkid-sUUID)all_blo......
  • NetCat(nc)工具
    目录nc命令是一个非常有用的网络工具,也被称为Netcat。它是一个命令行实用程序,用于在两台计算机网络之间读取和写入数据。通信可以使用TCP或UDP协议进行。nc命令在不同系统上可能有不同的名称,例如netcat、ncat等。以下是nc命令的基本语法:nc[<选项>]<主机><端口>nc命令的一......
  • C#开源免费的Blazor图表库
    前言今天分享一款基于ApexCharts.js封装的、C#开源免费的Blazor图表库:Blazor-ApexCharts。10款值得推荐的BlazorUI组件库全面的ASP.NETCoreBlazor简介和快速入门ApexCharts.js介绍ApexCharts.js开源地址:https://github.com/apexcharts/apexcharts.jsApexCharts......
  • SFCGAL简介
    SFCGALisaC++wrapperlibraryaround CGAL withtheaimofsupportingISO 19107:2013and OGCSimpleFeaturesAccess1.2 for3Doperations.SFCGALprovidesstandardcompliantgeometrytypesandoperations,thatcanbeaccessedfromits C or C++ APIs.......
  • JMeter测试WebSocket的经验总结
    最近有一个微信聊天系统的项目需要性能测试,既然是测试微信聊天,肯定绕不开websocket接口的测试,首选工具是Jmeter,网上能搜到现成的方法,但是网上提供的jar包往往不是最新的,既然是用最新版本的Jmeter4.0,那么所依赖的插件jar包也应该追求新的。所以提供了以下链接供大家下载(甚至连源码......
  • C# socket tcp/ip 如何判断连接是否正常
    判断socket是否断开连接,网上有N种说法:1.Socket.Connected这个属性只能说明上一次通信时还是正常的。比如说你拔掉网线后就它显示还是为true。用这个方法最好和ping一起组合使用。ping的方法如下publicboolPingOC(Stringips){boolret;Processp=newProcess();p.Start......
  • jmeter jdbc操作myql数据库及mysql驱动下载
     mysql驱动下载https://dev.mysql.com/downloads/connector/j/   1、先安装mysql的驱动mysql-connector-java-5.1.7-bin.jar配置jdbc的connectionconfigurationDatabaseUrl:jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?allowMultiQueries=true&serverTimezone=UTC&c......
  • Kepware OPC UA Gateway之技术深度剖析与分享
    KepwareOPCUAGateway之技术深度剖析与分享随着客户对Kepware产品功能需求的进一步深入,Kepware适时推出了全功能套件(Premium Connectivity Suite)。使用一个授权即可解锁KepwareServer的所有功能,包含所有标准/高级驱动,IoTGateway,Datalogger,AdvancedTags等高级插件以及OPCU......