Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将10000条记录从C插入SQL Server_C#_Sql Server - Fatal编程技术网

C# 将10000条记录从C插入SQL Server

C# 将10000条记录从C插入SQL Server,c#,sql-server,C#,Sql Server,我有一个C控制台程序 从输入表Keyid varchar4、地址varchar100、名称varchar100中选择10000条记录 对于输入表中的每条记录,它调用一个API,如果某人在该地址工作,则返回数据,状态为OK或NOT OK,还返回需要保存在一个主表和一个详细表中的地址类型兴趣地点或住宅、商业等 主表: 明细表: i、 乔在一家药房工作,这也是一座商业大厦 现在,我调用API。然后我调用一个方法 private static void insertTable(string keyid,

我有一个C控制台程序

从输入表Keyid varchar4、地址varchar100、名称varchar100中选择10000条记录

对于输入表中的每条记录,它调用一个API,如果某人在该地址工作,则返回数据,状态为OK或NOT OK,还返回需要保存在一个主表和一个详细表中的地址类型兴趣地点或住宅、商业等

主表:

明细表:

i、 乔在一家药房工作,这也是一座商业大厦

现在,我调用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();
}
然后,我调用另一个类似的方法,将其插入到细节表中

由于我必须一次对10000条记录执行此操作,因此存在大量I/O。如何更改为执行批插入?每次插入10000个

谢谢
R

您还可以查看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  
用于测试此存储过程的脚本

使用此过程的C代码


比如?你考虑过@MarcGravel吗?我不知道如何将我上面的程序转换成SQLBulkcopy。我是否应该将每个API调用结果存储到列表中,然后再存储到sqlbulkcopy??
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();
}
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  
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);