导航:首页 > 网络数据 > cdatatable大数据

cdatatable大数据

发布时间:2023-01-19 21:51:15

① C#:几种数据库大数据批量插入

/// <summary>
/// 提供数据批量处理的方法。
/// </summary>
public interface IBatcherProvider : IProviderService
{
/// <summary>
/// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次写入的数据量。</param>
void Insert(DataTable dataTable, int batchSize = 10000);
}

一、SqlServer数据批量插入
SqlServer的批量插入很简单,使用SqlBulkCopy就可以,以下是该类的实现:

/// <summary>
/// 为 System.Data.SqlClient 提供的用于批量操作的方法。
/// </summary>
public sealed class MsSqlBatcher : IBatcherProvider
{
/// <summary>
/// 获取或设置提供者服务的上下文。
/// </summary>
public ServiceContext ServiceContext { get; set; }

/// <summary>
/// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次写入的数据量。</param>
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = (SqlConnection)ServiceContext.Database.CreateConnection())
{
try
{
connection.TryOpen();
//给表名加上前后导符
var tableName = DbUtility.FormatByQuote(ServiceContext.Database.Provider.GetService<ISyntaxProvider>(), dataTable.TableName);
using (var bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, null)
{
DestinationTableName = tableName,
BatchSize = batchSize
})
{
//循环所有列,为bulk添加映射
dataTable.EachColumn(c => bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c => !c.AutoIncrement);
bulk.WriteToServer(dataTable);
bulk.Close();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
}

SqlBulkCopy的ColumnMappings中列的名称受大小写敏感限制,因此在构造DataTable的时候应请注意列名要与表一致。
以上没有使用事务,使用事务在性能上会有一定的影响,如果要使用事务,可以设置SqlBulkCopyOptions.UseInternalTransaction。

二、Oracle数据批量插入
System.Data.OracleClient不支持批量插入,因此只能使用Oracle.DataAccess组件来作为提供者。

/// <summary>
/// Oracle.Data.Access 组件提供的用于批量操作的方法。
/// </summary>
public sealed class OracleAccessBatcher : IBatcherProvider
{
/// <summary>
/// 获取或设置提供者服务的上下文。
/// </summary>
public ServiceContext ServiceContext { get; set; }

/// <summary>
/// 将 <see cref="DataTable"/> 的数据批量插入到数据库中。
/// </summary>
/// <param name="dataTable">要批量插入的 <see cref="DataTable"/>。</param>
/// <param name="batchSize">每批次写入的数据量。</param>
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = ServiceContext.Database.CreateConnection())
{
try
{
connection.TryOpen();
using (var command = ServiceContext.Database.Provider.DbProviderFactory.CreateCommand())
{
if (command == null)
{
throw new BatcherException(new ArgumentException("command"));
}
command.Connection = connection;
command.CommandText = GenerateInserSql(ServiceContext.Database, command, dataTable);
command.ExecuteNonQuery();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}

/// <summary>
/// 生成插入数据的sql语句。
/// </summary>
/// <param name="database"></param>
/// <param name="command"></param>
/// <param name="table"></param>
/// <returns></returns>
private string GenerateInserSql(IDatabase database, DbCommand command, DataTable table)
{
var names = new StringBuilder();
var values = new StringBuilder();
//将一个DataTable的数据转换为数组的数组
var data = table.ToArray();

//设置ArrayBindCount属性
command.GetType().GetProperty("ArrayBindCount").SetValue(command, table.Rows.Count, null);

var syntax = database.Provider.GetService<ISyntaxProvider>();
for (var i = 0; i < table.Columns.Count; i++)
{
var column = table.Columns[i];

var parameter = database.Provider.DbProviderFactory.CreateParameter();
if (parameter == null)
{
continue;
}
parameter.ParameterName = column.ColumnName;
parameter.Direction = ParameterDirection.Input;
parameter.DbType = column.DataType.GetDbType();
parameter.Value = data[i];

if (names.Length > 0)
{
names.Append(",");
values.Append(",");
}
names.AppendFormat("{0}", DbUtility.FormatByQuote(syntax, column.ColumnName));
values.AppendFormat("{0}{1}", syntax.ParameterPrefix, column.ColumnName);

command.Parameters.Add(parameter);
}
return string.Format("INSERT INTO {0}({1}) VALUES ({2})", DbUtility.FormatByQuote(syntax, table.TableName), names, values);
}
}
以上最重要的一步,就是将DataTable转为数组的数组表示,即object[][],前数组的上标是列的个数,后数组是行的个数,因此循环Columns将后数组作为Parameter的值,也就是说,参数的值是一个数组。而insert语句与一般的插入语句没有什么不一样。

② C# datatable的信息怎么添加到数据库的表中

软糖来回答罗。

我这里有个SQL连接数据库的示例,可以参考下。

publicvoid数据集测试()
{
//(1.连接)建立到数据库的连接conn
SqlConnectionconn=newSqlConnection();
conn.ConnectionString=@"DataSource=(LocalDB)MSSQLLocalDB;AttachDbFilename=J:数据库SQLDBNewDB.mdf;IntegratedSecurity=True;ConnectTimeout=5";
//(2.打开)
conn.Open();
string表名="Users";
using(conn)
{
//(3.适配)适配器da和数据集ds
da=newSqlDataAdapter();
ds=newDataSet("DataSet1");
//将DataTable添加到DataSet
ds.Tables.Add(dt);
//将DataSet的修改提交至“数据库”
=newSqlCommandBuilder(da);
da.Update(ds,dt.TableName);
}
//(6.释放资源)
conn.Close();
conn.Dispose();


//注意:在修改、删除等操作中表必须定义主键,select的字段也必须包含主键,
//否则会抛出异常“对于不返回任何键列信息的SelectCommand,不支持UpdateCommand的动态SQL生成。”

}

上面的dt变量就是你的表,需要给它指定一个TableName名字。

连接字符串需要改成你数据库的,在服务器资源管理器>数据连接>属性页面>连接字符串

(鼠标选中然后按Ctrl+C复制)


如满意,请采纳,谢谢。

③ C# 处理DataTable 重复数据

你可以用HashSet<T>来存储已存在的行 检索速度会快很多 代码如下 不知道你的机子什么配置 我的机子Debug模式100000行数据 用了232毫秒using System;
using System.Data;
using System.Collections.Generic;
using System.Diagnostics;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dataTable = new DataTable();
dataTable.Columns.AddRange(new DataColumn[] {
new DataColumn("A"),
new DataColumn("B"),
new DataColumn("C"),
new DataColumn("D")
});
for (int i = 0; i < 50000; i++)
{
dataTable.Rows.Add(new object[] { 0, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + i.ToString(), 0 });
dataTable.Rows.Add(new object[] { 0, 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + (50000 - i).ToString(), 0 });
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Reset();
stopwatch.Start();
Console.WriteLine("DataTable行数:{0}", dataTable.Rows.Count);
HashSet<string> hash = new HashSet<string>();//.NET 3.0以上使用
//Dictionary<string, int> dic = new Dictionary<string, int>();//.NET 2.0可以用这个
for (int i = 0; i < dataTable.Rows.Count; i++)
{
//if (dic.ContainsKey(dataTable.Rows[i][2] as string))//.NET 2.0
//{
// dic.Add(dataTable.Rows[i][2] as string, 0);
//}
if (!hash.Contains(dataTable.Rows[i][2] as string))
{
hash.Add(dataTable.Rows[i][2] as string);
}
else
{
dataTable.Rows.RemoveAt(i);
i--;
}
}
stopwatch.Stop();
Console.WriteLine("用时:{0}毫秒", stopwatch.ElapsedMilliseconds);
Console.WriteLine("DataTable行数:{0}", dataTable.Rows.Count);
Console.ReadKey();
}
}
}

