C# SQL批量复制到单独的表中
我想在不同的表中执行insert到数据库中。我文件中的每个记录都分配有表标识符,表标识符将用作键。现在我所做的是使其成为一种通用方法,我又创建了一个file.txt,在其中我用表名指定了所有标识符。并将其存储到字符串字典中,字符串 因此,我的字典中有如下示例: 表标识符,表名称 表标识符,表名称 然后,我创建了另一个string-as-key字典(注意:我使用了前面的字典值作为这个字典的键)和string-as-value列表来获取表名的列名 所以,不,我的字典里有如下示例数据: 表名,列名IEnumerable 表名,列名IEnumerable 那么, datafile.txt包含以管道分隔的数据,我将它们拆分并保存到KVP字符串列表和字符串列表中。正如我前面提到的,我的数据文件中有表标识符。因此,我将它们用作KVP中的键,并将分割的值存储到字符串列表中 所以,不,我在我的KVP字符串列表中有如下示例数据,字符串列表: 表标识符,IEnumerable值 表标识符,IEnumerable值 现在做了一半的工作,我陷入了最后一期: 现在,我将所有的标识符、表名、列名和值放入字典和列表中。唯一要做的就是匹配和合并记录并转储它 对于匹配:我想将KVPC# SQL批量复制到单独的表中,c#,generics,sqlbulkcopy,C#,Generics,Sqlbulkcopy,我想在不同的表中执行insert到数据库中。我文件中的每个记录都分配有表标识符,表标识符将用作键。现在我所做的是使其成为一种通用方法,我又创建了一个file.txt,在其中我用表名指定了所有标识符。并将其存储到字符串字典中,字符串 因此,我的字典中有如下示例: 表标识符,表名称 表标识符,表名称 然后,我创建了另一个string-as-key字典(注意:我使用了前面的字典值作为这个字典的键)和string-as-value列表来获取表名的列名 所以,不,我的字典里有如下示例数据: 表名,列名IE
s键的列表与dictionary
s键进行匹配,然后使用这些值作为键来获取列名
预期场景图像:
列表[[列表<列名>],[字符串值列表]]
我的代码:
DataTable dt = null;
SqlConnection cn = null;
SqlDataReader dataReader = null;
SqlBulkCopy bulkInsert = null;
StreamReader reader = null;
string path = string.Empty;
public void test()
{
string TableIdentiferFilepath = HttpContext.Current.Server.MapPath("/testfile/TableIdentifer.txt");
Dictionary<string, string> TableIdentifer_TableName = null;
Dictionary<string, List<string>> Table_Name_ColumnName = null;
using (reader = new StreamReader(TableIdentiferFilepath))
{
TableIdentifer_TableName = new Dictionary<string, string>();
Table_Name_ColumnName = new Dictionary<string, List<string>>();
while (!reader.EndOfStream)
{
string[] curr = reader.ReadLine().Split(new string[] { ",", "\r\n" }, StringSplitOptions.None);
TableIdentifer_TableName.Add(curr[0], curr[1]);
using (cn = new SqlConnection(ConString.Connection.conn))
{
cn.Open();
if (cn.State == ConnectionState.Open)
{
string query = string.Format("select column_name from information_schema.columns where table_name = '{0}' order by ordinal_position", curr[1].ToString());
using (SqlCommand cmd = new SqlCommand(query))
{
using (SqlDataAdapter da = new SqlDataAdapter(query, cn))
{
using (dt = new DataTable())
{
da.Fill(dt);
List<string> dataColumns = dt.AsEnumerable().Select(r => r.Field<string>("column_name")).ToList();
Table_Name_ColumnName.Add(curr[1], dataColumns);
}
}
}
}
}
}
}
string path = HttpContext.Current.Server.MapPath("/TextFile/DataSample.txt");
List<KeyValuePair<string, List<string>>> KVPValues = new List<KeyValuePair<string, List<string>>>();
using (reader = new StreamReader(path))
{
while (!reader.EndOfStream)
{
string[] arr = reader.ReadLine().Split(new string[] { "|", "\r\n" }, StringSplitOptions.None);
var collValues = new List<string>();
KVPValues.Add(new KeyValuePair<string, List<string>>(arr[0], arr.Skip(1).AsEnumerable().ToList()));
foreach (var item in TableIdentifer_TableName)
{
foreach (var item2 in Table_Name_ColumnName.Where(c => c.Key == item.Value))
{
var curr_val = item2.Value;
var currKey = KVPValues.Where(p => p.Key == item.Key).ToList();
}
}
}
}
}
DataTable dt=null;
SqlConnection cn=null;
SqlDataReader=null;
SqlBulkCopy bulkInsert=null;
StreamReader=null;
字符串路径=string.Empty;
公开无效测试()
{
字符串TableIdentiferFilepath=HttpContext.Current.Server.MapPath(“/testfile/TableIdentifer.txt”);
Dictionary TableIdentifer_TableName=null;
字典表\u Name\u ColumnName=null;
使用(读卡器=新的StreamReader(TableIdentiferFilepath))
{
TableIdentifer_TableName=新字典();
表_Name_ColumnName=新字典();
而(!reader.EndOfStream)
{
字符串[]curr=reader.ReadLine().Split(新字符串[]{“,”,“\r\n”},StringSplitOptions.None);
TableIdentifer_TableName.Add(curr[0],curr[1]);
使用(cn=newsqlconnection(consting.Connection.conn))
{
cn.Open();
if(cn.State==ConnectionState.Open)
{
string query=string.Format(“从信息_schema.columns中选择列_name,其中表_name='{0}'按顺序_位置排序”,curr[1].ToString());
使用(SqlCommand cmd=newsqlcommand(query))
{
使用(SqlDataAdapter da=newsqldataadapter(查询,cn))
{
使用(dt=newdatatable())
{
da.填充(dt);
List dataColumns=dt.AsEnumerable().选择(r=>r.Field(“column_name”)).ToList();
表\u Name\u ColumnName.Add(curr[1],dataColumns);
}
}
}
}
}
}
}
string path=HttpContext.Current.Server.MapPath(“/TextFile/DataSample.txt”);
List KVPValues=新列表();
使用(读卡器=新的StreamReader(路径))
{
而(!reader.EndOfStream)
{
字符串[]arr=reader.ReadLine().Split(新字符串[]{“|”,“\r\n”},StringSplitOptions.None);
var collValues=新列表();
添加(新的KeyValuePair(arr[0],arr.Skip(1).AsEnumerable().ToList());
foreach(TableIdentifer_TableName中的变量项)
{
foreach(表_Name_ColumnName.Where(c=>c.Key==item.Value)中的var item2)
{
var curr_val=项目2.值;
var currKey=KVPValues.Where(p=>p.Key==item.Key).ToList();
}
}
}
}
}
这是一幅大图!希望现在人们能理解我想要实现的目标。这是不是很难理解或无法帮助:D??不,你问的问题不清楚,这个问题太冗长了,很难看出这是一个对SO来说有效的问题,还是应该转移到代码审查中。为了简化这一点,我想我不需要在这里解释这个故事,我只需要解释一下我需要的。@PanagiotisKanavos善意地核实一下它比以前好还是坏?老实说,我想问你想解决什么问题(大问题)。也许你的解决方案太复杂了,因为你试图用错误的方式解决它。。。