Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > .NET Framework > Forum > select ข้อมูลจากเซิฟเวอตัวที่ 1 insert หรือ upade ให้server ตัวที่ 2 database ชื่อเดี่ยวกัน



 

select ข้อมูลจากเซิฟเวอตัวที่ 1 insert หรือ upade ให้server ตัวที่ 2 database ชื่อเดี่ยวกัน

 



Topic : 059579



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์




ระบบนี้ต้องเป็น windows application(โปรแกรม) ซึ่งเป็น .net(c#)

ระบบนี้จะทำงานขึ้นบนเซิฟเวอ ทุกๆวัน ในเวลาตี 3

เพื่อใช้ถ่ายโอนข้อมูลจากเซิฟเวอตัวที่ 1 select ข้อมูล และ เปิด connection กับเซิฟเวอ อีก1 ตัวที่อยู่ที่อื่น หลังจากนั้นก็ insert ข้อมูล ที่ได้จากการ select ในเซิฟเวอตัวที่ 1
เงื่อนไขมีอยู่ว่า
1 ถ้าระหว่างการทำงาน หากเกิดข้อผิดพลาดจะต้อง rollback ข้อมูล
2 ถ้า insert ข้อมูล ลงเซิฟเวอตัวที่ 2 เสร็จสมบูรณ์ จะต้อง ลบ ข้อมูลจากเซิฟตัวที่ 1




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";
                     
        public frmConnMulti()
        {
            InitializeComponent();
        }

        private void frmConnMulti_Load(object sender, EventArgs e)
        {    
            try
            {
                //Open connection 

                //*************************//
                //select data  form database 1
                String strQuery = "SELECT * FROM Table_A";
                //*************************//    


                //*************************//
                //Open connection Database 2
                //*************************//


                //*************************//
                //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;
            }  
           
        }
    }
}





Tag : .NET, Web (ASP.NET), Win (Windows App), Console App, C#, VS 2005 (.NET 2.x)









ประวัติการแก้ไข
2011-05-03 15:25:33
2011-05-04 12:51:14
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2011-05-03 13:10:22 By : chon2008 View : 1392 Reply : 19
 

 

No. 1



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


มีคนแนะนำให้ใช้ DataSource แต่ก็ไม่รู้จะใช้อย่างไร งง ครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-03 14:38:22 By : chon2008
 


 

No. 2



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


หลังจากพยายามใช้ 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
 

 

No. 3



โพสกระทู้ ( 1,348 )
บทความ ( 1 )



สถานะออฟไลน์


หลักการ
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
 


 

No. 4



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


2. เปลี่ยน RowState ทุก Rows ของ DataTable ในข้อ 1 เป็น DataRowState.Added -> DataTable1.Rows(n).RowState = DataRowState.Added


เปลี่ยนแบบนี้หรือป่าวครับ แต่มันติด error ครับ


RowState
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-03 16:37:04 By : chon2008
 


 

No. 5



โพสกระทู้ ( 1,348 )
บทความ ( 1 )



สถานะออฟไลน์


http://msdn.microsoft.com/en-US/library/system.data.datarow.setadded(v=VS.80).aspx

ขออภัย จำผิด
เปลียน RowState ต้องเขียนแบบนี้

Code (VB.NET)
For Each dr as DataRow in dt.Rows
  dr.SetAdded()
Next

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-03 17:54:07 By : watcharop
 


 

No. 6



โพสกระทู้ ( 1,348 )
บทความ ( 1 )



สถานะออฟไลน์


ข้อมูลเยอะไหม
ประมาณกี่ record
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-03 17:58:51 By : watcharop
 


 

No. 7

Guest


ขอติงนิสนุงค่ะ การเปิด connection ค้างไว้สอง server เพื่อจะรับส่งข้อมูลกันตรงๆ
นอกจากจะสุ่มเสี่ยงให้เกิดความเสียหายและไม่ปลอดภัยยังค่อนข้างมีข้อจำกัดในทางปฏิบัติค่ะ ( เช่น firewall )
ควรจะแปลงข้อมูลที่ต้องการลงเป็น format อื่นเช่น sql plain text แล้วส่งผ่านไป
จะด้วย network stream หรือจะ xml ไปก้อได้ แล้วค่อยอ่านเข้าไปทั้งกะบิที่ปลายทาง
จากนั้น submit ทั้ง process น่าจะปลอดภัยมากกว่าไหมคะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-03 21:17:58 By : สาวเอ๋อ
 


 

No. 8



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณครับ


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
 


 

No. 9



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 6 เขียนโดย : watcharop เมื่อวันที่ 2011-05-03 17:58:51
รายละเอียดของการตอบ ::
... ข้อมูลมีประมาณวันละ 100 record ......
บางวันอาจะเยอะ บางวันอาจจะน้อยมาก

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-04 10:35:26 By : chon2008
 


 

No. 10

Guest


