转自:http://blog.youkuaiyun.com/z775480954/article/details/6724992
表A:
------------------
InfoID FName FContext
1 name1 c1
1 name2 c2
1 name3 c3
2 name1 c4
3 name4 c5
------------------
转换成
表B:
---------------------
InfoID name1 name2 name3 name4
1 c1 c2 c3 null
2 c4 null null null
3 null null null c5
---------------------
先在数据库中创建表A
通过asp.net来访问数据库
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Data.SqlClient;
- using System.Data;
- using System.Configuration;
- namespace JavaScript
- {
- public partial class DD : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- //获取FName集合,去掉重复
- DataTable dtFName = GetData("select DISTINCT FName from A", "FName");
- DataTable dtTable = new DataTable();
- //dtTable 添加列名
- dtTable.Columns.Add("InfoID ",typeof(int));
- for (int i = 0; i < dtFName.Rows.Count; i++)
- {
- dtTable.Columns.Add(dtFName.Rows[i][0].ToString(), typeof(string));
- }
- //获取表A的数据
- DataTable dtA=GetData("select * from A","A");
- //获取InfoID集合
- DataTable dtInfoID = GetData("select DISTINCT InfoID from A", "InfoID");
- int count=dtInfoID.Rows.Count;
- //创建表结构
- for (int i = 0; i < count; i++)
- {
- DataRow row = dtTable.NewRow();
- object[] obj = new object[dtInfoID.Rows.Count];
- obj[0] = dtInfoID.Rows[i][0];
- row.ItemArray = obj;
- dtTable.Rows.Add(row);
- }
- //循环给表填充值
- for (int i = 0; i < dtA.Rows.Count; i++)
- {
- DataRow drA = dtA.Rows[i];
- for (int j = 0; j < dtTable.Rows.Count; j++)
- {
- DataRow row=dtTable.Rows[j];
- //对应列名填充
- if (Convert.ToInt32(row[0]) == Convert.ToInt32(drA[1]))
- {
- row[drA[2].ToString()] = drA[3];
- }
- else
- {
- row[drA[2].ToString()] = "null";
- }
- }
- }
- GridView1.DataSource = dtTable;
- GridView1.DataBind();
- }
- //数据库访问,获取数据
- protected DataTable GetData(string sql,string tbName)
- {
- string connStr = ConfigurationManager.ConnectionStrings["FileManageConnectionString"].ConnectionString;
- SqlConnection conn = new SqlConnection(connStr);
- SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
- DataSet ds = new DataSet();
- sda.Fill(ds, tbName);
- DataTable dt = ds.Tables[tbName];
- return dt;
- }
- }
- }
转自:http://www.cnblogs.com/chiname/articles/143167.html
DataSet,DataTable.DataRow复制方法——解决:此行已属于另一个表
经常遇到这种错误,“此行已属于另一个表”的错误。
导致这个错误的语句如下:
dtPriceTable.Rows.InsertAt(aDataRow,i);
或者
dtPriceTable.Rows.Add(aDataRow);
我分析了一下原因,因为DataRow DataTable 都是传引用调用的。所以一个行在一个表中了,就不能再增加到另外一个表。
具体的改善策略有两种:
1、 把原始DataRow的每列依次赋值。如下:
DataRow tempRow = dtItemPrice.NewRow();
tempRow ["First"] = aDataRow ["First "]
tempRow ["second"] = aDataRow ["second "]
tempRow ["third"] = aDataRow ["third "]
tempRow ["forth"] = aDataRow ["forth "]
tempRow ["Fifth"] = aDataRow ["Fifth "]
……
dtPriceTable.Rows.Add(tempRow)
2、 有个同事提醒我为什么不循环DataTable的每个列呢?我想是哦,为什么不呢!
呵呵,这样子,不管Table有多少列,只需要3句话就搞定了
DataRow aDataRow = dtItemPrice.NewRow();
foreach(DataColumn aDataColumn in dtItemPrice.Columns)
{
aDataRow[aDataColumn.ColumnName] = drItemPrices[i][aDataColumn.ColumnName];
}
InsertConditionType(aDataRow,dtItemPrice);
测试就可以了。
后来看了看DataSet 和 DataTable 都有一个方法:Copy(),复制该 System.Data.DataTable 的结构和数据。
那么结合这个函数,无论是DataSet 和 DataTable还是DataRow 都有复制的方法了。
Feedback
# re: DataSet,DataTable.DataRow复制方法——解决:此行已属于另一个表
2004-07-08 12:31 by zhaixd如下面所示:
DataRow aDataRow = dtItemPrice.NewRow();
aDataRow.ItemArray = drItemPrices[i].ItemArray;
dtItemPrice.Rows.Add(aDataRow);
# re: DataSet,DataTable.DataRow复制方法——解决:此行已属于另一个表
2004-07-08 13:47 by Knight