ahmed_sa Ответов: 1

То, что я пишу цикл для отображения похожих код товара на datagridview и вставить другой артикул по базе данных SQL-сервера


Проблема

Таблица элементов базы данных SQL Server(2014)

Артикул(ПК) наименование

001 мышь

002 клавиатура

003 наушники

В файле Excel sheet 2010

Наименование Артикул

001 мышь

002 клавиатура

004 экран

005 ОЗУ

На самом деле мне нужно при импорте файла excel вставлять разные элементы кода которых не существует

в базе данных sql server и существующие элементы в базе данных и найденные в Excel не вставляются, а отображаются в datagridview .

в соответствии с моим случаем вставьте itemcodes 004,005 на элементы таблицы.

и показать 001,002 в виде сетки как существующие элементы .

моя функция как показано ниже

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

public static void ImportFromExcelToDataBase()  
    {  
       Datatable dt = ShowExcelData();  
       DataTable dtItems = GetSqlItems();  
         
            for (int i = 0; i < dt.Rows.Count; i++)  
            {  
                //what i write here   
                // if itemcode exist on excel exist on sql server database  
                then display similar items exist on database and excel as 001,002 on datagridview  
                //else   
                 // do insert data  
                string Insert = "Insert Into Values (" + data + ")";  
                DataAccess.ExecuteNonQuery(Insert);  
            }  
                 
    }  
 public DataTable ShowExcelData()  
        {  
            string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", txtpath.Text);  
  
            OleDbConnection con = new OleDbConnection(connectionString);  
  
  
            con.Open();  
            DataTable dt = new DataTable();  
  
            dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);  
  
            string SheetName = dt.Rows[0]["TABLE_NAME"].ToString();  
  
  
            OleDbCommand com = new OleDbCommand();  
            com.Connection = con;  
             
            com.CommandText = @"SELECT  [ItemCode],[ItemsName],[ItemAddress] FROM  [" + SheetName + "] ";  
            OleDbDataAdapter oledbda = new OleDbDataAdapter();  
            oledbda.SelectCommand = com;  
            DataSet ds = new DataSet();  
            oledbda.Fill(ds);  
            dt = ds.Tables[0];  
            con.Close();  
            return dt;  
  
  
        }  
dt = ShowExcelData();  
  
 public DataTable GetSqlItems()  
        {  
            string GetItems = @"select ItemCode,ItemsName,ItemAddress from Items";  
  
  
           DataTable tbGetItems = DataAccess.ExecuteDataTable(GetItems );  
            return tbGetItems ;  
        }  
dtItems = GetSqlItems();  

1 Ответов

Рейтинг:
0

Salman622

to achieved the desire functionality follow below steps

create a type in sql like this should be same as your excel file format :


create type type_ItemTable as table
(
	ItemCode nvarchar(50),
	ItemName nvarchar(100)
)


then create a procedure in sql as below


create Procedure sp_InsertBulkItemNotExist
(
	@Details type_ItemTable ReadOnly
)
as
begin

	--Insert All Item in Temporary table
	Select * into #Temp from ItemTable

	--Insert All item from Excel Data which ItemCode doesn't exists
	Insert into ItemTable(ItemCode,ItemName)
	Select ItemCode,ItemName from @Details where ItemCode Not in
	(Select ItemCode from ItemTable)

	--returns all Item that are exists in ItemTable
	Select * from @Details where ItemCode in (Select ItemCode from #Temp)
end



then in you showexceldata()


public DataTable ShowExcelData()  
        {  
            string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", txtpath.Text);  
            OleDbConnection con = new OleDbConnection(connectionString);  
            con.Open();  
            DataTable dt = new DataTable();  
            dt = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);  
            string SheetName = dt.Rows[0]["TABLE_NAME"].ToString();  
            OleDbCommand com = new OleDbCommand();  
            com.Connection = con;  
            com.CommandText = @"SELECT  [ItemCode],[ItemsName] FROM  [" + SheetName + "] ";  
            OleDbDataAdapter oledbda = new OleDbDataAdapter();  
            oledbda.SelectCommand = com;  
            DataTable dtReturn = new DataTable();  
            oledbda.Fill(dtReturn); 
			//dtReturn Columns should be same as of created type in sql
            con.Close();  
			SqlConnection con = new SqlConnection("YourConnectionstring");
			SqlCommand cmd = new SqlCommand("sp_InsertBulkItemNotExist", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Details", dtReturn);
            cmd.CommandTimeout = 0;
			SqlDataAdapter adap = new SqlDataAdapter(cmd, con);
			dt=new DataTable();
			adap.Fill(dt);
            return dt;  
        }



then at time of Importing Excel Sheet
just call ShowExcelData() as


DataTable dt=ShowExcelData();


after execution of above state all new items will be inserted into ItemTable and already exist Item will return in dt