npgsql - 多插入更新解决方案的最佳解决方案
问题描述
作为初学者,努力理解 C# 和 Npgsql。以下代码示例:
// Insert some data
using (var cmd = new NpgsqlCommand())
{ cmd.Connection = conn;
cmd.CommandText = "INSERT INTO data (some_field) VALUES (@p)";
cmd.Parameters.AddWithValue("p", "Hello world");
cmd.ExecuteNonQuery();
}
到目前为止,这样的多个插入和更新语句的语法很清楚:
cmd.CommandText = "INSERT INTO data (some_field) VALUES (@p);INSERT INTO data1...;INSERT into data2... and so on";
但是对于应该处理其中的一个语句的循环来说,正确的解决方案是什么。
这不起作用:
// Insert some data
using (var cmd = new NpgsqlCommand())
{
foreach(s in SomeStringCollectionOrWhatever)
{
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO data (some_field) VALUES (@p)";
cmd.Parameters.AddWithValue("p", s);
cmd.ExecuteNonQuery();
}
}
似乎这些值将被“连接”或记住。我看不到任何“清除”现有 cmd 对象的可能性。
我的第二个解决方案是将整个“使用”块包装到循环中。但是每个循环都会创建一个新对象。这对我来说似乎很丑陋。
那么我的问题的最佳解决方案是什么?
解决方案
要有效地插入大量行,请查看 Npgsql 的批量复制功能- 该 API 更适合(并且更有效)插入大量行,而不是像您尝试做的那样将 INSERT 语句连接到批处理中。
推荐阅读
- angular - ngx-datatable 切换组不起作用
- laravel - 有没有办法以雄辩的方式传递条件,如果密钥存在,那么不要从集合中发送对象(在 mongodb 中)?
- reactjs - 使用 React 前端处理密钥保护 API 操作的正确方法是什么?
- go - 调试时的日期值
- flutter - 当 video_player 加载 HLS 视频时 Flutter 应用崩溃
- android - Android (Kotlin) - 无法从另一个类访问视图
- swift - 在同一个多平台(iOS、macOS、watchOS、tvOS)应用程序中支持不同的生命周期方法
- javascript - 上下文菜单'无法读取菜单的属性'Angular 7
- azure - AzureDataFactory:使用 HTTP 连接器从 URL 下载 Excel 文件给出 Excel 格式“不支持”问题
- c# - 从 .NET Core 3.1 WinForms 中的资源文件中检索字符串值(需要简单示例)