PDA

View Full Version : سوال: یکی کردن چند جدول داخل یک DataSet



forodo
پنج شنبه 31 اردیبهشت 1394, 13:29 عصر
سلام
من چطوری می تونم چند تا جدول که داخل داخل یک دیتاست هست رو یکی کنم و کلاً بدمش به دیتاگریدویو؟
objDataAdapter.Fill(objDataSet, "ali");
objDataAdapter.Fill(objDataSet, "reza");
objDataAdapter.Fill(objDataSet, "mohammad");
با تشکر

forodo
جمعه 01 خرداد 1394, 09:48 صبح
من 3تا سرچ مختلف دارم که از قبل نوشته شده و وقت اینکه بخوام اینارو یکی کنم رو ندارم و خیلی هم پیچیده و شلوغ هستند.

forodo
جمعه 01 خرداد 1394, 23:40 عصر
کد این که 3تا جدول داخل یک دیتاست رو یکی کنه رو کسی تا حالا باهاش کار نکرده؟

khokhan
شنبه 02 خرداد 1394, 01:32 صبح
کد این که 3تا جدول داخل یک دیتاست رو یکی کنه رو کسی تا حالا باهاش کار نکرده؟
سوالتون ناقصه ممکنه چندین حالت متصور باشه :متفکر:
اگه این سه جدول هیچ نوع وجه اشتراکی نداشته باشند (حتی کلید خارجی) می تونین از طریق تلفیق (Merge) اونا رو به همدیگه وصل کنین اما به نظر بی معنی میاد :لبخند:
اینطوری :

private void button1_Click(object sender, EventArgs e)
{

SqlConnection connection;
SqlCommand command;
SqlDataAdapter adapter = new SqlDataAdapter();
DataSet ds = new DataSet();
DataTable dt;
string firstSql = null;
string secondSql = null;
string ThirdSql = null;
firstSql = "Select * From Customer";
secondSql = "Select * From Goods";
ThirdSql = "Select * From units";
connection = new SqlConnection(connect);
try
{
connection.Open();
command = new SqlCommand(firstSql, connection);
adapter.SelectCommand = command;
adapter.Fill(ds, "Table(0)");
adapter.SelectCommand.CommandText = secondSql;
adapter.Fill(ds, "Table(1)");
adapter.SelectCommand.CommandText = ThirdSql;
adapter.Fill(ds, "Table(2)");
adapter.Dispose();
command.Dispose();
connection.Close();

ds.Tables[0].Merge(ds.Tables[1]);
ds.Tables[0].Merge(ds.Tables[2]);
dt = ds.Tables[0];

dataGridView4.DataSource = dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

اما اگه سه جدول به نوعی وجه اشتراک داشته باشند می تونین از این کلاس استفاده کنین


public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn)
{
if (!tables.Any())
throw new ArgumentException("Tables must not be empty", "tables");
if (primaryKeyColumn != null)
foreach (DataTable t in tables)
if (!t.Columns.Contains(primaryKeyColumn))
throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn");

if (tables.Count == 1)
return tables[0];

DataTable table = new DataTable("TblUnion");
table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data
foreach (DataTable t in tables)
{
table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add);
}
table.EndLoadData();

if (primaryKeyColumn != null)
{
// since we might have no real primary keys defined, the rows now might have repeating fields
// so now we're going to "join" these rows ...
var pkGroups = table.AsEnumerable()
.GroupBy(r => r[primaryKeyColumn]);
var dupGroups = pkGroups.Where(g => g.Count() > 1);
foreach (var grpDup in dupGroups)
{
// use first row and modify it
DataRow firstRow = grpDup.First();
foreach (DataColumn c in table.Columns)
{
if (firstRow.IsNull(c))
{
DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c));
if (firstNotNullRow != null)
firstRow[c] = firstNotNullRow[c];
}
}
// remove all but first row
var rowsToRemove = grpDup.Skip(1);
foreach (DataRow rowToRemove in rowsToRemove)
table.Rows.Remove(rowToRemove);
}
}

return table;
}
نحوه فراخوانی و استفاده هم اینطوریه :

var tables = new[] { ds.Tables[0], ds.Tables[1], ds.Tables[2] };
DataTable TblUnion =Class1.MergeAll(tables,"id");
dataGridView4.DataSource = TblUnion;

forodo
شنبه 02 خرداد 1394, 08:31 صبح
در اصل به جای اینکه طرف SQL بخوام UNION ALL بزنم که 3 جدول بشن 1 جدول چون به دلایلی نمی تونم این کار رو با کوئری انجام بدم می خوام طرف ویژوال این 3تا جدول رو با کد سی شارپی یکی کنم.
حالا اون merge رو تست می کنم.
ds.Tables[0].Merge(ds.Tables[1]); ds.Tables[0].Merge(ds.Tables[2]);
dt = ds.Tables[0];


از شواهد و قرائن پیداست که باید جواب بده.