c#连接vertica数据库
项目前期使用mysql数据库,大约每天200w数据量,十天1500w数据量之后,读取写入都会很慢,而且经常锁表,后来采用vertica数据库,下面分享vertica数据库使用方法,以及大批量数据快速写入数据库的方法:
1,数据库IDE的配置
windows系统下需先安装jdk,然后才能使用IDE,可以使用dbvis_windows-x64_9_1_9,一个数据库统一客户端工具,网上搜索下载。
可能会出现需要加载jar包才能使用的情况,选择软件目录\jdbc\vertica.jar包即可。
2,c#里如何使用
下载类库:https://my.vertica.com/download/vertica/client-drivers/

项目中引用:

代码:
VerticaConnection conn = new VerticaConnection(ConfigurationManager.AppSettings["VerticalTest"]);
{
conn.Open();
VerticaTransaction txn = conn.BeginTransaction();
VerticaCommand cmd = new VerticaCommand();
cmd.Connection = conn;
cmd.Transaction = txn;
string deleteSourceData = @"Delete from " + strTableName + " where sampledate = " + time.ToString("yyyyMMdd") + " and city='" + city + "'";
cmd.CommandText = deleteSourceData;
cmd.CommandTimeout = ;
cmd.ExecuteNonQuery();
}
3,大量数据快速批量插入vertica数据库方法
sqlserver中常见插入方法:
insert into table1(a,b) valuse ('Cust1', 'Smith Company'),('Cust2', 'Perform Company')
vertica里不支持这种写法,但是支持如下:
insert into table1(a,b) select a,b,c from table2 union select 'Cust1', 'Smith Company'
这种写法速度并不快,更快速的方法是使用copy,copy可以从txt文件,也可以是内存流:
, copy语句使用语法:/// <summary>
/// 批量插入数据到vertica数据库
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="strTableName">插入的目标表名</param>
/// <param name="time">日期(删除数据使用)</param>
/// <param name="city">城市(删除数据使用)</param>
public static void BulkCopy(DataTable dt, string strTableName, DateTime time,string city)
{
if (dt == null || dt.Rows.Count == )
{
return;
}
if (dt.Columns.Count == )
{
throw new Exception("The length of column cannot be zero.");
}
//从datatable中获取列名
List<string> lstField = new List<string>();
for (int colIndex = ; colIndex < dt.Columns.Count; colIndex++)
{
lstField.Add(dt.Columns[colIndex].ColumnName);
}
string strFiledList = string.Format("({0})", string.Join(",", lstField.ToArray()));
//拼写copy语句
const char RowSplit = '\n';
const char ColSplit = '\t'; string strCopyStatement = string.Format("copy {0}{1} from stdin record terminator E'{2}' delimiter E'{3}' enforcelength no commit",
strTableName, strFiledList, RowSplit, ColSplit);
//按照copy语句中的分隔符,分隔数据源
StringBuilder sbText = new StringBuilder();
foreach (DataRow dr in dt.Rows)
{
bool bFirstField = true;
for (int colIndex = ; colIndex < dt.Columns.Count; colIndex++)
{
string strVal = GetDataString(dr, colIndex);
if (bFirstField)
{
sbText.Append(strVal);
bFirstField = false;
}
else
{
sbText.AppendFormat("{0}{1}", ColSplit, strVal);
}
}
sbText.Append(RowSplit);
}
//数据源写入内存流
string strTemp = sbText.ToString();
byte[] buff = Encoding.UTF8.GetBytes(strTemp);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(buff, , buff.Length);
ms.Flush();
ms.Position = ;
//建立vertica数据库连接
VerticaConnection conn = new VerticaConnection(ConfigurationManager.AppSettings["VerticalTest"]);
{
conn.Open();
VerticaTransaction txn = conn.BeginTransaction();
Vertica.Data.VerticaClient.VerticaCopyStream vcs = new VerticaCopyStream(conn, strCopyStatement);
//插入数据前,先删除重复数据
VerticaCommand cmd = new VerticaCommand();
cmd.Connection = conn;
cmd.Transaction = txn;
string deleteSourceData = @"Delete from " + strTableName + " where sampledate = " + time.ToString("yyyyMMdd") + " and city='" + city + "'";
cmd.CommandText = deleteSourceData;
cmd.CommandTimeout = ;
cmd.ExecuteNonQuery();
//批量插入数据
vcs.Start();
vcs.AddStream(ms, false);
vcs.Execute(); long insertedCount = vcs.Finish(); IList<long> lstRejected = vcs.Rejects;
if (lstRejected.Count > )
{
txn.Rollback();
conn.Close(); // Maybe need more detail info to show
throw new Exception("Bulk copy failure.");
}
else
{
txn.Commit();
conn.Close();
}
} ms.Close();
}
}
c#连接vertica数据库的更多相关文章
- 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...
- Vertica的这些事(二)——SQL-Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 绝对值 S:select abs(-1) value O ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- Vertica 数据库知识汇总篇
Vertica 数据库知识汇总篇(更新中..) 1.Vertica 集群软件部署,各节点硬件性能测试 2.Vertica 创建数据库,创建业务用户测试 3.Vertica 数据库参数调整,资源池分配 ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- PDO连接mysql数据库
1.PDO简介 PDO(PHP Data Object) 是PHP 5 中加入的东西,是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接 ...
- 【.net 深呼吸】连接Access数据库应注意的几点
本地数据库可以有Y种选择,比如Sqlite.SQL Server Express.SQL Local DB.SQL Server CE.Access等,本文老周选用比较著名的Access本地数据库,在 ...
- nhibernate连接11g数据库
我框架的数据映射用 nhibernate连接多数据库,这次又增加了oracle11g,负责开发的同事始终连接不上,悲催的sharepoint调试是在不方便... 下面描述下问题的解决,细节问题有3个: ...
- pycharm连接mysql数据库
新的环境配置pycharm的项目时,发现pycharm不能连接到mysql数据库.由于安了java环境但是还没配置相关的库,并且jetbrains家的IDE一般都是java写的,于是猜想可能是java ...
随机推荐
- MFC编辑框字体大小调节(转)
在学习MFC中需要调整编辑框中的字体大小,以下是我结合网上与自己实际操作总结的,希望对其它同学有所帮助. 首先,了解以下函数原型:BOOL CreateFont( int nHeight, ...
- EF连接ORACLE
1.nuget引用Oracle.ManagedDataAccess.EntityFramework的dll文件 2.安装Oracle Developer Tools for Visual Studio ...
- VS2012一打开就停止工作的解决方法
昨天刚装好VS2012,用得好好的,嘿,今早儿 一打开程序,就告诉我 VS2012停止工作,只有关闭程序或者调试程序. 小主酸菜郁闷不已,必须找到解决方法啊,错误提示如图: 错误原因: ...
- HttpClient,DefaultHttpClient使用详解
HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=new DefaultHttpClient(); 发送GET请 ...
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
- tcpdump高级过滤技巧
基本语法 ========过滤主机--------- 抓取所有经过 eth1,目的或源地址是 192.168.1.1 的网络数据# tcpdump -i eth1 host 192.168.1.1- ...
- VBS整人代码
记得刚开始学VB脚本语言的时候,写了一段调用系统进程的代码,挺好的: dim wshif msgbox("笑笑很帅",vbyesno,"请回答是或否")=vby ...
- sql-将字符串按指定字符分割插入指定表中
CREATE PROC SPLIT( @STR VARCHAR(MAX), --截取字符串 ), --截取字符 ) --存放表名 ) AS BEGIN ) IF(OBJECT_ID(@TABLE) I ...
- xcopy中提示“无效的参数数量”的解决方法
原因是DOS下不支持长文件名,只支持8.3格式的文件名 .如果是Windows下的命令行,对于有空格的命令行要加引号.应该是 copy "c:\program files" &qu ...
- 语言模拟ATM自动取款机系统
C语言实验报告 题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...