C# Continuous For Each循环不会停止插入SQL Server
我有一个for-each循环,它不会停止插入sql server 这是我的密码:C# Continuous For Each循环不会停止插入SQL Server,c#,sql-server,C#,Sql Server,我有一个for-each循环,它不会停止插入sql server 这是我的密码: using System; using System.Threading; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Google.Apis.Analytics.v3; using Google.Apis.Analytics.v3.Data;
using System;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Services;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using System.Data.SqlClient;
using System.Configuration;
namespace GooAnalyzer
{
class Program
{
static void RunSecondSite()
{
var serviceAccountEmail = "543652534806-7lk19u13619g9pthghqger31sth9jpr4@developer.gserviceaccount.com";
var certificate = new X509Certificate2(@"C:\Key\key.p12", "notasecret", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { AnalyticsService.Scope.Analytics }
}.FromCertificate(certificate));
// Create the service.
//Twistandtango
var gas = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "GooAnalyzer",
});
var r = gas.Data.Ga.Get("ga:1860066", "2014-12-27", "2015-01-10", "ga:totalValue");
//Specify some addition query parameters
r.Dimensions = "ga:source,ga:medium,ga:campaign,ga:transactionId,ga:date";
r.MaxResults = 100000000;
//Execute and fetch the results of our query
Google.Apis.Analytics.v3.Data.GaData d = r.Execute();
foreach (var h in d.ColumnHeaders)
{
SqlConnection sqlCon = new SqlConnection("Data Source=UNDERGOD-PC\\SQLEXPRESS;Initial Catalog=GooAnalyzer;Integrated Security=True");
sqlCon.Open();
foreach (var row in d.Rows)
{
using (SqlCommand sqlCmd1 = new SqlCommand { CommandText = "INSERT INTO [GooData] ([Website], [gasource], [gamedium], [gacampaign], [gatransactionid], [gadate], [gatotalvalue], [Timeinserted]) VALUES (@Website, @gasource, @gamedium, @gacampaign, @gatransactionid, @gadate, @gatotalvalue, @Timeinserted)", Connection = sqlCon })
{
sqlCmd1.Parameters.AddWithValue("@Website", "4wheelparts.com");
sqlCmd1.Parameters.AddWithValue("@gasource", row[0]);
sqlCmd1.Parameters.AddWithValue("@gamedium", row[1]);
sqlCmd1.Parameters.AddWithValue("@gacampaign", row[2]);
sqlCmd1.Parameters.AddWithValue("@gatransactionid", row[3]);
sqlCmd1.Parameters.AddWithValue("@gadate", row[4]);
sqlCmd1.Parameters.AddWithValue("@gatotalvalue", row[5]);
sqlCmd1.Parameters.AddWithValue("@Timeinserted", DateTime.Now.ToString("MM-dd-yyyy"));
sqlCmd1.ExecuteNonQuery();
}
}
sqlCon.Close();
}
}
static void Main(string[] args)
{
var serviceAccountEmail = "543652534806-7lk19u13619g9pthghqger31sth9jpr4@developer.gserviceaccount.com";
var certificate = new X509Certificate2(@"C:\Key\key.p12", "notasecret", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { AnalyticsService.Scope.Analytics }
}.FromCertificate(certificate));
// Create the service.
//Twistandtango
var gas = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "GooAnalyzer",
});
var r = gas.Data.Ga.Get("ga:1381000", "2014-12-27", "2015-01-10", "ga:totalValue");
//Specify some addition query parameters
r.Dimensions = "ga:source,ga:medium,ga:campaign,ga:transactionId,ga:date";
r.MaxResults = 100000000;
//Execute and fetch the results of our query
Google.Apis.Analytics.v3.Data.GaData d = r.Execute();
Console.WriteLine("Starting...");
foreach (var h in d.ColumnHeaders)
{
SqlConnection sqlCon = new SqlConnection("Data Source=UNDERGOD-PC\\SQLEXPRESS;Initial Catalog=GooAnalyzer;Integrated Security=True");
sqlCon.Open();
foreach (var row in d.Rows)
{
using (SqlCommand sqlCmd1 = new SqlCommand { CommandText = "INSERT INTO [GooData] ([Website], [gasource], [gamedium], [gacampaign], [gatransactionid], [gadate], [gatotalvalue], [Timeinserted]) VALUES (@Website, @gasource, @gamedium, @gacampaign, @gatransactionid, @gadate, @gatotalvalue, @Timeinserted)", Connection = sqlCon })
{
sqlCmd1.Parameters.AddWithValue("@Website", "4wd.com");
sqlCmd1.Parameters.AddWithValue("@gasource", row[0]);
sqlCmd1.Parameters.AddWithValue("@gamedium", row[1]);
sqlCmd1.Parameters.AddWithValue("@gacampaign", row[2]);
sqlCmd1.Parameters.AddWithValue("@gatransactionid", row[3]);
sqlCmd1.Parameters.AddWithValue("@gadate", row[4]);
sqlCmd1.Parameters.AddWithValue("@gatotalvalue", row[5]);
sqlCmd1.Parameters.AddWithValue("@Timeinserted", DateTime.Now.ToString("MM-dd-yyyy"));
sqlCmd1.ExecuteNonQuery();
}
}
sqlCon.Close();
RunSecondSite();
}
}
}
}
当我运行以下命令时,代码将继续循环:
RunSecondSite()
它将继续插入,我不知道如何停止它或在哪里放置正确的中断
我想稍后在控制台应用程序中调用更多的方法,并对每个循环使用相同的方法
请告知。我认为您只需更换
foreach (var h in d.ColumnHeaders)
{
SqlConnection sqlCon = ...
sqlCon.Open();
... // snip
sqlCon.Close();
}
与:
当前,您正在为每个列标题分别、相同地插入所有行,当前的逻辑是,每次迭代列标题时,都要将每一行添加到数据库中,从而插入相同的行 从您的代码中,似乎从未使用过“h” 只需删除:
foreach (var h in d.ColumnHeaders)
{
...
}
成为:
SqlConnection sqlCon = new SqlConnection("Data Source=UNDERGOD-PC\\SQLEXPRESS;Initial Catalog=GooAnalyzer;Integrated Security=True");
sqlCon.Open();
foreach (var row in d.Rows)
{
using (SqlCommand sqlCmd1 = new SqlCommand { CommandText = "INSERT INTO [GooData] ([Website], [gasource], [gamedium], [gacampaign], [gatransactionid], [gadate], [gatotalvalue], [Timeinserted]) VALUES (@Website, @gasource, @gamedium, @gacampaign, @gatransactionid, @gadate, @gatotalvalue, @Timeinserted)", Connection = sqlCon })
{
sqlCmd1.Parameters.AddWithValue("@Website", "4wheelparts.com");
sqlCmd1.Parameters.AddWithValue("@gasource", row[0]);
sqlCmd1.Parameters.AddWithValue("@gamedium", row[1]);
sqlCmd1.Parameters.AddWithValue("@gacampaign", row[2]);
sqlCmd1.Parameters.AddWithValue("@gatransactionid", row[3]);
sqlCmd1.Parameters.AddWithValue("@gadate", row[4]);
sqlCmd1.Parameters.AddWithValue("@gatotalvalue", row[5]);
sqlCmd1.Parameters.AddWithValue("@Timeinserted", DateTime.Now.ToString("MM-dd-yyyy"));
sqlCmd1.ExecuteNonQuery();
}
}
sqlCon.Close();
嗯,对,;它为每个列标题执行所有行;如果您有200行和10列标题,它将执行2000次插入;这是你期望的吗?我该怎么解决?它正在插入重复的数据。每次迭代同一个表的列标题时,您都在“d”中插入所有行。请减少只发布到与问题相关的代码的代码量,而不是全部转储。@Jerry出于好奇,有多少行?如果它是一个重要的数字,那么这个场景非常适合
SqlBulkCopy
,这将非常重要faster@JerryBust是的,就是这样;在我编辑的示例中,我还在sqlCon
用法中添加了using
,但是删除外部foreach
是关键的更改。
SqlConnection sqlCon = new SqlConnection("Data Source=UNDERGOD-PC\\SQLEXPRESS;Initial Catalog=GooAnalyzer;Integrated Security=True");
sqlCon.Open();
foreach (var row in d.Rows)
{
using (SqlCommand sqlCmd1 = new SqlCommand { CommandText = "INSERT INTO [GooData] ([Website], [gasource], [gamedium], [gacampaign], [gatransactionid], [gadate], [gatotalvalue], [Timeinserted]) VALUES (@Website, @gasource, @gamedium, @gacampaign, @gatransactionid, @gadate, @gatotalvalue, @Timeinserted)", Connection = sqlCon })
{
sqlCmd1.Parameters.AddWithValue("@Website", "4wheelparts.com");
sqlCmd1.Parameters.AddWithValue("@gasource", row[0]);
sqlCmd1.Parameters.AddWithValue("@gamedium", row[1]);
sqlCmd1.Parameters.AddWithValue("@gacampaign", row[2]);
sqlCmd1.Parameters.AddWithValue("@gatransactionid", row[3]);
sqlCmd1.Parameters.AddWithValue("@gadate", row[4]);
sqlCmd1.Parameters.AddWithValue("@gatotalvalue", row[5]);
sqlCmd1.Parameters.AddWithValue("@Timeinserted", DateTime.Now.ToString("MM-dd-yyyy"));
sqlCmd1.ExecuteNonQuery();
}
}
sqlCon.Close();