SnvMohan Ответов: 3

C# сохранить datatable в sqlserver с помощью класса sqlhelper


Я пытаюсь сохранить dataTable в SQL server. Я могу сохранять записи, но я пытаюсь сохранить только три записи, но записи дублируются(3 раза) в таблице SQL. Я не знаю, почему его дублируют. Кто-нибудь, пожалуйста, помогите мне решить эту проблему как можно скорее

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

Here is My code :

C#:
            DataTable InfoTB = new DataTable("infotb");
            DataColumn DC_Name = new DataColumn("name", typeof(string));
            DataColumn DC_Age = new DataColumn("age", typeof(string));
            DataColumn DC_Details = new DataColumn("details", typeof(string));    
            InfoTB.Columns.Add(DC_Name);
            InfoTB.Columns.Add(DC_Age);
            InfoTB.Columns.Add(DC_Details);
           
            InfoTB.Rows.Add("Mano", "27", "Programmer");
            InfoTB.Rows.Add("Jhon", "50", "Analyst");
            InfoTB.Rows.Add("Diwani", "26", "Tester");

            DataSet ds = new DataSet();
            ds.Tables.Add(InfoTB);          

            SqlConnection sqlConn = new SqlConnection(localconstr);
            SqlCommand ins_cmd = new SqlCommand("Insert_Info", sqlConn);
            ins_cmd.CommandType = CommandType.StoredProcedure;
            ins_cmd.Parameters.Add("@tblinfo", ds.Tables["infotb"]);

            SqlHelper.UpdateDataset(ins_cmd, null, null, ds, "infotb");


Stored Procedure :
=================
CREATE PROCEDURE [dbo].[Insert_Info]

@tblinfo infoType READONLY

as
Begin     
      insert into infotb (name,age,details)
      SELECT name,age,details FROM @tblinfo

End


UserDefinedTableType
=====================
CREATE TYPE [dbo].[infoType] AS TABLE(
	[name] [varchar](50) NULL,
	[age] [varchar](10) NULL,
	[details] [varchar](250) NULL
)
GO


Table Script:
============

CREATE TABLE [dbo].[infotb](
	[ID] [int] IDENTITY(1000,1) NOT NULL,
	[Name] [varchar](50) NULL,
	[Age] [varchar](50) NULL,
	[Details] [varchar](150) NULL,
	[RID] [uniqueidentifier] ROWGUIDCOL  NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[infotb] ADD  CONSTRAINT [DF_infotb_RID]  DEFAULT (newid()) FOR [RID]
GO

Wendelius

С помощью отладчика убедитесь, что вы не просто вызываете метод C# дважды

SnvMohan

Я проверил, что методы выполняются только один раз

Wendelius

Как работает метод SqlHelper.UpdateDataset выглядит так?

SnvMohan

общественная статический недействительным UpdateDataset(sqlcommand, который команды insertcommand, deletecommand, принадлежащие sqlcommand, который, sqlcommand, который updateCommand, набор данных, набор данных, строка таблицы)
{
//если (команды insertcommand == значение null) бросить новое исключение ArgumentNullException("команды insertcommand");
//если (deletecommand, принадлежащие == значение null) бросить новое исключение ArgumentNullException("deletecommand, принадлежащие");
//if (updateCommand == null) throw new ArgumentNullException ("updateCommand");
if (tableName = = null | / tableName.Length == 0) throw new ArgumentNullException ("tableName");

// Создайте SqlDataAdapter и избавьтесь от него после того, как мы закончим
использование (SqlDataAdapter dataAdapter = new SqlDataAdapter())
{
// Установка команд адаптера данных
if (updateCommand != null) dataAdapter.UpdateCommand = updateCommand;
если (выберите вкладку != значение null) объекта dataadapter.Команды insertcommand = команды insertcommand;
если (deletecommand, принадлежащие != значение null) объекта dataadapter.Deletecommand, принадлежащие = deletecommand, принадлежащие;

// Обновление изменений набора данных в источнике данных
объект DataAdapter.Обновление (dataSet, tableName);

// Зафиксируйте все изменения, внесенные в набор данных
набор данных.Метод acceptchanges();
}
}

3 Ответов

Рейтинг:
1

Wendelius

Причина в том, что вы вызываете хранимую процедуру при передаче команды update все строки для добавления и использования данных используется адаптер.

Другими словами, если ваша таблица данных содержит 3 строки, адаптер данных вызывает процедуру 3 раза, по одному разу для каждой строки. Однако вы передаете все данные из таблицы данных в процедуру, поэтому каждое выполнение добавляет все строки.

Это означает, что вызовы адаптера идут следующим образом
- Вызов 1 для первого datarow: добавлено 3 строки
- Вызов 2 для второго datarow: добавлено 3 строки
- Вызов 3 для третьего datarow: добавлено 3 строки
И в результате получается 9 добавленных строк.


Рейтинг:
0

#realJSOP

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


SnvMohan

При отладке, при выполнении dataAdapter.Update (dataSet, tableName); строка в методе UpdateDataset класса SQLHELPER, параметр dataset содержит только 3 строки, столбцы и значения назначаются правильно. После выполнения этой строки всего в таблицу SQL добавлено 9 строк.(Перед выполнением SQL-таблица пуста). Но через SqlCommand.ExecuteNonQuery(); он работает правильно

Рейтинг:
0

SnvMohan

Теперь я просто комментирую эту строку SqlHelper.UpdateDataset(ins_cmd, нуль, нуль, ДС "infotb"); и добавить следующие коды(sqlConn.Открыть(); ins_cmd.ExecuteNonQuery(); sqlConn. Close();) Теперь он работает нормально. Но до сих пор я не могу понять, почему записи дублируются при использовании SqlHelper.Метод UpdateDataset.

С#:
DataSet ds = новый набор данных();
ДС.Таблицы.Добавить(InfoTB);

SqlConnection sqlConn = new SqlConnection(localconstr);
SqlCommand ins_cmd = new SqlCommand ("Insert_Info", sqlConn);
ins_cmd. CommandType = CommandType.Хранимая процедура;
ins_cmd. Parameters. Add ("@tblinfo", ds.Tables ["infotb"]);

//SqlHelper.UpdateDataset(ins_cmd, null, null, ds, " infotb");

sqlConn.Открыть();
ins_cmd.Метод executenonquery();
sqlConn.Рядом();