C# 如何将数组/列表中的多行数据插入SQL Server(数据集、数据表)
在将数据从变量、数组、列表传输到SQL Server时,我不需要什么帮助 我在SQL方面还不错,但我不熟悉DataSet、DataTable对象 我的数据现在存储在字符串列表(list)中。该列表中的每个字符串都类似于以下内容: QWERTY,19920604,0.91,0.35,0.34,0.35343840 像这样的行大约有90万行,但大型导入只会发生一次 SQL Server中的目标数据类型:C# 如何将数组/列表中的多行数据插入SQL Server(数据集、数据表),c#,sql-server,visual-studio-2008,.net-3.5,dataset,C#,Sql Server,Visual Studio 2008,.net 3.5,Dataset,在将数据从变量、数组、列表传输到SQL Server时,我不需要什么帮助 我在SQL方面还不错,但我不熟悉DataSet、DataTable对象 我的数据现在存储在字符串列表(list)中。该列表中的每个字符串都类似于以下内容: QWERTY,19920604,0.91,0.35,0.34,0.35343840 像这样的行大约有90万行,但大型导入只会发生一次 SQL Server中的目标数据类型: BIGINT (primary key, im not inserting it, its id
BIGINT (primary key, im not inserting it, its identity(1,1))
VARCHAR(10),
DATE,
DECIMAL(10,2),
DECIMAL(10,2),
DECIMAL(10,2),
DECIMAL(10,2),
INT
但我终于学会了更现代的方法,通过使用DataTable对象。您可以使用sqlbulkcopy,下面是一些示例:
您可以使用sqlbulkcopy,以下是一些示例:
使用ADO.NET,最简单、最安全的方法可能是使用循环:
private void InsertList(IEnumerable<String> list)
{
String sql = "INSERT INTO dbo.Table VALUES(@varcharCol,@dateCol,@decCol1,@decCol2,@decCol3,@decCol4,@intCol);";
using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
con.Open();
foreach (String str in list)
{
String[] fields = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (fields.Length == 7)
{
DateTime dateCol;
if (DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out dateCol))
{
decimal d1, d2, d3, d4;
int i1;
if(decimal.TryParse(fields[2], out d1)
&& decimal.TryParse(fields[3], out d2)
&& decimal.TryParse(fields[4], out d3)
&& decimal.TryParse(fields[5], out d4)
&& int.TryParse(fields[6], out i1))
{
using(var cmd = new SqlCommand(sql, con))
{
cmd.Parameters.AddWithValue("@varcharCol", fields[0]);
cmd.Parameters.AddWithValue("@dateCol", dateCol);
cmd.Parameters.AddWithValue("@decCol1", d1);
cmd.Parameters.AddWithValue("@decCol2", d2);
cmd.Parameters.AddWithValue("@decCol3", d3);
cmd.Parameters.AddWithValue("@decCol4", d4);
cmd.Parameters.AddWithValue("@intCol", i1);
int inserted = cmd.ExecuteNonQuery(); // should be 1
}
}
}
}
}
}
}
private void InsertList(IEnumerable list)
{
String sql=“插入dbo.Table值(@varcharCol、@dateCol、@decCol1、@decCol2、@decCol3、@decCol4、@intCol);”;
使用(var con=newsqlconnection(Properties.Settings.Default.ConnectionString))
{
con.Open();
foreach(列表中的字符串str)
{
String[]fields=str.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries);
如果(fields.Length==7)
{
DateTime dateCol;
if(DateTime.TryParseExact(字段[1],“yyyyymmdd”,null,System.Globalization.DateTimeStyles.None,out-dateCol))
{
小数点d1、d2、d3、d4;
int i1;
if(十进制三分位(字段[2],输出d1)
&&decimal.TryParse(字段[3],输出d2)
&&decimal.TryParse(字段[4],输出d3)
&&decimal.TryParse(字段[5],输出d4)
&&int.TryParse(字段[6],输出i1))
{
使用(var cmd=newsqlcommand(sql,con))
{
cmd.Parameters.AddWithValue(“@varcharCol”,字段[0]);
cmd.Parameters.AddWithValue(“@dateCol”,dateCol);
cmd.Parameters.AddWithValue(“@decCol1”,d1);
cmd.Parameters.AddWithValue(“@decCol2”,d2);
cmd.Parameters.AddWithValue(“@decCol3”,d3);
cmd.Parameters.AddWithValue(“@decCol4”,d4);
cmd.Parameters.AddWithValue(“@intCol”,i1);
int inserted=cmd.ExecuteNonQuery();//应为1
}
}
}
}
}
}
}
您应该添加日志记录(解析问题)和异常处理(连接问题)
这种方法还可以轻松添加进度条。因此,您可以使用通过更新Progressbar
的
下面是一个教程:使用ADO.NET,最简单、最安全的方法可能是使用循环:
private void InsertList(IEnumerable<String> list)
{
String sql = "INSERT INTO dbo.Table VALUES(@varcharCol,@dateCol,@decCol1,@decCol2,@decCol3,@decCol4,@intCol);";
using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
con.Open();
foreach (String str in list)
{
String[] fields = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (fields.Length == 7)
{
DateTime dateCol;
if (DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out dateCol))
{
decimal d1, d2, d3, d4;
int i1;
if(decimal.TryParse(fields[2], out d1)
&& decimal.TryParse(fields[3], out d2)
&& decimal.TryParse(fields[4], out d3)
&& decimal.TryParse(fields[5], out d4)
&& int.TryParse(fields[6], out i1))
{
using(var cmd = new SqlCommand(sql, con))
{
cmd.Parameters.AddWithValue("@varcharCol", fields[0]);
cmd.Parameters.AddWithValue("@dateCol", dateCol);
cmd.Parameters.AddWithValue("@decCol1", d1);
cmd.Parameters.AddWithValue("@decCol2", d2);
cmd.Parameters.AddWithValue("@decCol3", d3);
cmd.Parameters.AddWithValue("@decCol4", d4);
cmd.Parameters.AddWithValue("@intCol", i1);
int inserted = cmd.ExecuteNonQuery(); // should be 1
}
}
}
}
}
}
}
private void InsertList(IEnumerable list)
{
String sql=“插入dbo.Table值(@varcharCol、@dateCol、@decCol1、@decCol2、@decCol3、@decCol4、@intCol);”;
使用(var con=newsqlconnection(Properties.Settings.Default.ConnectionString))
{
con.Open();
foreach(列表中的字符串str)
{
String[]fields=str.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries);
如果(fields.Length==7)
{
DateTime dateCol;
if(DateTime.TryParseExact(字段[1],“yyyyymmdd”,null,System.Globalization.DateTimeStyles.None,out-dateCol))
{
小数点d1、d2、d3、d4;
int i1;
if(十进制三分位(字段[2],输出d1)
&&decimal.TryParse(字段[3],输出d2)
&&decimal.TryParse(字段[4],输出d3)
&&decimal.TryParse(字段[5],输出d4)
&&int.TryParse(字段[6],输出i1))
{
使用(var cmd=newsqlcommand(sql,con))
{
cmd.Parameters.AddWithValue(“@varcharCol”,字段[0]);
cmd.Parameters.AddWithValue(“@dateCol”,dateCol);
cmd.Parameters.AddWithValue(“@decCol1”,d1);
cmd.Parameters.AddWithValue(“@decCol2”,d2);
cmd.Parameters.AddWithValue(“@decCol3”,d3);
cmd.Parameters.AddWithValue(“@decCol4”,d4);
cmd.Parameters.AddWithValue(“@intCol”,i1);
int inserted=cmd.ExecuteNonQuery();//应为1
}
}
}
}
}
}
}
您应该添加日志记录(解析问题)和异常处理(连接问题)
这种方法还可以轻松添加进度条。因此,您可以使用通过更新Progressbar
的
这里有一个教程:我刚刚开始转向实体框架,它大大降低了我的代码复杂性。为此,我通过以下步骤使用实体框架添加了一个新的数据源:
var entity=newdatabaseentity()代码>
整个
foreach (string currentrow in buffer) // List<string> buffer - contains csv data
{
// table name is Import
dataset.ImportRow row = dataset.Import.NewImportRow();
string[] fields = new string[7];
// Field names
// <Nm>,<Date>,<Open>,<High>,<Low>,<Close>,<Vol>
fields = currentrow.Split(',');
// ticker
row.Nm = fields[0];
DateTime data;
DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out data);
row.Date = data;
decimal open;
Decimal.TryParse(fields[2], out open);
row.Open = open;
decimal high;
Decimal.TryParse(fields[3], out high);
row.High = high;
decimal low;
Decimal.TryParse(fields[4], out low);
row.Low = low;
decimal close;
Decimal.TryParse(fields[5], out close);
row.Close = close;
int vol;
Int32.TryParse(fields[6], out vol);
row.Vol = vol;
dataset.Import.AddImportRow(row);
}
importTableAdapter.Update(dataset);
MessageBox.Show("Done");