2012-11-16 4 views
2

У меня был этот способ вставить новую компанию в базу данных, но у меня проблема с List<Contacts>, потому что я хочу иметь возможность вставлять несколько контактов для компании. Может кто-нибудь мне помочь? Сервер хранимая процедураВставить список <contacts> в таблицу

enter image description here

public static bool AddNewCompany(Company company,List<Contacts> contact , Location local) 
{ 
    // get a configured DbCommand object 
    DbCommand comm = GenericDataAccess.CreateCommand(); 

    // Set the stored procedure name 
    comm.CommandText = "AddNewCompany"; 

    //create new parameter @CompanyName 
    DbParameter param = comm.CreateParameter(); 
    param.ParameterName = "@CompanyName"; 
    param.Value = company.CompanyName; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @CompanyDetail 
    param = comm.CreateParameter(); 
    param.ParameterName = "@CompanyDetail"; 
    param.Value = company.CompanyDetail; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @ModifiedDate 
    param = comm.CreateParameter(); 
    param.ParameterName = "@ModifiedDate"; 
    param.Value = DateTime.Now; 
    param.DbType = DbType.DateTime; 
    comm.Parameters.Add(param); 

    //Company Info 
    foreach (var c in contact) 
    { 
     //create new parameter @LabelContactTypeID 
     param = comm.CreateParameter(); 
     param.ParameterName = "@LabelContactTypeID"; 
     param.Value = c.LabelContactTypeID; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 

     //create new parameter @ContactDetails 
     param = comm.CreateParameter(); 
     param.ParameterName = "@ContactDetails"; 
     param.Value = c.ContactDetail; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 

     //create new parameter @Status 
     param = comm.CreateParameter(); 
     param.ParameterName = "@Status"; 
     param.Value = c.Status; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 

     //create new parameter @Notes 
     param = comm.CreateParameter(); 
     param.ParameterName = "@Notes"; 
     param.Value = c.Notes; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 
    } 




    //Company Info 
    //create new parameter @Address 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Address"; 
    param.Value = local.Address; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @City 
    param = comm.CreateParameter(); 
    param.ParameterName = "@City"; 
    param.Value = local.City; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @Province 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Province"; 
    param.Value = local.Province; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @PostalCode 
    param = comm.CreateParameter(); 
    param.ParameterName = "@PostalCode"; 
    param.Value = local.PostalCode; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @Note 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Note"; 
    param.Value = local.Note; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @ModifiedDateLocation 
    param = comm.CreateParameter(); 
    param.ParameterName = "@ModifiedDateLocation"; 
    param.Value = DateTime.Now; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 


    try 
    { 
     return (GenericDataAccess.ExecuteNonQuery(comm) != -1); 

    } 
    catch 
    { 
     return false; 
    } 
} 

SQL:

ALTER PROCEDURE [dbo].[AddNewCompany] 
    @CompanyName nvarchar(50), 
    @CompanyDetail nvarchar(max), 
    @ModifiedDate datetime, 
    --ContactInfo 
    @LabelContactTypeID int, 
    @ContactDetails nvarchar(MAX), 
    @Status bit, 
    @Notes nvarchar(MAX), 
    -- Company Location 
    @Address nvarchar(max), 
    @City nvarchar(50), 
    @Province nvarchar(50), 
    @PostalCode nvarchar(10), 
    @Note nvarchar(max), 
    @ModifiedDateLocation datetime 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [TaskManagementSystem_DB].[dbo].[Company] ([companyName],[companyDetail], [modifiedDate]) 
    VALUES (@CompanyName, @CompanyDetail, @ModifiedDate) 

    DECLARE @CompanyID int 
    SET @CompanyID = SCOPE_IDENTITY(); 

    INSERT INTO [TaskManagementSystem_DB].[dbo].[Company_Contacts] ([companyID], [labelContactTypeID], [contactDetails], [status], [notes]) 
    VALUES (@CompanyID, @LabelContactTypeID, @ContactDetails, @Status, @Notes) 

    INSERT INTO [TaskManagementSystem_DB].[dbo].[Location]([address], [city], [province], [postalCode], [note], [modifiedDate]) 
    VALUES (@Address, @City, @Province, @PostalCode, @Note, @ModifiedDateLocation)   

    DECLARE @LocationID INT 
    SET @LocationID = SCOPE_IDENTITY(); 

    INSERT INTO [TaskManagementSystem_DB].[dbo].[Company_location]([companyID], [locationID]) 
    VALUES (@CompanyID, @LocationID)    