④ c#中的DataTable如何修改数据类型

很简单。修改下值就可以。
我想LZ要学会自己思考。我想这个你都没有思考一看不会就发上来了。我给你写下如何生成DataTable的步骤。然后自己思考,修改下。
最简单的方式
DataTable dt=new DataTable("Table1"); //创建数据表
DataColumn dcID=new DataColumn("ID",typeof(int)); //创建ID列
DataColumn dcName=new DataColumn("Name",typeof(string));//创建姓名列
DataColumn dcState=new DataColumn("State",typeof(int));//创建状态列

//把创建的三列放在DataTable中
dt.Columns.Add(dcID); dt.Columns.Add(dcName);
dt.Columns.Add(dcState);
//创建数据行。
DataRow dr=dt.NewRow();
dr["ID"]=1; dr["Name"]=A; dr["State"]=1;
//把创建的行插入到数据表“Table1”中
dt.Rows.Add(dr);
//如上,这样就创建了一个如题所示的数据表的过程。

如果你想把bit型转换为char型。只需要候改下插入的列即可。
如将状态列改为:
DataColumn dcState=new DataColumn("State",typeof(char)); //此处将其改为Char类型。
//如上所示数据行
DataRow dr=dt.NewRow();
dr["ID"]=1; dr["Name"]=A; dr["State"]="是"; //把State列的值改为"是"或“否”即可。

