我有一个listArray,结构如下:
listArray[0] insert_idlist = listArray (value, value, value, ect)
此数组在每个维度中包含大约2000个值。
var string_list = "'" + string.Join("', '", insert_idlist[0]) + "'";
//var string_list = "'0169624'";
对于db查询目的,我试图将第一个维度连接成一个字符串,如上所述。但是在部署时会导致程序挂起,并且根据以前的部署环境经验,我怀疑大量的值是原因。
当启用注释行而不是代码按预期运行时。
任何人都可以建议一种可以提供性能改进的替代方法吗?
答案 0 :(得分:0)
我认为您可以使用表值参数将列表传递给DB。
这将解决您的连接问题,因为它没有首先出现。
表值参数提供了一种编组多行的简便方法 从客户端应用程序到SQL Server的数据不需要 多次往返或特殊服务器端逻辑处理 数据。您可以使用表值参数来封装数据行 在客户端应用程序中,将数据发送到服务器中 参数化命令。传入的数据行存储在表中 然后可以使用Transact-SQL操作变量。
首先在MSDN上阅读此article。
答案 1 :(得分:0)
您可以使用'capacity'构造函数参数尝试'StringBuilder'并预先分配足够的空间。这样,在构建目标字符串时,不必一次又一次地将字符串复制到更长的缓冲区。 然后使用foreach语句或类似语句进行连接。
这可能会或可能不会更快,具体取决于'string.Join'在内部实现的方式,在不同版本的.NET框架中可能会有所不同。
答案 2 :(得分:0)
如果您以牺牲可读性为代价寻求性能提升,那么在循环中使用StringBuilder应该比String.Join<T>(string, IEnumerable<T>)
更快(如果您避免使用foreach,则更快)。
看看:
Stringbuilder in foreach slower than in for and String.Join() SUCKS on collections?
答案 3 :(得分:-2)
作为参数传递。
using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
{
//
// Add new SqlParameter to the command.
//
command.Parameters.Add(new SqlParameter("Name", dogName));
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
int weight = reader.GetInt32(0);
string name = reader.GetString(1);
string breed = reader.GetString(2);
Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight,name,breed);
}
}