c#run query更新sql server数据库并不是所有正在更新的记录

时间:2014-08-13 09:24:54

标签: c# sql .net sql-server

我遇到了在c#中运行查询以更新sql server中的表的问题。

总的来说,我在桌子上更新了大约2500条记录。但是,大约有350行没有更新acq_rank字段。所以我通过查看cmdText变量和参数值来检查查询。如果我复制这些值并手动在sql server中运行查询(此帖子的底部),查询将更新表。我不确定发生了什么。

更新

比较更新的记录和没有更新的记录,似乎任何名称中包含逗号的公司都没有更新。我如何解决这个问题?

调试代码时,我可以看到公司名称通常是“某个名称”,但是当它们包含逗号时,它看起来像“\”,某些名称带有逗号\“”

C#

 for (int i = 0; i < rankList.Count; i++)
            {
                string cmdText;

                if(rankList[i].company_id == "NULL")                    
                    cmdText = "update MA_DEALS_COUNTRY set acq_rank = @rank where deal_id = @deal and company_id is null and co_name = @coname";                    
                else                    
                    cmdText = "update MA_DEALS_COUNTRY set acq_rank = @rank where deal_id = @deal and company_id = @co_id and co_name = @coname";                    

                _command = new SqlCommand(cmdText, _connection);

                if (rankList[i].company_id == "NULL")
                {
                    _command.Parameters.Add("@deal", System.Data.SqlDbType.VarChar).Value = rankList[i].DealId;
                    _command.Parameters.Add("@coname", System.Data.SqlDbType.VarChar).Value = rankList[i].CoName;
                    _command.Parameters.Add("@rank", System.Data.SqlDbType.Int).Value = rankList[i].Rank;
                }
                else
                {
                    _command.Parameters.Add("@deal", System.Data.SqlDbType.VarChar).Value = rankList[i].DealId;
                    _command.Parameters.Add("@co_id", System.Data.SqlDbType.VarChar).Value = rankList[i].company_id;
                    _command.Parameters.Add("@coname", System.Data.SqlDbType.VarChar).Value = rankList[i].CoName;
                    _command.Parameters.Add("@rank", System.Data.SqlDbType.Int).Value = rankList[i].Rank;
                }

                _command.ExecuteNonQuery();

                Console.WriteLine("row " + i.ToString());
            }

SQL Server手动更新

我已经包含了两个update语句 - 一个用于company_id为空时,另一个用于

declare @rank int
declare @deal varchar(20)
declare @co_id varchar(5)
declare @coname varchar(max)

set @rank = 0
set @deal = '136344MM'
set @co_id = 'AB240'
set @coname = 'Company Capital Partners, Inc.'

update MA_DEALS_COUNTRY set acq_rank = @rank where deal_id = @deal and company_id is null and acquirer_name = @coname

update MA_DEALS_COUNTRY set acq_rank = @rank where deal_id = @deal and company_id = @co_id and acquirer_name = @coname

2 个答案:

答案 0 :(得分:1)

当update语句比较 co_name = @coname 时,可能会出现问题。您必须遵循与具有逗号的公司进行比较的代码。

您还提到了#34;而不是&#34;某些名称,&#34;它看起来像&#34; \&#34;某个名字,\&#34;&#34;

尝试:

一个。

_command.Parameters.Add("@coname", System.Data.SqlDbType.VarChar).Value = Convert.ToString(rankList[i].CoName);

_command.Parameters.Add("@coname", System.Data.SqlDbType.VarChar).Value = rankList[i].CoName.ToString();

℃。

搜索&#39; \&#39;和&#39;&#39;&#39;字符串中的字符并删除它们。这不是解决问题的最好方法,因为&#39; \&#39;或&#39;&#34;&#39;在完成作业时,不应该首先出现在那里。

string valueString = rankList[i].CoName.ToString();
            while (valueString.IndexOf('"') > -1)
        {
            if (valueString.Length - 1 == valueString.IndexOf('"'))
                valueString = valueString.Remove(valueString.IndexOf('"'));
            else
            valueString = valueString.Remove(valueString.IndexOf('"'), valueString.IndexOf('"')+1);
        }
        while (valueString.IndexOf('\\') > -1)
        {
            if (valueString.Length - 1 == valueString.IndexOf('\\'))
                valueString = valueString.Remove(valueString.IndexOf('\\'));
            else
            valueString = valueString.Remove(valueString.IndexOf('\\'), valueString.IndexOf('\\')+1);
        }
_command.Parameters.Add("@coname", System.Data.SqlDbType.VarChar).Value = valueString;

答案 1 :(得分:1)

嗯,对于初学者来说,无论@co_id参数的可空性如何,以下版本的查询都会起作用:

update MA_DEALS_COUNTRY set acq_rank = @rank
where deal_id = @deal
and nullif(@co_id, company_id) is null
and co_name = @coname

考虑如何测试rankList[i].company_id的可空性,这应该会有所帮助。