‘壹’ Ado.net怎么实现批量插入数据
在做大批量数据插入的时候,如果用Insert into ... values (...)这种方式的话效率极低,这里介绍两种性能比较好的批量插入方法。 1. 使用sqlBulkCopyprivate static long SqlBulkCopyInsert(){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();DataTable dataTable = GetTableSchema();string passportKey;for (int i = 0; i < count; i++){passportKey = Guid.NewGuid().ToString();DataRow dataRow = dataTable.NewRow();dataRow[0] = passportKey;dataTable.Rows.Add(dataRow);}SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);sqlBulkCopy.DestinationTableName = "Passport";sqlBulkCopy.BatchSize = dataTable.Rows.Count;SqlConnection sqlConnection = new SqlConnection(connectionString);sqlConnection.Open();if (dataTable!=null && dataTable.Rows.Count!=0){sqlBulkCopy.WriteToServer(dataTable);}sqlBulkCopy.Close();sqlConnection.Close();stopwatch.Stop();return stopwatch.ElapsedMilliseconds;}使用SqlBulkCopy类进行数据插入其原理是采用了SQL Server的BCP协议进行数据的批量复制。这里我们先要建好一个DataTable(最好是通过DataAdapter来灌数据得到,因为这样出来的DataTable就已经有跟数据表相同的列定义,可以免去之后Mapping Column的步骤),把要插入的数据加进这个DataTable中,然后用SqlBulkCopy的实例来插入到数据库中。经过测试,SqlBulkCopy方法比直接用Sql语句插入数据的效率高出将近25倍。
‘贰’ C#如何将datatable中的数据批量更新到MYSQL数据库
C#利用update更新数据到oracle数据库:
第一步:打开oracle数据库
public static string connString = "";
public static OracleConnection conn = null;
//打开数据库连接
public static bool Open()
{
//从配置文件中获取连接字符串
//配置文件需要放在项目目录下的bin\Release中
connString = getXmlValue("connString");
conn = new OracleConnection(getXmlValue("connString"));
try
{
conn.Open();
Console.WriteLine("数据库连接成功");
return true;
}
catch (System.Exception ex)
{
Console.Write(ex.Message);
MessageBox.Show("未能连接到数据库");
return false;
}
第二步:执行更新方法:
public static int update(int ruleId, int equipmentId, String equipmentName, String propertyName, int ruleType, String ruleRequest, String ruleRequestOther, String ruleExplain)
{
String sql = "update Device_Attr t set t.BASEID = :equipmentId, t.BASENAME = :equipmentName,t.CA_NAME = :propertyName,t.CA_RULETYPE = :ruleType,t.CA_RULETEXT = :ruleRequest,t.CA_RULETEXT2 = :ruleRequestOther,t.CONTENT = :ruleExplain where t.CA_ID =:ruleId";
OracleCommand cmd = new OracleCommand(sql, conn);
OracleParameter param_1 = new OracleParameter(":equipmentId", equipmentId);
cmd.Parameters.Add(param_1);
OracleParameter param_2 = new OracleParameter(":equipmentName", equipmentName + "$");
cmd.Parameters.Add(param_2);
OracleParameter param_3 = new OracleParameter(":propertyName", propertyName);
cmd.Parameters.Add(param_3);
OracleParameter param_4 = new OracleParameter(":ruleType", ruleType);
cmd.Parameters.Add(param_4);
OracleParameter param_5 = new OracleParameter(":ruleRequest", ruleRequest);
cmd.Parameters.Add(param_5);
OracleParameter param_6 = new OracleParameter(":ruleRequestOther", ruleRequestOther);
cmd.Parameters.Add(param_6);
OracleParameter param_7 = new OracleParameter(":ruleExplain", ruleExplain);
cmd.Parameters.Add(param_7);
OracleParameter param_8 = new OracleParameter(":ruleId", ruleId);
cmd.Parameters.Add(param_8);
int result = cmd.ExecuteNonQuery();
return result;
}
‘叁’ 如何将批量的数据存入SQL数据库中
在一些数据量比较大,而且操作数据库频繁的。此时需要将数据表datatable整块的存入数据库中。
不多说,直接上代码:
首先得新建一个数据库
DataTable
once_rec_date
=
new
DataTable();
这个数据库得跟目标数据库的列的位置和大小都得一样。特别是类型,和位置。
就是列的位置和目标数据库的位置,顺序得
一模一样。因为都是块存储,所以地址什么的都得一样,千万不能少一列,自增列可以空在那边。
在初始化中初始化该表
once_rec_date.Columns.Add("id", typeof(int));
once_rec_date.Columns.Add("RevData_cmd", typeof(int));
once_rec_date.Columns.Add("Node", typeof(int));
once_rec_date.Columns.Add("Data", typeof(String));
once_rec_date.Columns.Add("Ssingle", typeof(int));
once_rec_date.Columns.Add("IsWiressData", typeof(int));
once_rec_date.Columns.Add("Datatime", typeof(DateTime));
once_rec_date.Columns.Add("Receivetime", typeof(DateTime));
once_rec_date.Columns.Add("IsMatch", typeof(int));
‘肆’ 如何把DataTable快速写入数据库
JDBC操作数据库其实只要掌握了六大步骤就基本差不多啦:
1.加载驱动
Class.forName(String);
String(驱动器的名称,分oracle,sql server等数据库驱动)
2.创建连接
DriverManager.getConnection(url,userName,passwd);
url是数据库的地址,后面分别是用户名和密码
3.创建会话statement(三种statement)
stmt(Statement):所有stmt的父类从connection对象获得,主要用于解析执行sql语句,返回响应结果,多执行异构的sql语句
pstmt(preparedStatement):主要用于执行同构的sql语句,stmt的子类。
cstmt:主要用于执行plsql的编程对象
4.执行sql语句
executeQuery();
5.处理结果集(有结果集返回,无则可省去,比如插入和删除)
ResultSet rs = 步骤4的结果
6.释放资源即连接,一般些在finally语句块中,目的是减轻服务器的压力
‘伍’ C# 读取CSV中的数据到datatable(已经实现),如何全部插入到MySQL数据库的aaa表中
不能,如果是批量插入可以用sqldataadapter.update的方法,指定好sqldataadapter.InsertCommand 就可以一次插入完(这个未测试,不清楚那个mysql驱动是不是支持。另外mysql有一种一次插入多条的语法,类似于
INSERT INTO users(name, age) VALUES('姚明', 25), ('比尔.盖茨', 50), ('火星人', 600);
如果你数据量很大是不能用这种方法的,可以用数据库事务,全部单条循环插入后提交就行了(当然如果不考虑效率并且数据量不大,单条插入不用事务也行)
‘陆’ C#中,如何将内存中的DataTable数据批量导入Access数据库中的一张数据表
DataTable dt=XXXXX;
for(int i=0;i<dt.Rows.Count;i++)
{
dt.Rows[i]["列名"]...
}
‘柒’ 如何高效实现批量插入数据,并去重
c#,sqlserver。写一下我将前端获取到的缓存数据批量插入数据库的表。
在sqlserver数据库下,展开(可编程性)-->(类型)-->(用户自定义表类型)。建一个自定义表类型,表类型结构即是前端传过来的表格数据结构。例如:
CREATE TYPE [dbo].[DT_SAP_ASN] AS TABLE(
[GUID] [nvarchar](50) NULL,
[VBELN_SIP] [nvarchar](30) NULL,
[POSNR_SIP] [nvarchar](30) NULL
)
GO
然后再写个存储,用于调用此存储批量将前端传入的datatable缓存数据批量插入数据库的某个表。例如:
CREATE PROC [dbo].[SP_EDI_SAP_ASN]
(
@DT_SAP_ASN DT_SAP_ASN READONLY --输入参数,刚刚自定义的表类型
)
AS
BEGIN
SET NOCOUNT OFF
INSERT INTO dbo.EDI_ASN_Log
( ID ,
GUID ,
VBELN_SIP ,
POSNR_SIP ,
)
SELECT NEWID() ,
GUID ,
VBELN_SIP ,
POSNR_SIP
FROM @DT_SAP_ASN
SET NOCOUNT ON
END
当然,去重的话在inset那边select表#DT_SAP_ASN distinct一下即可
‘捌’ 怎样将DataTable中数据批量插入表中
数据表dt.
try{
SqlConnection con=new SqlConnection("....");//连接数据库
con.Open();
SqlCommand com=new SqlCommand();//数据操作对象
SqlTransaction trans=con.BeginTransaction();//事物对象
com.Connection=con;//指定连接
com.Transaction=trans;//指定事物
string sql="";
for(int ii=0;ii<dt.Rows.Count;ii++){//对datatable循环
sql="insert into tablename(col1,col2...) values ('"+dt.Rows[ii]["col1"].ToString()+"',"+dt.Rows[ii]["col2"].ToString()+"...)";//某一行的数据 com.CommandText=sql;
com.ExecuteNonQuery();//执行该行
}
trans.Commit();//如果全部执行完毕.提交
}
catch
{
trans.Rollback();//如果有异常.回滚.
}
finally
{
con.close();//关闭连接 }
‘玖’ 如何将DataTable以最快的速度插入到数据库
///<summary>
///初始化一个DataTable类型的数据源
///<para/>Author:AnDequan
///<para/>Date:2011-3-14
///</summary>
///<returns>Source</returns>
privateDataTableInitSource()
{
DataTabledtUserAdd=newDataTable();
dtUserAdd.Columns.Add(newDataColumn("ID",typeof(int)));
dtUserAdd.Columns.Add(newDataColumn("UserName",typeof(string)));
dtUserAdd.Columns.Add(newDataColumn("UserPwd",typeof(string)));
DataRowdrTemp=null;
for(inti=0;i<100;i++)
{
drTemp=dtUserAdd.NewRow();
drTemp["ID"]=0;
drTemp["UserName"]="测试"+(i+1);
drTemp["UserPwd"]="密码"+(i+1);
dtUserAdd.Rows.Add(drTemp);
}
returndtUserAdd;
}
///<summary>
///一次性把DataTable中的数据插入<ahref="http://lib.csdn.net/base/mysql"class='replace_word'title="MySQL知识库"target='_blank'style='color:#df3434;font-weight:bold;'>数据库</a>
///<para/>Author:AnDequan
///<para/>Date:2011-3-14
///</summary>
///<paramname="source">DataTable数据源</param>
///<returns>true-成功,false-失败</returns>
publicboolAddDataTableToDB(DataTablesource)
{
SqlTransactiontran=null;//声明一个事务对象
try
{
using(SqlConnectionconn=newSqlConnection("server=.;uid=sa;pwd=sa;database=Test;"))
{
conn.Open();//打开链接
using(tran=conn.BeginTransaction())
{
using(SqlBulkCopy=newSqlBulkCopy(conn,SqlBulkCopyOptions.Default,tran))
{
.DestinationTableName="AnDequan.dbo.[User]";//指定服务器上目标表的名称
.WriteToServer(InitSource());//执行把DataTable中的数据写入DB
tran.Commit();//提交事务
returntrue;//返回True执行成功!
}
}
}
}
catch(Exceptionex)
{
if(null!=tran)
tran.Rollback();
//LogHelper.Add(ex);
returnfalse;//返回False执行失败!
}
}
‘拾’ 如何高效地批量导入数据到SqlServer
SqlBulkCopy是个不错的选择,直接由DataTable可以导入到数据库,但要注意(1)列名与目标表一致(2)数据类型一致(3)空值容错处理,参考代码:///<summary///将<see cref="DataTable"/
的数据批量插入到数据库中。///</summary///<param name="dataTable"
要批量插入的
<see cref="DataTable"/。
</param///<param name="batchSize"
每批次写入的数据量。
</(DataTable dataTable,
stringtableName,
intbatchSize =10000){using(SqlConnection connection =newSqlConnection(myConnectionString)){try{connection.Open();//给表名加上前后导符using(varbulk =newSqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity,
null){DestinationTableName=tableName,
BatchSize=batchSize}){//循环所有列,为bulk添加映射//dataTable.EachColumn(c = bulk.ColumnMappings.Add(c.ColumnName, c.ColumnName), c = !c.AutoIncrement);foreach(DataColumn dcindataTable.Columns){bulk.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);}bulk.WriteToServer(dataTable);
bulk.Close();}returntrue;}catch(Exception exp){returnfalse;}finally{connection.Close();}}}
如果是数据量非常大,超过10W以上的数据,可以考虑生成.dtsx文件,然后由C#代码直接调用,效率还是不错的。