I have developed a Windows Forms application using C#. Once running this, allows us to browse an Excel file and fills the records from that file into a DataTable
.
I am using an OleDbConnection
to perform this action. Using a connection string, performing a bulk copy of this DataTable
to a table inside the database.
Total no. of records in the Excel file is 3,27,761
Excel bulk export to DataTable
:
DataTable dtAll = new DataTable();
string connString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + FilePath1 + ";Extended Properties=Excel 12.0;";
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [Raw Data$]", conn);
sheetAdapter.Fill(dtAll);
conn.Close();
Bulk copy the DataTable
and save it to SQL Server database table SourceTable
:
con.Open();
using (SqlBulkCopy copy = new SqlBulkCopy(con))
{
copy.ColumnMappings.Add(0, 0);
copy.ColumnMappings.Add(1, 1);
copy.ColumnMappings.Add(2, 2);
copy.ColumnMappings.Add(3, 3);
copy.ColumnMappings.Add(4, 4);
copy.ColumnMappings.Add(5, 5);
copy.DestinationTableName = "SourceTable";
copy.WriteToServer(dtAll);
}
Now, the total no. of records in SourceTable
is 3,27,761
I am calling a stored procedure SP_InsertToTargetTable
.
SqlConnection con = new SqlConnection("server=(local);database=CN-DataCleansing;integrated security=true; Connect Timeout=300");
SqlCommand cmd = new SqlCommand("SP_InsertToSourceTable1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 300;
cmd.ExecuteNonQuery();
After execution, application throws the following exception.
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
The stored procedure written inside the DB:
ALTER PROCEDURE [dbo].[SP_InsertToTargetTable]
as
begin
declare @e1 nvarchar(50)
declare @fn1 nvarchar(50)
declare @ln1 nvarchar(50)
declare @ln1Lenght int
declare @ph1 nvarchar(50)
declare @t1 nvarchar(50)
declare @c1 nvarchar(50)
declare @lnfn1 nvarchar(max)
declare @ContactStatus nvarchar(50)
set @ContactStatus = null
declare @PhoneStatus nvarchar(50)
set @PhoneStatus = null
declare @Notes nvarchar(50)
set @Notes = null
declare @splitLN1 nvarchar(1)
declare @splitLN2 nvarchar(1)
declare @splitLN3 nvarchar(1)
declare @splitLN4 nvarchar(1)
declare @splitLN5 nvarchar(1)
declare @PhNochecked nvarchar(1)
declare @CountryCode nvarchar(3) = '+86'
declare @CityCode nvarchar(3)
declare @Phone1 nvarchar(4)
declare @Phone2 nvarchar(4)
declare @PhoneWOSpace nvarchar(50)
declare @finalPhNo nvarchar(18)
declare @EMailNew nvarchar(50)
DECLARE @EMail CURSOR
SET @EMail = CURSOR FOR
SELECT [Email Address] FROM SourceTable1
OPEN @EMail
FETCH NEXT FROM @EMail INTO @EMailNew
WHILE @@FETCH_STATUS = 0
BEGIN
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
-- Select each row --
SELECT @e1 = [Email Address], @fn1 = [First Name], @ln1 = [Last Name], @ln1Lenght = len([Last Name]),
@ph1 = [Business Phone], @t1 = Title, @c1 = City, @lnfn1 = ([Last Name] + ' ' + [First Name])
FROM SourceTable1 where [Email Address]=@EMailNew
-- End Select each row --
-- First name is null and Last name length = 3 --
if @ln1Lenght = 3 and LEN(@fn1) = 0
begin
set @splitLN1=substring(@ln1,1,1)
set @splitLN2=substring(@ln1,2,1)
set @splitLN3=substring(@ln1,3,1)
set @fn1=@splitLN1
set @ln1=@splitLN2 + @splitLN3
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END criteria-1 --
-- First name is null and Last name length = 4 --
else if @ln1Lenght = 4 and LEN(@fn1) = 0
begin
--set @Criteria123 = 2
set @splitLN1=substring(@ln1,1,1)
set @splitLN2=substring(@ln1,2,1)
set @splitLN3=substring(@ln1,3,1)
set @splitLN4=substring(@ln1,4,1)
set @fn1=@splitLN1 + @splitLN2
set @ln1=@splitLN3 + @splitLN4
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END criteria-2 --
-- First name is null and Last name length = 5 --
else if @ln1Lenght = 5 and LEN(@fn1) = 0
begin
--set @Criteria123 = 3
set @splitLN1=substring(@ln1,1,1)
set @splitLN2=substring(@ln1,2,1)
set @splitLN3=substring(@ln1,3,1)
set @splitLN4=substring(@ln1,4,1)
set @splitLN5=substring(@ln1,5,1)
set @fn1=@splitLN1 + @splitLN2
set @ln1=@splitLN3 + @splitLN4 + @splitLN5
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END criteria-3 --
-- Last name is null and First name length = 3 --
else if @ln1Lenght = 0 and LEN(@fn1) = 3
begin
--set @Criteria123 = 1
set @splitLN1=substring(@fn1,1,1)
set @splitLN2=substring(@fn1,2,1)
set @splitLN3=substring(@fn1,3,1)
set @fn1=@splitLN1
set @ln1=@splitLN2 + @splitLN3
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END criteria-4 --
-- Last name is null and First name length = 4 --
else if @ln1Lenght = 0 and LEN(@fn1) = 4
begin
--set @Criteria123 = 2
set @splitLN1=substring(@fn1,1,1)
set @splitLN2=substring(@fn1,2,1)
set @splitLN3=substring(@fn1,3,1)
set @splitLN4=substring(@fn1,4,1)
set @fn1=@splitLN1 + @splitLN2
set @ln1=@splitLN3 + @splitLN4
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END criteria-5 --
-- Last name is null and First name length = 5 --
else if @ln1Lenght = 0 and LEN(@fn1) = 5
begin
--set @Criteria123 = 3
set @splitLN1=substring(@fn1,1,1)
set @splitLN2=substring(@fn1,2,1)
set @splitLN3=substring(@fn1,3,1)
set @splitLN4=substring(@fn1,4,1)
set @splitLN5=substring(@fn1,5,1)
set @fn1=@splitLN1 + @splitLN2
set @ln1=@splitLN3 + @splitLN4 + @splitLN5
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END criteria-6 --
-- First Name or Last name containing 小姐 --
declare @testvar nvarchar(50)
if CHARINDEX(N'小姐',@fn1) > 0
begin
set @testvar=@fn1
SELECT @fn1 = REPLACE(@testvar,N'小姐','');
set @t1=N'小姐'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
else if CHARINDEX(N'小姐',@ln1) > 0
begin
set @testvar=@ln1
SELECT @ln1 = REPLACE(@testvar,N'小姐','');
set @t1=N'小姐'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing 小姐 --
-- First Name or Last name containing 先生 --
else if CHARINDEX(N'先生',@fn1) > 0
begin
set @testvar=@fn1
SELECT @fn1 = REPLACE(@testvar,N'先生','');
set @t1=N'先生'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
else if CHARINDEX(N'先生',@ln1) > 0
begin
set @testvar=@ln1
SELECT @ln1 = REPLACE(@testvar,N'先生','')
set @t1=N'先生'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing 先生 --
-- First Name or Last name containing 经理 --
else if CHARINDEX(N'经理',@fn1) > 0
begin
set @testvar=@fn1
SELECT @fn1 = REPLACE(@testvar,N'经理','')
set @t1=N'经理'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
else if CHARINDEX(N'经理',@ln1) > 0
begin
set @testvar=@ln1
SELECT @ln1 = REPLACE(@testvar,N'经理','')
set @t1=N'经理'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing 经理 --
-- First Name or Last name containing 女士 --
else if CHARINDEX(N'女士',@fn1) > 0
begin
set @testvar=@fn1
SELECT @fn1 = REPLACE(@testvar,N'女士','')
set @t1=N'女士'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
else if CHARINDEX(N'女士',@ln1) > 0
begin
set @testvar=@ln1
SELECT @ln1 = REPLACE(@testvar,N'女士','')
set @t1=N'女士'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing 经理 --
-- First Name or Last name containing 老师 --
else if CHARINDEX(N'老师',@fn1) > 0
begin
set @testvar=@fn1
SELECT @fn1 = REPLACE(@testvar,N'老师','')
set @t1=N'老师'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
else if CHARINDEX(N'老师',@ln1) > 0
begin
set @testvar=@ln1
SELECT @ln1 = REPLACE(@testvar,N'老师','')
set @t1=N'老师'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing 老师 --
-- First Name or Last name containing 老师 --
else if CHARINDEX(N'主任',@fn1) > 0
begin
set @testvar=@fn1
SELECT @fn1 = REPLACE(@testvar,N'主任','')
set @t1=N'主任'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
else if CHARINDEX(N'主任',@ln1) > 0
begin
set @testvar=@ln1
SELECT @ln1 = REPLACE(@testvar,N'主任','')
set @t1=N'主任'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing 主任 --
-- First Name or Last name containing 部长 --
else if CHARINDEX(N'部长',@fn1) > 0
begin
set @testvar=@fn1
SELECT @fn1 = REPLACE(@testvar,N'部长','')
set @t1=N'部长'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
else if CHARINDEX(N'部长',@ln1) > 0
begin
set @testvar=@ln1
SELECT @ln1 = REPLACE(@testvar,N'部长','')
set @t1=N'部长'
set @ContactStatus = null
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing 部长 --
-- First name and Last name are same --
else if @fn1 = @ln1
begin
set @ContactStatus = 'First name and Last name are same'
set @PhoneStatus = null
set @Notes = null
end
-- END First name and Last name are same --
-- First Name or Last name containing #$$%123 --
else if CHARINDEX('`',@fn1) > 0 or CHARINDEX('`',@ln1) > 0
or CHARINDEX('~',@fn1) > 0 or CHARINDEX('~',@ln1) > 0
or CHARINDEX('!',@fn1) > 0 or CHARINDEX('!',@ln1) > 0
or CHARINDEX('@',@fn1) > 0 or CHARINDEX('@',@ln1) > 0
or CHARINDEX('#',@fn1) > 0 or CHARINDEX('#',@ln1) > 0
or CHARINDEX('$',@fn1) > 0 or CHARINDEX('$',@ln1) > 0
or CHARINDEX('%',@fn1) > 0 or CHARINDEX('%',@ln1) > 0
or CHARINDEX('^',@fn1) > 0 or CHARINDEX('^',@ln1) > 0
or CHARINDEX('&',@fn1) > 0 or CHARINDEX('&',@ln1) > 0
or CHARINDEX('*',@fn1) > 0 or CHARINDEX('*',@ln1) > 0
or CHARINDEX('(',@fn1) > 0 or CHARINDEX('(',@ln1) > 0
or CHARINDEX(')',@fn1) > 0 or CHARINDEX(')',@ln1) > 0
or CHARINDEX('-',@fn1) > 0 or CHARINDEX('-',@ln1) > 0
or CHARINDEX('_',@fn1) > 0 or CHARINDEX('_',@ln1) > 0
or CHARINDEX('=',@fn1) > 0 or CHARINDEX('=',@ln1) > 0
or CHARINDEX('+',@fn1) > 0 or CHARINDEX('+',@ln1) > 0
or CHARINDEX('[',@fn1) > 0 or CHARINDEX('[',@ln1) > 0
or CHARINDEX(']',@fn1) > 0 or CHARINDEX(']',@ln1) > 0
or CHARINDEX('{',@fn1) > 0 or CHARINDEX('{',@ln1) > 0
or CHARINDEX('}',@fn1) > 0 or CHARINDEX('}',@ln1) > 0
or CHARINDEX('\',@fn1) > 0 or CHARINDEX('\',@ln1) > 0
or CHARINDEX('|',@fn1) > 0 or CHARINDEX('|',@ln1) > 0
or CHARINDEX(';',@fn1) > 0 or CHARINDEX(';',@ln1) > 0
or CHARINDEX(':',@fn1) > 0 or CHARINDEX(':',@ln1) > 0
or CHARINDEX('"',@fn1) > 0 or CHARINDEX('"',@ln1) > 0
or CHARINDEX(',',@fn1) > 0 or CHARINDEX(',',@ln1) > 0
or CHARINDEX('.',@fn1) > 0 or CHARINDEX('.',@ln1) > 0
or CHARINDEX('<',@fn1) > 0 or CHARINDEX('<',@ln1) > 0
or CHARINDEX('>',@fn1) > 0 or CHARINDEX('>',@ln1) > 0
or CHARINDEX('/',@fn1) > 0 or CHARINDEX('/',@ln1) > 0
or CHARINDEX('?',@fn1) > 0 or CHARINDEX('?',@ln1) > 0
begin
set @ContactStatus = 'Contains junk'
set @PhoneStatus = null
set @Notes = null
end
-- END First Name or Last name containing #$$%123 --
-- Change the phone number format --
if LEN(@ph1) > 0
begin
set @PhNochecked = '0'
if CHARINDEX('-',@ph1) > 0
begin
set @PhoneWOSpace = REPLACE (@ph1, '-', '')
set @PhNochecked = '1'
end
if CHARINDEX(' ',@ph1) > 0
begin
set @PhoneWOSpace = REPLACE (@ph1, ' ', '' )
set @PhNochecked = '1'
end
if CHARINDEX('/',@ph1) > 0
begin
set @ph1 = SUBSTRING(@ph1, 1, CHARINDEX('/', @ph1) - 1)
set @ph1 = REPLACE (@ph1, '/', '' )
set @PhoneWOSpace = REPLACE (@ph1, ' ', '' )
set @PhNochecked = '1'
end
if CHARINDEX('.',@ph1) > 0
begin
set @ph1 = SUBSTRING(@ph1, 1, CHARINDEX('.', @ph1) - 1)
set @ph1 = REPLACE (@ph1, '.', '' )
set @PhoneWOSpace = REPLACE (@ph1, ' ', '' )
set @PhNochecked = '1'
end
if @PhNochecked = '0'
set @PhoneWOSpace = @ph1
if (@PhNochecked = '1' or @PhNochecked = '0') and LEN(@PhoneWOSpace) = 11
begin
set @CityCode=substring(@PhoneWOSpace,1,1)+substring(@PhoneWOSpace,2,1)+substring(@PhoneWOSpace,3,1)
set @Phone1=substring(@PhoneWOSpace,4,1)+substring(@PhoneWOSpace,5,1)+substring(@PhoneWOSpace,6,1)
+substring(@PhoneWOSpace,7,1)
set @Phone2=substring(@PhoneWOSpace,8,1)+substring(@PhoneWOSpace,9,1)+substring(@PhoneWOSpace,10,1)
+substring(@PhoneWOSpace,11,1)
set @finalPhNo='+86' + ' ' + @CityCode + ' ' + @Phone1 + ' ' + @Phone2
set @ph1 = @finalPhNo
set @PhoneStatus = null
end
else if @PhNochecked = '1' and LEN(@PhoneWOSpace) = 12
begin
set @CityCode=substring(@PhoneWOSpace,1,1)+substring(@PhoneWOSpace,2,1)+substring(@PhoneWOSpace,3,1)
+substring(@PhoneWOSpace,4,1)
set @Phone1=substring(@PhoneWOSpace,5,1)+substring(@PhoneWOSpace,6,1)+substring(@PhoneWOSpace,7,1)
+substring(@PhoneWOSpace,8,1)
set @Phone2=substring(@PhoneWOSpace,9,1)+substring(@PhoneWOSpace,10,1)+substring(@PhoneWOSpace,11,1)
+substring(@PhoneWOSpace,12,1)
set @finalPhNo='+86' + ' ' + @CityCode + ' ' + @Phone1 + ' ' + @Phone2
set @ph1 = @finalPhNo
set @PhoneStatus = null
end
else if @PhNochecked = '0' and (LEN(@PhoneWOSpace) > 12 or LEN(@PhoneWOSpace) < 11)
set @PhoneStatus = 'Business phone cannot identified'
end
else
set @PhoneStatus = 'Business phone is null'
-- END phone number format --
-- Finally do insert --
insert into TargetTable ([Email Address], [First Name],[Last Name],[Business Phone],Title,City,
LastNameFirstName,Contact_status,Phone_status,Notes)
values (rtrim(ltrim(@e1)), rtrim(ltrim(@fn1)), rtrim(ltrim(@ln1)), rtrim(ltrim(@ph1)), rtrim(ltrim(@t1)),
rtrim(ltrim(@c1)), rtrim(ltrim((@ln1 + ' ' + @fn1))),rtrim(ltrim(@ContactStatus)),rtrim(ltrim(@PhoneStatus)),
rtrim(ltrim(@Notes)))
-- END insert --
FETCH NEXT FROM @EMail INTO @EMailNew
END
CLOSE @EMail
DEALLOCATE @EMail
end
Can anyone provide the solution to overcome the above exception?