substring Je le code suivant:erreur Substring mais pas en utilisant
public static long CreateVendorsEmailJob(List<Recipient> recipients, string subject, string body)
{
long emailJobId;
using (var connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString))
{
connection.Open();
// create email job
using (var command = new MySqlCommand())
{
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText =
string.Format(
"INSERT INTO email_job (parent_id, job_type_lookup_id, from_email, from_name, subject, body_type_lookup_id, body, status_lookup_id, total_emails, persist_addresses) VALUES ({0}, {1}, '{2}', '{3}', '{4}', {5}, '{6}', {7}, {8}, {9})",
5000,
745,
"[email protected]",
"Company Management System",
subject,
22,
body,
27,
recipients.Count,
1);
command.ExecuteNonQuery();
emailJobId = command.LastInsertedId;
}
using (var command = new MySqlCommand())
{
command.Connection = connection;
command.CommandType = CommandType.Text;
string commandText = "INSERT INTO email_job_email (job_id, comm_optin_id, name, email) VALUES ";
var valuesToAdd = new List<string>();
recipients.ForEach(r => valuesToAdd.Add(string.Format("({0}, {1}, '{2}', '{3}')", emailJobId, r.RecipientId, r.Name, r.EmailAddress)));
commandText += string.Join(",", valuesToAdd.ToArray());
command.CommandText = commandText;
command.ExecuteNonQuery();
}
connection.Close();
}
return emailJobId;
}
Ce code fonctionne bien lors de l'exécution d'une tâche, mais j'exécuter ce même code pour une autre tâche et il ne fonctionne pas. Il me donne l'erreur suivante:
Index and length must refer to a location within the string.
Parameter name: length
Maintenant, la seule différence entre chaque fois que je le lance est le sujet et le corps du message. Ils sont stockés dans un fichier de ressources et transmis lorsque la méthode est appelée. Mais ce que je n'arrive pas à comprendre, c'est où cette exception arriverait-elle? Il s'agit d'un service Windows et fonctionne sur une machine distante, donc le débogage n'est pas si simple et je n'ai pas un bon environnement de développement pour refléter le leur.
L'erreur que j'ai déjà vue mais qui semble toujours être liée à une sorte de manipulation de sous-chaîne. Le texte est juste quelques trucs de base et l'un est très similaire à l'autre, donc je ne peux même pas voir pourquoi cela causerait cela.
Des idées sur quoi ou pourquoi?
EDIT: Ok, donc après avoir eu un moment aha et réalisé que je pouvais imprimer une trace de la pile ici est ce que je suis -
at MySql.Data.MySqlClient.MySqlTokenizer.NextParameter()
at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
at MySql.Data.MySqlClient.Statement.BindParameters()
at MySql.Data.MySqlClient.PreparableStatement.Execute()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
at PCM.AutoWorkEngine.Tasks.RecurringVendorMailer.Entities.DataMappers.EmailJobMapper.CreateVendorsEmailJob(List`1 recipients, String subject, String body) in C:\Projects\PCM\PCM.AutoWorkEngine.RecurringVendorMailer\Entities\DataMappers\EmailJobMapper.cs:line 65
at PCM.AutoWorkEngine.Tasks.RecurringVendorMailer.HOAVendorTask.Execute() in C:\Projects\PCM\PCM.AutoWorkEngine.RecurringVendorMailer\HOAVendorTask.cs:line 24
at PCM.AutoWorkEngine.AutoWorkEngineService.Start() in C:\Projects\PCM\PCM.AutoWorkEngine\AutoWorkEngineService.cs:line 80
Ce que je ne suis pas familier avec autant est des déclarations préparées pour MySql . Je n'essaie pas d'utiliser quelque chose comme ça. Mais j'ai des guillemets simples dans le texte. Mais j'ai ceux dans les deux textes et ils fonctionnent bien dans le premier, donc je ne sais pas si c'est ça. Je leur échappe dans le fichier de ressources en utilisant backslash.
Avez-vous une trace complète de la pile? – adrianbanks
Pour une raison quelconque, il m'est tout simplement venu à l'esprit de l'imprimer. Je travaille donc sur la mise en place du code pour le faire maintenant. Donne moi 5 minutes. – spinon