① 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.连接)建立到数据库的连接connSqlConnectionconn=newSqlConnection();[email protected]"DataSource=(LocalDB)MSSQLLocalDB;AttachDbFilename=J:数据库SQLDBNewDB.mdf;IntegratedSecurity=True;ConnectTimeout=5";//(2.打开)conn.Open();string表名="Users";using(conn){//(3.适配)适配器da和数据集dsda=newSqlDataAdapter();ds=newDataSet("DataSet1");//将DataTable添加到DataSetds.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。