技术标签: postgresql 数据库
我们知道在ADO.NET中有“System.Data.SqlClient.SqlBulkCopy类”专门针对SQL Server的批导入表数据操作(Bulk Copy),而针对Postgresql的Npgsql并无相应的类,Npgsql实现Bulk Copy是通过Copy指令实现的,详细可以参考Npgsql官网对Bulk Copy的说明https://www.npgsql.org/doc/copy.html (如果想更多了解关于Copy指令的语法可以阅读https://www.postgresql.org/docs/current/sql-copy.html)。
以下是C#中实现批量导入表格数据的通用方法(导出方法请阅读官网相关说明,此处略过):
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 = (NpgsqlConnection)_DB.CreateConnection())
{
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;
}
以下是查询Postgresql表格与字段信息的SQL:
select
--col.table_schema,
col.table_name,
col.column_name,
(case when col.column_default like 'nextval(%' then true else false end) as is_serial,
--col.is_generated,
(case when col.is_nullable='NO' then false else true end) as is_nullable,
(case when con.contype is not null then true else false end) as is_primarykey,
--con.contype ,
col.data_type,
col.character_maximum_length
from information_schema.columns col
inner join pg_class cls on col.table_name=cls.relname
left join pg_constraint con on cls.oid=con.conrelid and con.contype='p' and array_position(con.conkey::integer[],col.ordinal_position::integer)>0
where col.table_schema = 'public'
order by col.table_name,col.ordinal_position;
文章浏览阅读26次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读1.9k次,点赞67次,收藏20次。U4_3 语法分析-自底向上分析-LR0/LR1/SLR分析
文章浏览阅读1.5k次。 马上就要参加巅峰战将营,整理了一下,自己还真没有几套运动的衣服。只好临时抱佛脚了,跟丫头去逛街买装备。 一整天下来,李宁、安踏逛遍,搞定3身运动装,收工! 晚上便跟丫头来到石路万人码头乘坐游船赏月。 游船从石路南浩街万人码头出发,沿途经过了24做桥:阊门吊桥、惠济桥、平门桥、齐门桥、糖坊湾桥、娄们桥、相门桥、葑门桥、竹辉桥、古觅渡桥、南园桥、人民桥、蟠龙桥、吴门桥、盘门、新市
文章浏览阅读1.3k次,点赞29次,收藏8次。Python(35):Python3 通过https上传文件和下载文件_python3 文件上传下载
文章浏览阅读5.1k次。一、需求分析我的电脑一般都是24小时候开机的,方便远程操作。但是这样,一是比较浪费电,二是对电脑硬件也或多或少有些影响。所以就需要远程开机。目前远程开机有很多种方式:1、智能插线板,可以远程控制插板的通电和断电,并在BIOS中设置来电开机,实现远程开机2、通过一些硬件,插到机箱电源跳线上来实现3、利用大部分电脑都支持的WakeOnLan技术来实现开机,只是配置过程有不少坑,相对比较麻烦。如果利用W..._wol安卓远程唤醒软件
文章浏览阅读1.6k次,点赞5次,收藏2次。@VUE基础知识学习,基础安装node和淘宝镜像 operation not permitted, mkdir 'D:\nodejs\node_global’解决方法在官网上搜索node.js安装下载成功之后在本地进行安装,记得一定要去搜一下安装教程,因为有些步骤需要修改正常安装之后没有什么问题。检验npm版本(operation not permitted, mkdir 'D:\nodejs\node_global’解决方法)在这里我遇到了一个问题:发现报错,之后我就去百度上搜索了一下这个问_operation not permitted, mkdir 'd:\nodejs\node_global
文章浏览阅读5.1k次,点赞6次,收藏5次。在Word中,使用公式编辑器3.0输入中括号的时候,会出现中括号的上半部分没办法完全显示的问题,也就是下图所示的情况。至于为什么会出现这个情况,我也不清楚,以前在打公式的时候基本上没出现过,后来慢慢出现了,网上有说改行距的,我试过了,这是公式本身的尺寸限制,改行距不可以,如果在Word里面显示不了的话,打印出来肯定也是不行的,现在说明一种能解决这个问题的方法。1. 双击公式,进入公..._word中括号公式显示不完全
文章浏览阅读6.1k次,点赞4次,收藏28次。工频干扰:工频干扰是由电力系统引起的50HZ的正弦波对测量过程的干扰。实现对50HZ正弦波的滤波可以采用带阻滤波器(陷波器),电路图及其交流分析如下:仿真电路图:仿真效果图:..._50hz工频干扰的消除电路
文章浏览阅读1.3k次。 通常用博弈的战略式表述去描述和分析静态博弈,而对动态博弈的描述和分析就借助博弈的扩展式表述。回顾第2章给出的战略式表述,其中心内容包含三个要素:(1)参与者_gambit博弈论软件教程
文章浏览阅读1.4k次,点赞2次,收藏3次。然而,随着AI技术的快速发展,我们也面临着一系列伦理问题,这些问题涉及到我们的隐私、公平性、自主性和责任等方面。通过建立法律框架、改进训练数据和算法、提高模型的可解释性以及提供伦理培训,我们可以更好地应对AI伦理挑战,为科技发展中的人性之声提供指导。:为了解决数据收集和滥用问题,需要制定严格的数据隐私法规,确保个人数据的收集和使用受到适当的监管。:为了解决自主性问题,需要建立法律框架,明确自主AI系统的责任和法律责任。为了应对伦理挑战,开发人员和数据科学家需要受到伦理教育,以提高他们的伦理意识和决策能力。
文章浏览阅读3.6w次,点赞89次,收藏623次。AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描,过滤,统计汇总等工作,数据可以来自标准输入也可以是管道或文件。当读到第一行时,匹配条件,然后执行指定动作,在接着读取第二行数据处理,不会默认输出。如果没有定义匹配条件,则是默认匹配所有数据行,awk隐含循环,条件匹配多少次,动作就会执行多少次。逐行读取文本,默认以空格或tab键为分割符进行分割,将分割所得的各个字段,保存到内建变量中,并按模式或或条件执行编辑命令。与sed工作原理相比:s_awk
文章浏览阅读161次。ClearEditTextView通过扩展EditText,添加了右边清除按钮、输入数据不合法时可左右抖动的功能。效果如下:模拟登录整体的实现代码如下:public class ClearEditTextView extends EditText implements View.OnFocusChangeListener, TextWatcher {//右边的删除按钮private Drawabl..._android edittext clear