當前位置:首頁 » 數據倉庫 » datatable批量插入資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

datatable批量插入資料庫

發布時間: 2022-12-08 09:50:09

『壹』 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#代碼直接調用,效率還是不錯的。