C# 是否可以为几十条UPDATE语句创建一个SQL查询?它应该提高性能吗?我的情况应该是什么样子?
我有个问题。在下面的代码中有一个C# 是否可以为几十条UPDATE语句创建一个SQL查询?它应该提高性能吗?我的情况应该是什么样子?,c#,sql,sql-server,sqlconnection,C#,Sql,Sql Server,Sqlconnection,我有个问题。在下面的代码中有一个foreach循环,其中为trucks集合内部的每个对象truck创建查询字符串。循环迭代100次(例如,集合中的100个对象)。带循环的方法被调用2000次 为了获得更好的性能,我放弃了使用ORM。但是,不幸的是,我仍然对代码执行速度有点失望 请注意,对于每个迭代对象,都会创建字符串查询,例如,该查询如下所示: 更新dbo.Trucks 设置官方编号='5124095' ,状态='未定义' ,PerformanceUpdate=@PerformanceUpdat
foreach
循环,其中为trucks
集合内部的每个对象truck
创建查询字符串。循环迭代100次(例如,集合中的100个对象)。带循环的方法被调用2000次
为了获得更好的性能,我放弃了使用ORM。但是,不幸的是,我仍然对代码执行速度有点失望
请注意,对于每个迭代对象,都会创建字符串查询
,例如,该查询如下所示:
更新dbo.Trucks
设置官方编号='5124095'
,状态='未定义'
,PerformanceUpdate=@PerformanceUpdate
,PictureLink=http://www.somewebsite.com/photos/middle////.jpg'
式中,truchid=405664;
接下来,在解析command.Parameters
之后,如果它们存在(在本例中为@performanceupdate
),则通过库方法发送查询,其中int rows=command.ExecuteNonQuery()//执行SQL
。以此类推,100次。请注意,查询字符串取决于对象属性,因此每种情况都会有所不同
以下是我的问题。我想知道,是否有可能为循环中的所有100个对象创建一个查询并立即发送?如果是,是否应该提高性能?如果是,示例查询应该是什么样子
下面是创建循环的代码,其中创建和执行SQL查询:
using (SqlConnection connection = GetConnection(_connectionString))
using (SqlCommand command = connection.CreateCommand())
{
connection.Open();
foreach (SomeObject truck in trucks)
{
Console.WriteLine("Updating " + counter++ + " of " + trucks.Count);
//clean up string for basic data
truck.Status = CleanUpStringCases(truck.Status);
truck.Destination = CleanUpStringCases(truck.Destination);
//clean up string for full AIS data
if (dataType == "full")
{
truck.TruckType = CleanUpStringCases(truck.TruckType);
}
//PARSE
SomeObject existing = new SomeObject();
//find existing truck to be updated
if (truck.OfficialNumber > 0) existing = _context.trucks.Where(v => v.OfficialNumber == truck.OfficialNumber).FirstOrDefault();
StringBuilder querySb = new StringBuilder();
if (existing != null)
{
//update for basic data
querySb.Append("UPDATE dbo." + _trucksTableName + " SET OfficialNumber = '" + truck.OfficialNumber + "'");
if (existing.MNCI == 0) if (truck.MNCI.HasValue) querySb.Append(" , MNCI = '" + truck.MNCI + "'");
if (truck.LatestActivity.HasValue) querySb.Append(" , LatestActivity = @LatestActivity");
if (truck.ETA.HasValue) querySb.Append(" , ETA = @ETA");
if (!string.IsNullOrEmpty(truck.Status)) querySb.Append(" , Status = '" + truck.Status + "'");
if (!string.IsNullOrEmpty(truck.Destination)) querySb.Append(" , Destination = '" + truck.Destination + "'");
if (!string.IsNullOrEmpty(truck.Area)) querySb.Append(" , Area = '" + truck.Area + "'");
if (truck.HeadingTo.HasValue) querySb.Append(" , HeadingTo = @HeadingTo");
if (truck.Lat.HasValue) querySb.Append(" , Lat = @Lat");
if (truck.Lon.HasValue) querySb.Append(" , Lon = @Lon");
if (truck.Speed.HasValue)
{
querySb.Append(" , Speed = @Speed");
if ((existing.SpeedMax < truck.Speed || existing.SpeedMax == null) && truck.Speed != 0) querySb.Append(" , SpeedMax = @Speed"); //update speed max
}
//string for full AIS data
if (dataType == "full")
{
if (truck.PerformancesUpdate.HasValue) querySb.Append(" , PerformancesUpdate = @PerformancesUpdate");
if (!string.IsNullOrEmpty(truck.TruckType)) querySb.Append(" , TruckType = '" + truck.TruckType + "'");
if (!string.IsNullOrEmpty(truck.PictureLink)) querySb.Append(" , PictureLink = '" + truck.PictureLink + "'");
if (truck.LOA.HasValue) querySb.Append(" , LOA = '" + truck.LOA + "'");
if (truck.Height.HasValue) querySb.Append(" , Height = '" + truck.Height + "'");
}
querySb.Append(" WHERE truckId = " + existing.truckId + "; ");
}
try
{
string query = querySb.ToString();
command.CommandText = query;
if (query.Contains("LatestActivity ="))
command.Parameters.AddWithValue("@LatestActivity", truck.LatestActivity);
if (query.Contains("ETA ="))
command.Parameters.AddWithValue("@ETA", truck.ETA);
if (query.Contains("PerformancesUpdate ="))
command.Parameters.AddWithValue("@PerformancesUpdate", truck.PerformancesUpdate);
if (query.Contains("HeadingTo ="))
command.Parameters.AddWithValue("@HeadingTo", truck.HeadingTo);
if (query.Contains("Lat ="))
command.Parameters.AddWithValue("@Lat", truck.Lat);
if (query.Contains("Lon ="))
command.Parameters.AddWithValue("@Lon", truck.Lon);
if (query.Contains("Speed ="))
command.Parameters.AddWithValue("@Speed", truck.Speed);
command.CommandTimeout = 30;
command.CommandType = CommandType.Text;
int rows = command.ExecuteNonQuery(); //execute SQL
command.Parameters.Clear();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
connection.Close();
}
使用(SqlConnection=GetConnection(_connectionString))
使用(SqlCommand=connection.CreateCommand())
{
connection.Open();
foreach(卡车中的SomeObject卡车)
{
Console.WriteLine(“更新”+trucks.Count的“+计数器+++”);
//清理基本数据的字符串
卡车状态=清洗管柱状态(卡车状态);
卡车目的地=清洗管柱状态(卡车目的地);
//清除完整AIS数据的字符串
如果(数据类型=“完整”)
{
truck.TruckType=清洗管柱状态(truck.TruckType);
}
//解析
SomeObject existing=新的SomeObject();
//查找要更新的现有卡车
if(truck.OfficialNumber>0)existing=_context.trucks.Where(v=>v.OfficialNumber==truck.OfficialNumber.FirstOrDefault();
StringBuilder querySb=新的StringBuilder();
if(现有!=null)
{
//更新基本数据
querySb.Append(“更新dbo。”+_trucksTableName+“SET OfficialNumber=”“+truck.OfficialNumber+”);
if(existing.MNCI==0)if(truck.MNCI.HasValue)querySb.Append(“,MNCI='”+truck.MNCI+”);
if(truck.LatestActivity.HasValue)querySb.Append(“,LatestActivity=@LatestActivity”);
if(truck.ETA.HasValue)querySb.Append(“,ETA=@ETA”);
如果(!string.IsNullOrEmpty(truck.Status))querySb.Append(“,Status='”+truck.Status+”);
如果(!string.IsNullOrEmpty(truck.Destination))querySb.Append(“,Destination='”+truck.Destination+”);
如果(!string.IsNullOrEmpty(truck.Area))querySb.Append(“,Area='”+truck.Area+”);
if(truck.HeadingTo.HasValue)querySb.Append(“,HeadingTo=@HeadingTo”);
if(truck.Lat.HasValue)querySb.Append(“,Lat=@Lat”);
if(truck.Lon.HasValue)querySb.Append(“,Lon=@Lon”);
if(卡车速度值)
{
querySb.Append(“,Speed=@Speed”);
if((existing.SpeedMaxSqlCommand command = connection.CreateCommand()
var querySb = new Stringbuilder();
for(int i = 0; i < trucks.Count; i++)
{
[...]
if (truck.Speed.HasValue)
{
querySb.Append(" , Speed = @Speed" + i);
command.Parameters.AddWithValue("@Speed" + i, truck.Speed);
}
querySb.AppendLine();
}
command.CommandText = querySb.ToString();
command.ExecuteNonQuery();