Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以为几十条UPDATE语句创建一个SQL查询?它应该提高性能吗?我的情况应该是什么样子?_C#_Sql_Sql Server_Sqlconnection - Fatal编程技术网

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();