c#运行查询来更新SQL server数据库,并不是所有的记录都被更新



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

我总共更新了我的表中的2500条记录。然而,大约有350行acq_rank字段没有被更新。因此,我通过查看cmdText变量和参数值来检查查询。如果我复制这些值,并在sql server手动运行查询(这篇文章的底部)查询更新表。我不知道发生了什么事。

比较有更新和没有更新的记录,似乎任何名称中带有逗号的公司都是没有更新的。我该如何避开这个问题?

在调试代码时,我可以看到公司名称通常是"some name",但是当它们包含逗号时,它看起来像""some name加逗号"

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 Manual Update

我包含了两个更新语句—一个用于company_id为null时,另一个用于当它不是

时。
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

更新语句比较co_name = @coname时可能出现问题。你必须遵循代码,在这里比较的是一个带有逗号的公司。

你还提到它看起来像""some name,"而不是"some name"

试题:

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

b .

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

C。

在字符串中搜索''和'"'字符并删除它们。这并不是最好的方法,因为在赋值时,''或'"'一开始就不应该出现。

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;

对于初学者来说,无论@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的可空性,这应该会有所帮助。

最新更新