У меня есть программа для обновления наборов значений дубликатов.Значения в наборе будут обновлены: 1. Содержат ли они определенный символ по заданному индексу.2. Самое высокое доступное значение int в смешанном столбце int / varchar для связанной таблицы.
Я застрял на том, как обновить дублирующиеся наборы для данного набора результатов.Когда я запускаю функцию, значения не обновляются.
Используя SSMS, я могу успешно получить экземпляры дубликатов, используя SP ниже:
CREATE PROCEDURE [dbo].[getCOAgents]
AS
BEGIN
SET NOCOUNT ON;
SELECT a.agent_shortname
FROM BrokerTest AS a INNER JOIN
(SELECT agent_shortname, COUNT(*) AS Expr1
FROM BrokerTest
GROUP BY agent_shortname
HAVING (COUNT(*) > 1)) AS b ON a.agent_shortname = b.agent_shortname
WHERE (a.agent_shortname LIKE '_________C%') AND (a.term =
'NB')
ORDER BY a.agent_shortname
END
GO
И это мой код для вызова SP:
private static List<Broker> GetNewCOBrokerCodes()
{
List<Broker> duplicates = new List<Broker>();
using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
{
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand("getCOAgents", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
Broker broker = new Broker();
broker.Code = dr["agent_shortname"].ToString();
duplicates.Add(broker);
}
conn.Close();
}
return duplicates;
}
Код для обновления наборов дубликатов приведен ниже. Я могу получить самое высокое значение int, вызвав SP spGetHighestAGCode , но обновление, похоже, не действует, так как значения не меняютсяв базе данных:
public ActionResult NewAGAgentMapping()
{
Models.FileUpload.Mapping mapping = new Models.FileUpload.Mapping();
try
{
List<Broker> gnbc = GetNewCOBrokerCodes();
using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
{
Models.FileUpload.Mapping mappinggg = new Models.FileUpload.Mapping();
SqlCommand cmd = new SqlCommand("spGetHighestAGCode", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@returnValue", SqlDbType.Int);
cmd.Parameters.Add("@returnValue", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
int Counter = Convert.ToInt32(cmd.Parameters["@returnValue"].Value);
int newCode = Counter + 1;
conn.Close();
mappinggg.Counter = "AG" + newCode.ToString("000000");
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
conn.Close();
//Update the Duplicates
var duplicateBrokers = gnbc.FindDuplicates(p => p.Code);
int n = duplicateBrokers.Count;
for (int i = 0; i < n; i++)
{
//bool isDuplicate = false;
for (int j = 0; j < i; j++)
{
while (duplicateBrokers[i] == duplicateBrokers[j])
{
foreach (var dupBroker in duplicateBrokers)
{
using (SqlConnection conn1 = new SqlConnection(Helpers.DatabaseConnect))
{
Models.FileUpload.Mapping mappingg = new Models.FileUpload.Mapping();
string query = "UPDATE BrokerTest SET agent_shortname ='" + Convert.ToString(mappinggg.Counter) + "' WHERE agent_shortname='" + dupBroker + "'";
SqlCommand command = new SqlCommand(query, conn1);
conn1.Open();
command.ExecuteNonQuery();
conn1.Close();
}
}
}
}
}
}
}
catch (Exception ex)
{
ViewBag.ErrorMessage = Helpers.Messages.GENERAL_ERROR;
return View("");
}
return RedirectToAction("AccountAnalysisResponse");
}
Если мой набор результатов возвращает 2 набора дубликатов, которые содержат символ C с индексом 10, следующим образом:
ALID-HEA-CO-001
ALID-HEA-CO-001
ALID-HEA-CO-001
EMIL-MTR-CO-012
EMIL-MTR-CO-012
, а в связанной таблице мой запрос возвращаетмаксимальная доступная как 23 (от AG00023), тогда я хочу обновить наборы дубликатов выше как:
AG00024
AG00024
AG00024
AG00025
AG00025