gpt4 book ai didi

C#-SQL : How to execute a batch of StoredProcedure?

转载 作者:太空宇宙 更新时间:2023-11-03 17:10:12 26 4
gpt4 key购买 nike

编辑:
我的问题不再是问题:我重做了我的性能测试,我犯了一个致命的愚蠢错误:我忘记了 x1000 来从毫秒中获取秒数:/对不起那些家伙。
有关信息:
- 我每秒从我的 PC 到本地网络上的数据库服务器进行大约 1900 次更新。
- 如果程序与数据库位于同一台机器上,则每秒更新 3.200 次。
- 在数据库服务器上从我的 PC 每秒更新 3.500 我没有重新创建和重新打开一个新的 SQLConnection。
- 每秒 5.800 次更新,带有批处理文本。对于我的 10.000 行,如果需要 5 秒,对我的程序来说没问题。抱歉让你担心了。

实际上,我使用 SQL 存储过程在我的数据库中创建一行以避免 SQL 注入(inject)。在 C# 中,我有以下方法:

public void InsertUser(string userCode)
{
using (SqlConnection sqlConnection = new SqlConnection(this.connectionString))
{
SqlCommand sqlCommand = new SqlCommand("InsertUser", sqlConnection);
sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
sqlCommand.Parameters.Add(new SqlParameter("@UserCode", userCode));
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();///0.2 seconds !ERROR HERE! 0.2ms here,NOT 0.2sec!!!
}
}

当我要插入一两行时效果很好。但是如果我需要创建 1.000 个用户和 10.000 个产品以及 5000 个宠物,这不是最好的解决方案:我将在网络传输上浪费大量时间。

我相信,无需检查,我只能使用有限数量的回调。所以我不想调用 10.000 次:

sqlCommand.BeginExecuteNonQuery()

另一种方法是创建批处理文本,但存在 SQL 注入(inject)风险(而且很丑陋)。

在 .Net 中是否有管理它的“SqlCommandList”对象?如何在数据库中进行大量写入?什么是好的模式?

最佳答案

这应该运行得更快一些:

public void InsertUser(IEnumerable<string> userCodes)
{
using (SqlConnection sqlConnection = new SqlConnection(this.connectionString),
SqlCommand sqlCommand = new SqlCommand("InsertUser", sqlConnection))
{
sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter param = sqlCommand.Parameters.Add("@UserCode", SqlDbTypes.VarChar);
sqlConnection.Open();

foreach(string code in userCodes)
{
param.Value = code;
sqlCommand.ExecuteNonQuery();///0.2 seconds
}
}
}

这只会打开一个连接并且只会创建一个命令,即使您将它传递给 1000 个用户也是如此。不过,它仍然会分别执行每个插入操作。当然,如果 userCode 不是字符串,您需要适本地重构它。您可能还想查看 SQL Server 的 BULK INSERT命令。

关于C#-SQL : How to execute a batch of StoredProcedure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/200986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com