Tom-Net

导航

websivers3

using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;


using System.IO;
using System.IO.Compression;
using System.Data.SqlClient;
using System.Runtime.Serialization.Formatters.Binary;

namespace AsynWebService
{
    /// <summary>
    /// Service1 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class AsynWebService : System.Web.Services.WebService
    {
        [WebMethod(Description = "复制表数据表数据库表")]
        public string CopyDataTable(string Pub_CnnD, string DestTableName, byte[] ZipByte)
        {
            byte[] buffer = UnZipClass.Decompress(ZipByte);
            BinaryFormatter ser = new BinaryFormatter();
            DataSetSurrogate dss;
            dss = (DataSetSurrogate)ser.Deserialize(new MemoryStream(buffer));
            DataSet DS = dss.ConvertToDataSet();
            int RowNum;
            RowNum = DS.Tables[0].Rows.Count;
            bool Result = DataTableFillToDb(Pub_CnnD, DestTableName, DS.Tables[0]);
            DS.Clear();
            DS.Reset();
            GC.Collect();
            if (Result == true)
            {
                return "复制表:" + DestTableName + " 的数据到远程数据成功!记录数为:" + RowNum.ToString();
            }
            else
            {
                return "复制表:" + DestTableName + " 的数据到远程数据失败!";
            }
        }

        /// <summary>
        /// 表存在的DataTable填充
        /// </summary>
        /// <param name="Pub_CnnD">数据库联结串</param>
        /// <param name="DestTableName">目标表名</param>
        /// <param name="SouseDataTable">源DataTable</param>
        /// <returns></returns>
        private bool DataTableFillToDb(string Pub_CnnD, string DestTableName, DataTable SouseDataTable)
        {
            try
            {
                if (SouseDataTable.Rows.Count > 0)
                {
                    SqlConnection SqlCnn = new SqlConnection(Pub_CnnD);
                    SqlCnn.Open();
                    DataTable NewTable = OrdinalTable(Pub_CnnD, SouseDataTable, SouseDataTable.TableName);
                    SqlBulkCopy Bcp = new SqlBulkCopy(SqlCnn);
                    Bcp.DestinationTableName = DestTableName;
                    Bcp.WriteToServer(NewTable);
                    Bcp.Close();
                    SqlCnn.Close();
                }
                SouseDataTable.Reset();
                SouseDataTable.Dispose();
                return true;
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// 调整表字段顺序
        /// </summary>
        /// <param name="SqlConnstring">数据库联结串</param>
        /// <param name="DTS">源DataTable</param>
        /// <param name="TableName">表名</param>
        /// <returns></returns>
        private DataTable OrdinalTable(string SqlConnstring, DataTable DTS, string TableName)
        {
            try
            {
                System.Data.SqlClient.SqlConnection SqldbCnn = new System.Data.SqlClient.SqlConnection(SqlConnstring);
                DataTable DTD = new DataTable();
                System.Data.SqlClient.SqlDataAdapter SqlDbDA = new System.Data.SqlClient.SqlDataAdapter("select top 1 * from " + TableName, SqldbCnn);
                SqldbCnn.Open();
                SqlDbDA.Fill(DTD);
                SqlDbDA.Dispose();
                SqldbCnn.Close();
                DTD.Clear();
                int I = 0;
                int J = 0;
                string CNS = "";
                string CND = "";
                int MaxCol = 0;
                for (I = 0; I <= DTS.Columns.Count - 1; I++)
                {
                    CNS = DTS.Columns[I].ColumnName;
                    for (J = 0; J <= DTD.Columns.Count - 1; J++)
                    {
                        CND = DTD.Columns[J].ColumnName;
                        if (CND.ToUpper() == CNS.ToUpper())
                        {
                            if (MaxCol < J)
                            {
                                MaxCol = J;
                                break;
                            }
                        }
                    }
                }
                for (J = 0; J <= MaxCol; J++)
                {
                    if (DTS.Columns.IndexOf(DTD.Columns[J].ColumnName) < 0)
                    {
                        DTS.Columns.Add(DTD.Columns[J].ColumnName.ToUpper(), DTD.Columns[J].DataType);
                    }
                }

                for (I = 0; I <= DTD.Columns.Count - 1; I++)
                {
                    CND = DTD.Columns[I].ColumnName;
                    for (J = 0; J <= DTS.Columns.Count - 1; J++)
                    {
                        CNS = DTS.Columns[J].ColumnName;
                        if (CNS.ToUpper() == CND.ToUpper())
                        {
                            DTS.Columns[J].SetOrdinal(I);
                            break;
                        }
                    }
                }
                return DTS;
            }
            catch
            {
                return DTS;
            }
        }

    }
}

posted on 2008-10-12 22:55  Tom_Net  阅读(190)  评论(0)    收藏  举报