END 
+0

В чем проблема? – CodingGorilla

+0

Прямо сейчас он будет иметь последний цикл (var c in contact) – Paparazzi

+0

У меня есть список Я не знаю, как сделать код C# или Сохранить proc iterate бросить список , чтобы вставить в базу данных –

ответ

0

Ваша хранимая процедура ввода только один контакт для компании. Если вы хотите добавить другой контакт (или более того), напишите еще одну процедуру, которая будет вставлять новые контакты с использованием CompanyID из последней компании, вставленной в базу данных.

Я не могу написать вам код, потому что я не знаю, таблицы и не могут воспроизвести результаты, но вы должны создать еще одну процедуру из этого кода

INSERT INTO [TaskManagementSystem_DB].[dbo].[Company_Contacts] 
      ([companyID] 

      ,[labelContactTypeID] 
      ,[contactDetails] 
      ,[status] 
      ,[notes]) 
    VALUES 
      (@CompanyID 
      ,@LabelContactTypeID 
      ,@ContactDetails 
      ,@Status 
      ,@Notes) 

В первой части просто добавьте контакт из списка (первый, который находится на индексе 0 в списке)

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

EDIT Вы должны сделать что-то вроде этого:

public static bool AddNewCompany(Company company,List<Contacts> contact , Location local) 
{ 
    // get a configured DbCommand object 
    DbCommand comm = GenericDataAccess.CreateCommand(); 
//Set the store Proc name 
comm.CommandText = "AddNewCompany"; 


//create new parameter @CompanyName 
DbParameter param = comm.CreateParameter(); 
param.ParameterName = "@CompanyName"; 
param.Value = company.CompanyName; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 

//create new parameter @CompanyDetail 
param = comm.CreateParameter(); 
param.ParameterName = "@CompanyDetail"; 
param.Value = company.CompanyDetail; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 

//create new parameter @ModifiedDate 
param = comm.CreateParameter(); 
param.ParameterName = "@ModifiedDate"; 
param.Value = DateTime.Now; 
param.DbType = DbType.DateTime; 
comm.Parameters.Add(param); 

    //Company Info 
//add only one contact 
    /create new parameter @LabelContactTypeID 
     param = comm.CreateParameter(); 
     param.ParameterName = "@LabelContactTypeID"; 
     param.Value = contact[0].LabelContactTypeID; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 

    //create new parameter @ContactDetails 
    param = comm.CreateParameter(); 
    param.ParameterName = "@ContactDetails"; 
    param.Value = contact[0].ContactDetail; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @Status 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Status"; 
    param.Value = contact[0].Status; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @Notes 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Notes"; 
    param.Value = contact[0].Notes; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 


//Company Info 
//create new parameter @Address 
param = comm.CreateParameter(); 
param.ParameterName = "@Address"; 
param.Value = local.Address; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 

//create new parameter @City 
param = comm.CreateParameter(); 
param.ParameterName = "@City"; 
param.Value = local.City; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 

//create new parameter @Province 
param = comm.CreateParameter(); 
param.ParameterName = "@Province"; 
param.Value = local.Province; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 

//create new parameter @PostalCode 
param = comm.CreateParameter(); 
param.ParameterName = "@PostalCode"; 
param.Value = local.PostalCode; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 

//create new parameter @Note 
param = comm.CreateParameter(); 
param.ParameterName = "@Note"; 
param.Value = local.Note; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 

//create new parameter @ModifiedDateLocation 
param = comm.CreateParameter(); 
param.ParameterName = "@ModifiedDateLocation"; 
param.Value = DateTime.Now; 
param.DbType = DbType.StringFixedLength; 
comm.Parameters.Add(param); 


try 
{ 
    return (GenericDataAccess.ExecuteNonQuery(comm) != -1); 

} 
catch 
{ 
    return false; 
} 

}

