我遇到了在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
答案 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
的可空性,这应该会有所帮助。