- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
编辑:
我的问题不再是问题:我重做了我的性能测试,我犯了一个致命的愚蠢错误:我忘记了 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/
我是一名优秀的程序员,十分优秀!