数据库批量更新问题

数据库批量更新问题,第1张

我用oracle的语句格式来写:
update table0
set nearcells = (select nearcells from datatable where lac=table0lac and cellid=table0cellid )
where exists (select 1 from datatale where lac=table0lac and cellid=table0cellid )

有一个办法,可能是你想要的。但是不保证一定能实现你的目的。
在C#中有一个SqlCommandBuilder类,该类用来批量自动更新表数据变化,
说是自动更新,其实是根据已知的select语句,来自动生成其他的update,delete语句。
我以前项目的sqlhelper中,用这个类自定义过批量更新方法,在winform中使用一切ok。方法发你,看有用没。
有些细节一定要注意的是,表状态决定表数据的 *** 作,比如表某行状态是修改,那么SqlCommandBuilder会执行update。但是这个状态你要控制好。另外,你传递的select语句,一定要和你所构造的表结构接近吻合。看方法。
/// <summary>
/// operare database by commandbuilder
/// </summary>
/// <param name="connectinString">connectinString</param>
/// <param name="commandString">commandString</param>
/// <param name="sourceDable">do update or insert database table</param>
public static int ExecuteByCommandBuilder(string connectinString, string commandString, DataTable sourceDable, SqlParameter sqlparam)
{
SqlConnection sqlcon = new SqlConnection();
sqlconConnectionString = connectinString;
using (SqlCommand sqlcommand = new SqlCommand(commandString, sqlcon))
{
if (sqlparam != null)
{ sqlcommandParametersAdd(sqlparam); }
SqlDataAdapter da = new SqlDataAdapter();
daSelectCommand = sqlcommand;
//DataSet ds = new DataSet();
//daFill(ds);
//dsTables[0]Merge(sourceDable, false);
SqlCommandBuilder sqlcommandbuilder = new SqlCommandBuilder(da);
return daUpdate(sourceDable);
}
}

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
{
connOpen();
ConsoleWriteLine("数据库连接成功");
return true;
}
catch (SystemException ex)
{
ConsoleWrite(exMessage);
MessageBoxShow("未能连接到数据库");
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 tBASEID = :equipmentId, tBASENAME = :equipmentName,tCA_NAME = :propertyName,tCA_RULETYPE = :ruleType,tCA_RULETEXT = :ruleRequest,tCA_RULETEXT2 = :ruleRequestOther,tCONTENT = :ruleExplain where tCA_ID =:ruleId";
OracleCommand cmd = new OracleCommand(sql, conn);
OracleParameter param_1 = new OracleParameter(":equipmentId", equipmentId);
cmdParametersAdd(param_1);
OracleParameter param_2 = new OracleParameter(":equipmentName", equipmentName + "$");
cmdParametersAdd(param_2);
OracleParameter param_3 = new OracleParameter(":propertyName", propertyName);
cmdParametersAdd(param_3);
OracleParameter param_4 = new OracleParameter(":ruleType", ruleType);
cmdParametersAdd(param_4);
OracleParameter param_5 = new OracleParameter(":ruleRequest", ruleRequest);
cmdParametersAdd(param_5);
OracleParameter param_6 = new OracleParameter(":ruleRequestOther", ruleRequestOther);
cmdParametersAdd(param_6);
OracleParameter param_7 = new OracleParameter(":ruleExplain", ruleExplain);
cmdParametersAdd(param_7);
OracleParameter param_8 = new OracleParameter(":ruleId", ruleId);
cmdParametersAdd(param_8);
int result = cmdExecuteNonQuery();
return result;
}

首先, 插入上万条数据,对于数据库来说并不是“很大”的工作量,一般配置的笔记本电脑都可以在1分钟内完成。 所以最简单、最灵活的办法还是写SQL语句。
如果不希望DB编译器每次执行都编译SQL的话,可以使用存储过程,直接调用,性能上会好很多。也比较简单。
(几万条数据怎么地也得要时间去处理,所以不可能特别快的。)
如果由于各种原因,导致这个插入还是很慢, 而且你的MYSQL又是50以上版本的话,可以使用BulkCopy来进行批量 *** 作。
BulkCopy的原理就是Client直接把一个数组(DataTable)传给DB,然后传入表名,所有的编译、 *** 作都由DB自己完成,效率很高。
引用MySqlDatadll , 调用MysqlBulkCopy函数即可。
这个函数在处理海量数据插入的时候效率尤为明显, 小量数据反而没什么优势,而且由于传入的DataTable格式必须和表的字段一模一样(空的列也要传进去),导致C#要写很多代码来构造这个数组,所以要你自己权衡用还是不用。
我在自己的电脑上批量插入一亿条数据,Insert写法大概需要1小时,BulkCopy大概只需要5分钟。

可以,下面的代码可以批量更新access数据库表
SQL = "INSERT INTO [数据库表名] SELECT FROM [Excel 80;DATABASE=" & _
ThisWorkbookFullName & ";HDR=YES;IMEX=1][Sheet1$];"

使用merge语句吧
语法:
MERGE INTO 目标表 AS A
USING 源表 AS B
ON (ACOL = BCOL) --匹配条件
WHEN MATCHED THEN --当匹配上就用B表的字段更新A表的字段
UPDATE SET
ACOL1 = BCOL1,

ACOLn = BCOLn
WHEN NOT MATCHED THEN INSERT(ACOL1,,ACOLn) --下面这句是不匹配就插入数据
VALUES (BCOL1,,BCOLn);

更新查询,查询语句:
update 表1 set 表1a=表2a,表1b=表2b,表1d=表2d
from 表1,表2 where 表1c=表2c

祝你成功!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12943539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存