将C#中的10000条记录插入SQL Server

时间:2014-04-15 14:30:45

标签: c# sql-server

我有一个C#控制台程序

  • Input表(Keyid varchar(4), Address varchar(100), Name varchar(100))中选择10000条记录。

  • 对于来自Input表的每条记录,它会调用一个返回数据的API(如果有人在该地址中工作,状态就可以,否则也不行,也会返回地址类型 - 感兴趣的地方或住宅,商业等)需要保存在一个主表和一个详细信息表中。

Main表:

1001|JOE STILTON| 2 MAIN ST, SALEM,PA| OK|4/15/2014

Detail表:

1001|PHARMACY
1001|COMMERCIAL

即乔在药店工作,这也是一个商业建筑。

现在,我打电话给API。那我叫一个方法,

private static void insertTable(string keyid, DateTime updDate, string name, string address,string status)
{
     Int32 rowsAffected = 0;
     string connectionString = GetConnectionString();

     SqlConnection connection = new SqlConnection(connectionString);
     connection.Open();

     SqlCommand cmd = new SqlCommand("google.usp_InsertCompanyAddrComponents", connection);
     cmd.CommandType = CommandType.StoredProcedure;
     cmd.CommandTimeout = 90;
     cmd.Parameters.Add("@keyid", SqlDbType.VarChar);
     cmd.Parameters["@keyid"].Value = keyid;        
     cmd.Parameters.Add( new SqlParameter("@dateverified", updDate));
     cmd.Parameters.Add("@name", SqlDbType.VarChar);
     cmd.Parameters["@name"].Value = name;
     cmd.Parameters.Add("@address", SqlDbType.VarChar);
     cmd.Parameters["@address"].Value = address;
     cmd.Parameters.Add( new SqlParameter("@status", status));

     try
     {
         rowsAffected = cmd.ExecuteNonQuery();
     }
     catch (Exception ep)
     {
         Console.WriteLine(ep.Message);
     }

     connection.Close();
}

然后,我调用另一个插入详细信息表的类似方法。

由于我必须一次为10,000条记录执行此操作,因此有很多I / O.如何更改批量插入?一次全部插入10000个?

由于 [R

1 个答案:

答案 0 :(得分:0)

您还可以查看SQL Server中的表类型。您可以在存储过程中传递两种表类型,并在那里直接执行所需的操作。

这是我的样本存储过程

CREATE PROCEDURE [dbo].[usp_AssociateTags]  
@Tags AS UDT_Tag READONLY  
AS  
SET XACT_ABORT ON  
BEGIN TRAN  
   --Insert into Tag Master  
   INSERT INTO dbo.TagMaster  
     (   
     Name  
     ,IsActive  
     )  
   VALUES  ( '', -- Name - varchar(50)  
       1  -- IsActive - bit  
     )  

   DECLARE @TagId AS INT  
   SET @TagId=SCOPE_IDENTITY()  

   INSERT INTO dbo.TagCollection  
           ( TagNumber, TagId )  
   SELECT TagNumber, @TagId  FROM @Tags t  
   WHERE NOT EXISTS(SELECT * FROM dbo.TagCollection WHERE TagNumber = t.TagNumber)  
COMMIT TRAN  
SET XACT_ABORT OFF  

测试此存储过程的脚本

--DECLARE @hello as UDT_Tag  
--INSERT INTO @hello VALUES('vaibhav')  
--INSERT INTO @hello VALUES('Shantanu')  
--INSERT INTO @hello VALUES('Sam')  
--INSERT INTO @hello VALUES('Aakash')  
--EXEC usp_AssociateTags @hello  

--SELECT * FROM dbo.TagCollection  

使用此程序的C#代码

SqlParameter Tags = new SqlParameter { ParameterName = "@Tags"
                  , Value = entity.Tags.ToDataTable() 
                  , Direction = ParameterDirection.Input
                  , SqlDbType = SqlDbType.Structured, TypeName="UDT_Tag" };

SqlHelper.ExecuteNonQuery(tran, CommandType.StoredProcedure
               , "usp_AssociateTags", Tags);

CodeProject