Member 11952997 Ответов: 2

Извлеките табличные данные и сохраните их в той же таблице на языке Си#


всем привет.
Я проблема, с которой сталкиваются.
моя проблема находится ниже.

сначала я разрабатываю настольное приложение в Visual Studio 2010 на c#, а бэк-энд-инструмент-sqlserver 2005.

у меня есть имя таблицы warehousemaster и поля (id,CompanyName,WarehouseCode,WarehouseName,wareaddress,city,contactno,FinancialYear).

теперь я вставить запись в базе данных SQL [1,АВС ПВТ.ЛТД.VFFSV1,VFFSV1,ABCaddres ,ABCCity, 000000, 2019-2020]

теперь в соответствии с изменением финансового года в следующем месяце(2020-2021) я не хочу изменять существующие данные, но я хочу вставить те же данные только в изменении финансового года.
каковы возможные пути???
я хочу получить с помощью sql data reader старые данные и вставить эти данные .
я тестирую оба способа, используя процедуру хранения и запрос также.
ниже я упоминаю в соответствии с процедурой хранения. а также сообщение об ошибке отображения времени вставки.
сообщение об ошибке: "с этой командой уже связан открытый DataReader, который должен быть закрыт в первую очередь. "

Что я уже пробовал:

SqlCommand cmd3 = new SqlCommand("retriveWarehouseNameGrid ",con);
cmd3.Свойство Commandtype = Значение Commandtype.Хранимая процедура;
SqlDataReader sdr3 = cmd3.Метода executereader();
пока (размере sdr3.Читать())
{

warecompanyname = sdr3["CompanyName"].Метод toString();
warehousecode = sdr3["WarehouseCode"].Метод toString();
warehousename1 = sdr3["WarehouseName"].Метод toString();
wareaddress = sdr3["wareaddress"].Метод toString();
warecity = sdr3["город"].Метод toString();
warecontactno = sdr3["контактно"].Метод toString();
warefinnacialyear = sdr3["финансовый год"].Метод toString();

SqlCommand cmd4 = new SqlCommand("insertWarehouseMaster", con);
cmd4.Свойство Commandtype = Значение Commandtype.Хранимая процедура;
cmd4.параметры.AddWithValue("@WarehouseCode", warehousecode);
cmd4.параметры.AddWithValue("@WareHouseName ", warehousename1);
cmd4.параметры.AddWithValue("@CompanyName", warecompanyname);
cmd4.параметры.AddWithValue("@financialyear", sumyear);
cmd4.параметры.AddWithValue("@wareaddress", wareaddress);
cmd4.параметры.AddWithValue ("@city", warecity);
cmd4.параметры.AddWithValue("@contactno", warecontactno);

cmd4.Метод executenonquery();
}
размере sdr3.рядом();

ZurdoDev

Ошибка означает, что вам нужно либо закрыть открытый считыватель, либо открыть новый считыватель по новой команде.

Member 11952997

спасибо вам сэр,
проблема в том, что я хочу скопировать табличные данные, но сохранить их с другим финансовым годом.

ZurdoDev

Да, но это не имеет никакого отношения к вашему коду или ошибке.

2 Ответов

Рейтинг:
2

phil.o

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

public class Ware
{
   public string CompanyName { get; set; }
   public string HouseCode { get; set; }
   public string HouseName { get; set; }
   public string Address { get; set; }
   public string City { get; set; }
   public string ContactNo { get; set; }
}

// ...

List<Ware> wares = new List<Ware>();

using (SqlConnection con = [initialize your connection here])
{
   con.Open();

   using (SqlCommand cmd3 = new SqlCommand("retriveWarehouseNameGrid ",con))
   {
      cmd3.CommandType = CommandType.StoredProcedure;

      using (SqlDataReader sdr3 = cmd3.ExecuteReader())
      {
         while (sdr3.Read())
         {
            Ware ware = new Ware();
            ware.CompanyName = sdr3["CompanyName"].ToString();
            ware.HouseCode = sdr3["WarehouseCode"].ToString();
            ware.HouseName = sdr3["WarehouseName"].ToString();
            ware.Address = sdr3["wareaddress"].ToString();
            ware.City = sdr3["city"].ToString();
            ware.ContactNo = sdr3["contactno"].ToString();
            wares.Add(ware);
         }
      }
   }

   using (SqlCommand cmd4 = new SqlCommand("insertWarehouseMaster", con))
   {
      cmd4.CommandType = CommandType.StoredProcedure;
      cmd4.Parameters.Add("@WarehouseCode", DbType.String);
      cmd4.Parameters.Add("@WareHouseName ", DbType.String);
      cmd4.Parameters.Add("@CompanyName", DbType.String);
      cmd4.Parameters.Add("@financialyear", DbType.String);
      cmd4.Parameters.Add("@wareaddress", DbType.String);
      cmd4.Parameters.Add("@city", DbType.String);
      cmd4.Parameters.Add("@contactno", DbType.String);

      foreach (Ware ware in wares)
      {
         cmd4.Parameters["@WarehouseCode"].Value = ware.HouseCode;
         cmd4.Parameters["@WareHouseName "].Value = ware.HouseName;
         cmd4.Parameters["@CompanyName"].Value = ware.CompanyName;
         cmd4.Parameters["@financialyear"].Value = "2020-2021";
         cmd4.Parameters["@wareaddress"].Value = ware.Address;
         cmd4.Parameters["@city"].Value = ware.City;
         cmd4.Parameters["@contactno"].Value = ware.ContactNo;
         cmd4.ExecuteNonQuery();
      }
   }
}


Member 11952997

спасибо, сэр. у меня есть решение.

Рейтинг:
0

OriginalGriff

Пока DataReader открыт, соединение "занято" - потому что DataReader делает "круговое путешествие" в БД каждый раз, когда вы читаете новую строку.
Пока он занят, вы не можете выдать новую команду на том же соединении - потому что это может испортить текущую выполняемую команду.

Есть два способа обойти это:
1) Используйте DataAdapter вместо DataReader и заполните DataTable своими данными. Затем вы можете обработать DataTable и выдать команды для существующего объекта подключения.
2) Создайте второй объект соединения, который будет использоваться для операций вставки.

Это также очень хорошая идея, чтобы использовать using блокируйте, чтобы убедиться, что ваши объекты Command и DataReader автоматически удаляются, когда они выходят за пределы области действия, а также соединение.


Member 11952997

спасибо вам сэр,
но я не могу правильно понять ваши два пути.
не могли бы вы прислать мне глубокую информацию или относительный пример?

OriginalGriff

Ты ведь шутишь, правда?
Вы не знаете, как создать SqlConnection? Как вы написали код, который показали нам?

Member 11952997

извините,я не шучу, я мало что знаю. но у меня есть решение, сэр.
спасибо тебе.