select ข้อมูลจากเซิฟเวอตัวที่ 1 insert หรือ upade ให้server ตัวที่ 2 database ชื่อเดี่ยวกัน
มีคนแนะนำให้ใช้ DataSource แต่ก็ไม่รู้จะใช้อย่างไร งง ครับ
Date :
2011-05-03 14:38:22
By :
chon2008
หลังจากพยายามใช้ DataSource ก็มาได้พอเท่านี้ ไม่รู้ว่าถูกทางไหม
Code (C#)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WinAppConnMultiDB
{
public partial class frmConnMulti : Form
{
String strConnDataBase1 = "Data Source=NB; Initial Catalog=DataBase1; User Id=sa; Password=nc4400";
String strConnDataBase2 = "Data Source=NB; Initial Catalog=DataBase2; User Id=sa; Password=nc4400";
SqlConnection objConn;
SqlCommand objComm;
SqlDataAdapter da;
//DataSet ds;
DataTable dt;
//SqlDataReader rd;
private BindingSource bindingSource1 = new BindingSource();
public frmConnMulti()
{
InitializeComponent();
}
private void frmConnMulti_Load(object sender, EventArgs e)
{
try
{
//*************************//
//select data form database 1
bindingSource1.DataSource = GetData("SELECT * FROM Table_A");
//*************************//
//*************************//
//Open connection Database 2
objConn = new SqlConnection(strConnDataBase2);
//*************************//
objConn.Open();
//จะเอาที่ได้ จาก(bindingSource1.DataSource = GetData("SELECT * FROM Table_A");) ไปยัดใส่ connection อีกตัว มันได้อย่างไร
//*************************//
//Put the data to server 2
//*************************//
//Well done :TRansaction.Commit
//Close connection 1
//Close connection 2
}
catch (Exception ex)
{
//Transaction Rollback;
MessageBox.Show("Error:"+ex);
return;
}
}
private object GetData(string p_strSQLComm)
{
objConn = new SqlConnection(strConnDataBase1);
if (objConn.State == ConnectionState.Open)
{
objConn.Close();
}
objConn.Open();
objComm= new SqlCommand(p_strSQLComm, objConn);
da = new SqlDataAdapter();
da.SelectCommand = objComm;
dt = new DataTable();
dt.Locale = System.Globalization.CultureInfo.InvariantCulture;
da.Fill(dt);
return dt;
}
}
}
ประวัติการแก้ไข 2011-05-03 15:27:28
Date :
2011-05-03 15:24:27
By :
chon2008
หลักการ
1. ใช้ DataAdapter1 อ่านข้อมูลจาก Database1 มาใส่ใน DataTable1 -> DataAdapter1.Fill(DataTable1) (อย่างที่คุณทำไว้แล้ว)
2. เปลี่ยน RowState ทุก Rows ของ DataTable ในข้อ 1 เป็น DataRowState.Added -> DataTable1.Rows(n).RowState = DataRowState.Added
3. ใช้ DataAdapter2 เพื่อ Insert ข้อมูลไปที่ Database2 -> DataAdapter2.Update(DataTable1)
Date :
2011-05-03 15:52:11
By :
watcharop
2. เปลี่ยน RowState ทุก Rows ของ DataTable ในข้อ 1 เป็น DataRowState.Added -> DataTable1.Rows(n).RowState = DataRowState.Added
เปลี่ยนแบบนี้หรือป่าวครับ แต่มันติด error ครับ
Date :
2011-05-03 16:37:04
By :
chon2008
ข้อมูลเยอะไหม
ประมาณกี่ record
Date :
2011-05-03 17:58:51
By :
watcharop
ขอติงนิสนุงค่ะ การเปิด connection ค้างไว้สอง server เพื่อจะรับส่งข้อมูลกันตรงๆ
นอกจากจะสุ่มเสี่ยงให้เกิดความเสียหายและไม่ปลอดภัยยังค่อนข้างมีข้อจำกัดในทางปฏิบัติค่ะ ( เช่น firewall )
ควรจะแปลงข้อมูลที่ต้องการลงเป็น format อื่นเช่น sql plain text แล้วส่งผ่านไป
จะด้วย network stream หรือจะ xml ไปก้อได้ แล้วค่อยอ่านเข้าไปทั้งกะบิที่ปลายทาง
จากนั้น submit ทั้ง process น่าจะปลอดภัยมากกว่าไหมคะ
Date :
2011-05-03 21:17:58
By :
สาวเอ๋อ
ขอบคุณครับ
Code (C#)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WinAppConnMultiDB
{
public partial class frmConnMulti : Form
{
String strConnDataBase1 = "Data Source=NB; Initial Catalog=DataBase1; User Id=sa; Password=nc4400";
String strConnDataBase2 = "Data Source=NB; Initial Catalog=DataBase2; User Id=sa; Password=nc4400";
SqlConnection objConn;
SqlCommand objComm;
SqlDataAdapter da;
//DataSet ds;
DataTable dt1;
DataTable dt2;
//SqlDataReader rd;
DataRow dtr;
private BindingSource bindingSource1 = new BindingSource();
public frmConnMulti()
{
InitializeComponent();
}
private void frmConnMulti_Load(object sender, EventArgs e)
{
try
{
//*************************//
//select data form database 1
bindingSource1.DataSource = GetData("SELECT * FROM Table_A");
//*************************//
//*************************//
//Open connection Database 2
objConn = new SqlConnection(strConnDataBase2);
//*************************//
objConn.Open();
//จะเอาที่ได้ จาก(bindingSource1.DataSource = GetData("SELECT * FROM Table_A");) ไปยัดใส่ connection อีกตัว มันได้อย่างไร
//*************************//
//Put the data to server 2
//*************************//
//Well done :TRansaction.Commit
//Close connection 1
//Close connection 2
}
catch (Exception ex)
{
//Transaction Rollback;
MessageBox.Show("Error:"+ex);
return;
}
}
private object GetData(string p_strSQLComm)
{
objConn = new SqlConnection(strConnDataBase1);
if (objConn.State == ConnectionState.Open)
{
objConn.Close();
}
objConn.Open();
objComm = new SqlCommand(p_strSQLComm, objConn);
da = new SqlDataAdapter();
da.SelectCommand = objComm;
dt1 = new DataTable();
dt1.Locale = System.Globalization.CultureInfo.InvariantCulture;
da.Fill(dt1);
foreach (DataRow dtr in dt1.Rows)
{
return dtr.SetAdded();
}
return dt1;
}
}
}
// return ตัวไหนออกไปครับ
// return "dt1" หรือ "dtr.SetAdded()"
แก้ได้แล้วครับ ต่อไปจะเพิ่มลงใน database ของ server ตัวที่ 2 ได้อย่างไรครับ
ประวัติการแก้ไข 2011-05-04 10:28:38 2011-05-04 10:31:44
Date :
2011-05-04 10:22:27
By :
chon2008
มันจะออกมาแนวๆ นี้
Code (VB.NET)
dtable = GetData(...)
' เขียนโค้ดเพื่อสร้าง DataAdapter2 (ถ้าเขียนเป็น ไม่น่าเกิน 10 บรรทัด)
' ....
' เรียก DataAdapter2.Update เพื่อเอาข้อมูลจาก dtable ไปเพิ่มในฐานข้อมูล 2
DataAdapter2.Update(dtable)
ประวัติการแก้ไข 2011-05-04 13:19:55
Date :
2011-05-04 13:19:15
By :
watcharop
หลักการที่ผมว่าไป ก็คือ
- ทำการ Export ข้อมูล เป็น Text file (.txt,.csv etc) จาก Server 1
- โยน Text file ที่ได้ไปยัง Server 2
- อ่านข้อมูลจาก Text file ที่ได้ เพื่อ Insert/Update ลง Server 2
- ตรวจสอบความถูกต้องของข้อมูลที่ Insert/Update ลง Server 2 (ถ้าถูกต้องก็ Delete Text file / ถ้าไม่ถูกต้องก็ process ใหม่)
- Respond process การ Insert/Update กลับไปยัง Server 1 เพื่อทำการ Delete ข้อมูล
น่าจะประมานนี้นะครับ ลองดูเพื่อเป็น Guideline เพราะระบบแต่ละหน่วยงานย่อมมีการจัดการไม่เหมือนกัน
แต่ของผมจะเขียนโปรแกรมให้ทำงานอัตโนมัติ โดยตั้งเวลาให้กับมัน ทั้งฝั่ง Server 1 และ Server 2 ครับ
ฝั่ง Server 1 ---> Export ข้อมูล
ฝั่ง Server 2 ---> อ่านข้อมูลจาก Text file เพื่อ Insert/Update ลง Server 2
ขอให้โชคดีครับ...
Date :
2011-05-04 13:38:33
By :
คนผ่านทาง
แง้ว ไม่มีใครมาตอบเลย
Date :
2011-05-06 11:17:59
By :
chon2008
อ้าวก้อเห็นบอกว่าไม่ต้องทำแล้วนี่คะ ยังต้องทำต่อหรอ
Date :
2011-05-06 13:45:20
By :
สาวเอ๋อ
นั่นดิ ก็นึกว่าไม่ต้องทำต่อแล้ว
ส่วนโค้ดที่ใช้ในการสร้าง SqlDataAdapter ตัวที่ 2
ให้ลองศึกษาในเรื่อง SqlCommandBuilder ที่ Post ไว้ที่ #12
อันนี้เป็นตัวอย่างการใช้ OleDbCommandBuilding ช่วยสร้าง OleDbDataAdapter
เอาไว้เป็นแนวคิด (ฟังก์ขั่น SaveData Post#25)
https://www.thaicreate.com/dotnet/forum/058264.html#00193576
ประวัติการแก้ไข 2011-05-06 14:38:27 2011-05-06 14:39:34
Date :
2011-05-06 14:32:56
By :
watcharop
ครับต้องขอโทษด้วยครับ
แต่ก็ต้องขอบพระคุณมากครับ ผมรู้สึกดีนะครับที่คุณ สาวเอ๋อ และคุณwatcharop เข้ามาตอบและใหความรู้
แต่ว่างานมันก็เร่งๆ ผมเองก็ช้า เอาไว้ผมจะหาเวลามาลองนั่งทำครับ แต่ตอนนี้ก็เอาตัวอื่นขึ้นมาทำก่อน
ขอบพระคุณมากนะครับ
Date :
2011-05-06 14:49:17
By :
chon2008
Load balance : Server 01