Создать новый метод, который добавляет новый контакт, используя часть процедуры я вставил здесь и вставить все другие контакты. Pas к этому методу companyID.

+0

спасибо за помощь но можете ли вы показать мне, как это сделать? –

+0

Я отправляю фотографии для диаграммы базы данных –

+0

База данных в порядке, как я и думал. Я написал то, что вам нужно, но должен идти сейчас. Если вы все еще застряли завтра, я помогу вам. –

1

Переместить фирменную часть над контактом.

Поместите это в контактном контуре

GenericDataAccess.ExecuteNonQuery(comm); 

Это добавляет некоторую логику для проверки любого сбоя.
Это зависит от вас, если вы хотите продолжить или немедленно вернуться.

public static bool AddNewCompany(Company company,List<Contacts> contact , Location local) 
{ 
    // get a configured DbCommand object 
    DbCommand comm = GenericDataAccess.CreateCommand(); 


    //Set the store Proc name 
    comm.CommandText = "AddNewCompany"; 



    //create new parameter @CompanyName 
    DbParameter param = comm.CreateParameter(); 
    param.ParameterName = "@CompanyName"; 
    param.Value = company.CompanyName; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @CompanyDetail 
    param = comm.CreateParameter(); 
    param.ParameterName = "@CompanyDetail"; 
    param.Value = company.CompanyDetail; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @ModifiedDate 
    param = comm.CreateParameter(); 
    param.ParameterName = "@ModifiedDate"; 
    param.Value = DateTime.Now; 
    param.DbType = DbType.DateTime; 
    comm.Parameters.Add(param); 

    //Company Info 
    //create new parameter @Address 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Address"; 
    param.Value = local.Address; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @City 
    param = comm.CreateParameter(); 
    param.ParameterName = "@City"; 
    param.Value = local.City; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @Province 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Province"; 
    param.Value = local.Province; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @PostalCode 
    param = comm.CreateParameter(); 
    param.ParameterName = "@PostalCode"; 
    param.Value = local.PostalCode; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @Note 
    param = comm.CreateParameter(); 
    param.ParameterName = "@Note"; 
    param.Value = local.Note; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    //create new parameter @ModifiedDateLocation 
    param = comm.CreateParameter(); 
    param.ParameterName = "@ModifiedDateLocation"; 
    param.Value = DateTime.Now; 
    param.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(param); 

    // need to split up the SP to add the company here 
    // execute company SP here 
    // and get back the companyID 
    // can just clear out the parameters and reuse it 
    comm.Parameters.Clear(); 

    //and you can just define the parameters once 
    //create new parameter @LabelContactTypeID 
    paramTypeID = comm.CreateParameter(); 
    paramTypeID.ParameterName = "@LabelContactTypeID";  
    paramTypeID.DbType = DbType.StringFixedLength; 
    comm.Parameters.Add(paramTypeID); 

    //Company Info 
    foreach (var c in contact) 
    { 
     //create new parameter @LabelContactTypeID 
     paramTypeID.Value = c.LabelContactTypeID; 

     //create new parameter @ContactDetails 
     param = comm.CreateParameter(); 
     param.ParameterName = "@ContactDetails"; 
     param.Value = c.ContactDetail; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 

     //create new parameter @Status 
     param = comm.CreateParameter(); 
     param.ParameterName = "@Status"; 
     param.Value = c.Status; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 

     //create new parameter @Notes 
     param = comm.CreateParameter(); 
     param.ParameterName = "@Notes"; 
     param.Value = c.Notes; 
     param.DbType = DbType.StringFixedLength; 
     comm.Parameters.Add(param); 

     try 
     { 
      if (GenericDataAccess.ExecuteNonQuery(comm) == -1) return false; 
      // this syntax is not what I am used to 
      // i useally just comm.ExecuteNonQuer(); 
     } 
     catch 
     { 
      return false; 
     } 
    } 
    return true;  
} 
+0

Мне нужно изменить Store proc? –

+0

Да, вам нужно разделить детали компании и клиента. У SP нет способа получить и массировать (что я знаю). – Paparazzi

Смежные вопросы