проблема обновления в sql - PullRequest
       30

проблема обновления в sql

1 голос
/ 02 декабря 2009

У меня есть оператор обновления, который выдает ошибку "Не удалось преобразовать значение параметра из строки [] в строку."

SqlCommand comm1 = new SqlCommand("UPDATE count set ETR=@ETR WHERE Id IN ( " + itemIDs + ")", connection);
                comm1.Parameters.Add("@ETR", System.Data.SqlDbType.VarChar, 50);
                comm1.Parameters["@ETR"].Value = delivery;

где itemIDs - это массив. Теперь я хочу установить значение ETR, равное значениям, извлеченным из массива «delivery». ETR для каждого itemID для соответствующего значения в массиве доставки

Ответы [ 5 ]

3 голосов
/ 02 декабря 2009

Вы должны выполнить 1 команду обновления для каждого элемента в вашей доставке, предпочтительно в транзакции.

SqlTransaction tx = connection.BeginTransaction();
SqlCommand comm1 = new SqlCommand("UPDATE count set ETR=@ETR WHERE Id=@ID", connection);
comm1.Connection = connection;
comm1.Transaction = transaction;
comm1.Parameters.Add("@ID", System.Data.SqlDbType.Int);
comm1.Parameters.Add("@ETR", System.Data.SqlDbType.VarChar, 50);
for(int i = 0; i < itemIDs.Count; i++) {



    comm1.Parameters["@ID"].Value = itemIDs[i];

    comm1.Parameters["@ETR"].Value = delivery[i];
    comm1.ExecuteNonQuery();
 }
 tx.Commit();
1 голос
/ 02 декабря 2009

comm1.Parameters.Add ( "@ ETR", System.Data.SqlDbType.VarChar, 50); comm1.Parameters ["@ ETR"]. Значение = доставка;

Ваш параметр "@ETR" представляет собой одну строку. То, что вы называете «доставкой», - это массив строк, как вы говорите сами. Это не сработает - никогда.

Вам нужно как-то переосмыслить свою логику.

1 голос
/ 02 декабря 2009

Я предполагаю, что ItemIds является строковым массивом. Вам нужно создать функцию, которая записывает itemID в строку через запятую

public string ArrayToCsv(string[] arr)
{
    StringBuilder sb = new StringBuilder();
    for each(string e in arr)
    {
        sb.Append(e);
        sb.Append(',');
    }

    if (sb.Length > 0)
        sb.Remove(sb.Length - 1, 1);

    return sb.ToString();
}

Я просто просматривал этот код из памяти, поэтому он может быть не на 100% точным, но он должен дать вам представление.

0 голосов
/ 02 декабря 2009

проблема не в itemID, а в заявлении comm1.Parameters ["@ ETR"]. Value = delivery; ETR - это строка, а чертовски массив, и я хочу передать каждое значение доставки в ETR

Как в одной записи со всеми значениями или разными записями?

Используя одну запись, вам нужно проанализировать строковый массив в csv или тому подобное.

StringBuilder sb = new StringBuilder();
foreach (string s in Delivery)
{
    sb.Append(s);
    sb.Append(",");
}
sb.Remove(sb.Length-2,1).ToString();
0 голосов
/ 02 декабря 2009

Оператор SQL ожидает строку через запятую, особенно с IN. Просто передайте массив функции, которая принимает массив и меняет 123456 на 1,2,3,4,5,6 и передает его обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...