ตอบความคิดเห็นที่ : 7 เขียนโดย : สาวเอ๋อ เมื่อวันที่ 2011-05-03 21:17:58
รายละเอียดของการตอบ ::
ผมเห็นด้วยกับคุณสาวเอ๋อนะครับ และอีกอย่้าง ข้อมูล 100 กว่า Rows ทำเป็น Text file คงขนาดไม่ใหญ่
เพราะทีทำงานผมก็ใช้วิธีนี้ในการโอนถ่ายข้อมูลให้กับ Database ตัวอื่นๆ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-04 11:59:15 By : คนผ่านทาง
 


 

No. 11



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 10 เขียนโดย : คนผ่านทาง เมื่อวันที่ 2011-05-04 11:59:15
รายละเอียดของการตอบ ::
... @คนผ่านทาง
ช่วยแนะนำด้วยได้ไหมครับ เพราะผมไม่รู้เรื่อง อาศัยหาจากเว็บอย่างเดียว ถ้าจะเอาจากเว็บมาเดาๆ ก็นานมากครับ คงจะเดาไม่เก่งด้วย สุดท้ายคงรู้ งานช้า และโดนด่า ถ้าจะอนุเคราะห์ จะขอบพระคุณมาก


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-04 12:15:23 By : chon2008
 


 

No. 12



โพสกระทู้ ( 1,348 )
บทความ ( 1 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 8 เขียนโดย : chon2008 เมื่อวันที่ 2011-05-04 10:22:27
รายละเอียดของการตอบ ::
ฟังก์ชั่น GetData อย่างที่ทำ ก็น่าจะใช้ได้แล้ว
เหลือแต่ สร้าง DataAdapter2 เพื่อ Update เข้าฐานข้อมูลตัวที่ 2

ลองศึกษาเรื่อง SqlCommandBuilder มันจะเกี่ยวเนื่องกับ DataAdapter2
http://msdn.microsoft.com/en-US/library/system.data.sqlclient.sqlcommandbuilder(v=VS.80).aspx

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-04 13:14:29 By : watcharop
 


 

No. 13



โพสกระทู้ ( 1,348 )
บทความ ( 1 )



สถานะออฟไลน์


มันจะออกมาแนวๆ นี้
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
 


 

No. 14

Guest


หลักการที่ผมว่าไป ก็คือ

- ทำการ 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 : คนผ่านทาง
 


 

No. 15



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 12 เขียนโดย : watcharop เมื่อวันที่ 2011-05-04 13:14:29
รายละเอียดของการตอบ ::
ถามว่าค่าที่ return datatable ชื่อ dt1 ออกไป ถูกต้องไหมครับ

และใช้
Code (C#)
dtable = GetData(...)

' เขียนโค้ดเพื่อสร้าง DataAdapter2 (ถ้าเขียนเป็น ไม่น่าเกิน 10 บรรทัด)


objAdapter = new SqlDataAdapter(strSQL, objConn);
objAdapter.Update("?????ใส่ข้อมูลอะไร????????");

' เรียก DataAdapter2.Update เพื่อเอาข้อมูลจาก dtable ไปเพิ่มในฐานข้อมูล 2
DataAdapter2.Update(dtable)




ประมาณนี้หรือป่าวครับ ถ้าผิดพลาดตรงไหนก็ขอโทษด้วยนะครับ

ตอนนี้เจ้านายคงคิดว่ามันช้าและเสียเวลามากไป ก็เลยบอกว่าไม่ต้องให้ผมทำแล้ว (สิ่งที่ผมคิดไว้ก็ไม่ผิดจริง เสียเวลา เสียงาน เฮ้อ เซ็งครับ บอกตรงๆ )




ประวัติการแก้ไข
2011-05-04 13:51:42
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-04 13:49:42 By : chon2008
 


 

No. 16



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


แง้ว ไม่มีใครมาตอบเลย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-06 11:17:59 By : chon2008
 


 

No. 17

Guest


อ้าวก้อเห็นบอกว่าไม่ต้องทำแล้วนี่คะ ยังต้องทำต่อหรอ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-06 13:45:20 By : สาวเอ๋อ
 


 

No. 18



โพสกระทู้ ( 1,348 )
บทความ ( 1 )



สถานะออฟไลน์


นั่นดิ ก็นึกว่าไม่ต้องทำต่อแล้ว
ส่วนโค้ดที่ใช้ในการสร้าง 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
 


 

No. 19



โพสกระทู้ ( 160 )
บทความ ( 0 )



สถานะออฟไลน์


ครับต้องขอโทษด้วยครับ

แต่ก็ต้องขอบพระคุณมากครับ ผมรู้สึกดีนะครับที่คุณ สาวเอ๋อ และคุณwatcharop เข้ามาตอบและใหความรู้
แต่ว่างานมันก็เร่งๆ ผมเองก็ช้า เอาไว้ผมจะหาเวลามาลองนั่งทำครับ แต่ตอนนี้ก็เอาตัวอื่นขึ้นมาทำก่อน
ขอบพระคุณมากนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-05-06 14:49:17 By : chon2008
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : select ข้อมูลจากเซิฟเวอตัวที่ 1 insert หรือ upade ให้server ตัวที่ 2 database ชื่อเดี่ยวกัน
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 01
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่