打了半天,只希望楼主能从中体会如何自定义DataTable。
GoodLuck!!

⑤ C#两个30万条纪录的datatable如何进行快速比较

用 like

这是sql 数据库里的
不知你的是什么数据库。我只知ACC和sql 可以用这句,
比循环比较快,具体自已网络

⑥ C#在datatable中怎么筛选数据

对DataTable数据各种筛选
筛选一个DataTable的数据,赋值给另外一个DataTable
假设:
有2个DataTable:DataTable A、DataTable B。
要求:
筛选DataTable A中itemType字段值为book的数据,然后把筛选出来的数据,赋给DataTable B
实现:
(1)方法一:通过 RowFilter 筛选实现
DataView view = new DataView();
view.Table = A;
view.RowFilter = "itemType = 'book'";//itemType是A中的一个字段
B= view.ToTable();
(2)方法二:通过 Select()筛选
DataRow[] rows = A.Select("itemType = 'book'");
B= A.Clone(); //克隆A的结构
foreach (DataRow row in rows)
{
B.ImportRow(row);//复制行数据
}
注:如果有多个筛选条件的话,可以加 and 或 or。例如: A.Select("itemType = 'book' and a='b' or a='c'");

⑦ 一个200行数据的datatable大概占用多少内存

太少了,现在的内存都是用G来计算的,200行对它来说太少了!

你可以通过二进制序列化,把你那个datatable序列化到文件里面,你可以大概知道大小了!

BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
DataTable dt = new DataTable();
bf.Serialize(ms, dt);

运行看了看,一个空的DataTable也就930个字节,在.NET 4.0里面!

⑧ c#怎样读取DataTable中的数据

把数据放入datatable中之后,如何读取指定行列的数据呢?
我放的不是数据库中的数据,没有表头也不止一列,比如我想找第三行第四列的数据。
现在我已经写了代码如下:
try
{
string strConn;
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\Users\Administrator\Desktop\cstest.xls;Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();
String sql = "SELECT * FROM [Sheet1$]";
OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);
DataSet OleDsExcle = new DataSet();
OleDaExcel.Fill(OleDsExcle, "Sheet1");
DataTable dt = OleDsExcle.Tables[0];

//这里要怎么继续写下去呢....
label1.Text = ;

OleConn.Close();
}
catch (Exception ex)
{
label1.Text = ex.Message;
}

⑨ C#在datatable中怎么筛选数据

DataTable可以通过select来筛选数据 datatable.select("");

你的需求貌似需要分组可以用linq

⑩ net(C#)情况下在datatable中实现类似count、group by的数据统计

so easy , 直接用linq, from c in datatable group by c.name select c。

阅读全文

与cdatatable大数据相关的资料

热点内容
拍照文件扫描转换word 浏览:724
电脑启动后桌面文件不见了 浏览:535
图文游戏编程作品说明如何写 浏览:197
qq浏览器wifi不安全卫士 浏览:449
文件在用户却不显示在桌面 浏览:124
delphi获取操作系统版本 浏览:722
linux定时任务执行脚本 浏览:787
招商银行app怎么查电费 浏览:739
手机代码文档翻译软件 浏览:676
青华模具学院和ug编程哪个好 浏览:736
怎么改网站关键词 浏览:581
怎么把ps图片保存成雕刻文件 浏览:771
java字符串赋空值不赋值null 浏览:556
什么是文件hash 浏览:345
文件碎片微信小程序 浏览:878
苹果手机怎么升级运营商版本 浏览:100
什么是菜鸟网络服务协议 浏览:260
11月份的销售数据是什么 浏览:439
三个数据如何列表格 浏览:92
3m互助平台升级会无法登陆吗 浏览:211

友情链接