ADO.NET 2's DataTable.Merge

  OK, so its not ground breaking, earth shattering nor will it solve world hunger ... but I am pretty stoked over the addition of the Merge method to the DataTable object in ADO.NET 2. It has always been an annoyance of mine that when I want to merge a DataTable into another one that I have to have a DataSet to perform the operation. What if I don't have nor want a DataSet? Well, in ADO.NET 1.x you have to create a DataSet anyway. I know its just an extra line of code or 2, but its the point of creating an object that really serves no purpose in my context that bothers me. OK, so this is not a huge issue by itself but again I feel like it strays from sound development practices. If the DataSet is already there ... fine.

In the following code sample I set up 2 DataTable objects manually and then merge them. Unfortunately, I have to create a DataSet to perform the merge.

ADO.NET 1.1 - DataSet.Mergeprivate void Button1_Click( object sender, System.EventArgs e)
{
    // Set up a DataTable
    DataTable oDt= new DataTable("Colors");
    oDt.Columns.Add("ColorID", System.Type.GetType("System.Int32"));
    oDt.Columns.Add("ColorName", System.Type.GetType("System.String"));
    oDt.PrimaryKey = new DataColumn[]{oDt.Columns["ColorID"]};
    oDt.Rows.Add(new object[]{1,"Red"});
    oDt.Rows.Add(new object[]{2,"Teal"});
    oDt.Rows.Add(new object[]{3,"Yellow"});
    oDt.AcceptChanges();

    // Set up a another DataTable that I will use to Merge
    DataTable oDtMoreColors= new DataTable("Colors");
    oDtMoreColors.Columns.Add("ColorID", System.Type.GetType("System.Int32"));
    oDtMoreColors.Columns.Add("ColorName", System.Type.GetType("System.String"));
    oDtMoreColors.PrimaryKey = new DataColumn[]{oDtMoreColors.Columns["ColorID"]};
    oDtMoreColors.Rows.Add(new object[]{1,"Red"});
    oDtMoreColors.Rows.Add(new object[]{2,"Blue"});
    oDtMoreColors.Rows.Add(new object[]{4,"Green"});
    oDtMoreColors.AcceptChanges();

    // Create a DataSet so I can merge the DataTable objects
    DataSet oDs = new DataSet("WhyOhWhy");
    oDs.Tables.Add(oDt);
    oDs.Merge(oDtMoreColors);
}


In ADO.NET 2 I can skip creating the DataSet and instead use the following line of code.

ADO.NET 2 - DataTable.Merge    oDt.Merge(oDtMoreColors);


While some topics like MARS are grabbing more of the press in ADO.NET 2, tweaks like the DataTable Merge method are flying under the radar. After all, I use these types of features all the time so if we can make it work better, then I am all for it.

Share this post: Email it! | bookmark it! | digg it! | reddit!

 

 

출처 : http://codebetter.com/


Posted by 뭉치냐옹
:
아래와 같이 그리드를 임의로 구성해 주었습니다.

 

        protected System.Web.UI.WebControls.DataGrid DataGrid1;

    

        private void Page_Load(object sender, System.EventArgs e)

        {

            DataSet ds = new DataSet();

            string[] strs;

 

            ds.Tables.Add("NewDT");

 

            ds.Tables["NewDT"].Columns.Add("f1");

            ds.Tables["NewDT"].Columns.Add("f2");

            ds.Tables["NewDT"].Columns.Add("f3");

 

            strs = new string[] {"1", "1", ""};

            for(int i=0; i<10; i++)

                ds.Tables["NewDT"].Rows.Add(strs);

            DataGrid1.DataSource = ds;

            DataGrid1.DataBind();

 

        }

 

 

아래와 같이 그리드를 설정해 주었습니다.

 

            <asp:datagrid id="DataGrid1" runat="server" PagerStyle-Visible="true" CssClass="green" ShowHeader="false"

                AutoGenerateColumns="False" BorderWidth="0" CellSpacing="0" CellPadding="0" GridLines="Horizontal">

                <Columns>

                    <asp:TemplateColumn HeaderText="No" HeaderStyle-CssClass="body2_8" HeaderStyle-BackColor="#3cadd3" HeaderStyle-Height="34"

                        ItemStyle-Width="30" ItemStyle-HorizontalAlign="Center" ItemStyle-Height="24">

                        <ItemTemplate>

                            <asp:TextBox id="TextBox1" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.f1") %>' onchange="Compute(this, 1, 2)"></asp:TextBox>

                        </ItemTemplate>

                    </asp:TemplateColumn>

                    <asp:TemplateColumn HeaderText="구분" HeaderStyle-CssClass="body2_8" HeaderStyle-BackColor="#3cadd3" ItemStyle-Width="30">

                        <ItemTemplate>

                            <asp:TextBox id="Textbox2" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.f2") %>' onchange="Compute(this, -1, 1)"></asp:TextBox>

                        </ItemTemplate>

                    </asp:TemplateColumn>

                    <asp:TemplateColumn HeaderText="모델명" HeaderStyle-CssClass="body2_8" HeaderStyle-BackColor="#3cadd3"

                        ItemStyle-Width="100">

                        <ItemTemplate>

                            <asp:TextBox id="Textbox3" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.f3") %>'></asp:TextBox>

                        </ItemTemplate>

                    </asp:TemplateColumn>

                </Columns>

            </asp:datagrid>

 

 

아래와 같이 자바스크립트 함수를 구현했습니다.

 

        <script language="javascript">

        function Compute(TextBox, POS, result){

            var TextBoxs = document.getElementsByTagName('INPUT');

            

            for(i=0;i<TextBoxs.length;i++){

                if(TextBoxs[i] == TextBox)

                    TextBoxs[i+result].value = parseInt(TextBox.value) + parseInt(TextBoxs[i+POS].value)

            }

        }

        </script>

 

 

getElementsByTagName은 6.0이후에 지원되는 함수라는 말이 있습니다. 제가 6.0을 사용하고 있기 때문에 확인해 본바는 아니구요.

 

처음 답변에 있던 URL의 게시판에 보시면 6.0이전에서 사용되는 함수를 올려 놓은 것이 있을겁니다. 검색에서 name에 'miniaron'으로 검색하시면 나옵니다.

 

 

프로젝트 실제 코드를 함께 올려드리니 참고하십시요.

 

성공하시면 답변 주시고요.

 

성공을 기원합니다.

 

등대지기 황상범

 

 

에구구...사내 보안관련해서 화일이 업로드 되지 않는 관계로 URL을 적습니다.

http://www.lottokeno.co.kr/Proj_01.zip

 

 

 

데이터그리드편집속성에서 특정컬럼에 TemplateColumn을 추가한후 그안에 textBox를 추가했을경우 Page_Load 이벤트내의 코드를 해주지 않으면 컴파일후 DataGrid에 빈 DataTable이 바인딩된 상태가 되지 않는다.. 이유는 모름..연구중..


Posted by 뭉치냐옹
:
public void GetMyRecords() {
   // ...
   // create myDataSet and myDataAdapter
   // ...
   myDataAdapter.Fill(myDataSet,9,15,"Categories");
}


 

DataSetDataTable 이름을 사용하여 지정된 범위에서 데이터 소스의 행과 일치하도록 DataSet의 행을 추가하거나 새로 고칩니다.

public int Fill(
   DataSet dataSet,
   int startRecord,
   int maxRecords,
   string srcTable
);

매개 변수

dataSet
레코드와 스키마(필요한 경우)로 채울 DataSet입니다.
startRecord
0부터 시작되는 시작 레코드 번호입니다.
maxRecords
검색할 수 있는 최대 레코드 수입니다.
srcTable
테이블 매핑에 사용할 원본 테이블의 이름입니다.

반환 값

DataSet에서 성공적으로 추가했거나 새로 고친 행의 수입니다. 이것은 행을 반환하지 않는 문의 영향을 받는 행을 포함하지 않습니다.


Posted by 뭉치냐옹
:

계속 데브피아에서 도움만 받기에 그동안의 고마운 마음을 담아,

허접한 자료이지만 데브피아에서 얻은 자료와 개인적으로 알아낸 방법들을 모아서 MDB사용하는데 어려움을 느끼시는 분들을 위해 올립니다.

 

흑흨~ 이거 알아 내는데 너무도 많은 시간이 결렸습니당~

 

처음엔 데이터를 엑셀로 옮겨서 사용했었는데, 옮기는 시간이.. 장난이 아니더군요, DAO를 사용하면 엄청난 속도 향상을 느끼실 수 있을 겁니다.

다량의 데이터를 사용하실 때는 MDB로 옮겨서 엑셀로 보내는 것이 정신건강상 유리할듯 ㅎ~

 

먼저 DAO를 이용했기 때문에 DAO를 참조하고, 나중에 압축할 것이기 때문에 JDO도 참조하셔야 합니다.

그리고 임시파일을 제거할 때 IO를 사용하기 때문에, DAO가 소문자로 참조되었기 때문에 개인적으로 불편해서 넣은 코드인

 

using System.IO;

using DAO = dao;

 

를 넣어줘야 합니다.

 

 

아래 부터 코드입니다. 현재 작업중인 관계로 원본 코드 그대로 올리니, 이해바랍니당~ ㅋㅋ~

 

                string mdbName = "분석자료";

                

                string 원본mdb = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\" + mdbName + ".mdb";

                string 임시mdb = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\" + "tmpdb" + ".mdb";

 

                DAO.DBEngineClass db = new DAO.DBEngineClass();

                DAO.Workspace dbw = db.Workspaces[0];

                DAO.Database db1;

 

            

                //MDB 생성

                dbw.CreateDatabase(임시mdb, DAO.LanguageConstants.dbLangKorean, DAO.DatabaseTypeEnum.dbVersion40);

 

                //MDB 열기

                db1 = dbw.OpenDatabase

(임시mdb, DAO.DatabaseTypeEnum.dbVersion40, (object)false, DAO.LanguageConstants.dbLangKorean);

 

                //테이블 생성

                DAO.TableDef dt = db1.CreateTableDef("T인력분석",Type.Missing,Type.Missing,Type.Missing);

                DAO.Field df = dt.CreateField("ID_인력분석",DAO.DataTypeEnum.dbLong,4);

                df.Attributes = 17; //중요! 해당 필드를 일련번호로 만듬

 

                dt.Fields.Append(df);

 

                for(int i=0; objds자봉자료.T인력분석.Columns.Count -1 >= i; i++)

                {

                    if((objds자봉자료.T인력분석.Columns[i].ColumnName.ToString() != "") && (objds자봉자료.T인력분석.Columns[i].ColumnName != "ID_인력분석"))

                    {

                        string 필드이름 = objds자봉자료.T인력분석.Columns[i].ColumnName.ToString();

                        DAO.Field df1 = dt.CreateField(필드이름,DAO.DataTypeEnum.dbText,50);

                        df1.AllowZeroLength = true;

                        df1.Required = false;

                        dt.Fields.Append(df1);

                    }

                                                                                                                            

                }

 

                db1.TableDefs.Append(dt);

 

                //인덱스 생성

                DAO.Index di = dt.CreateIndex("ID");

                di.Fields = "ID_인력분석";

                di.Primary = true;

                

                db1.TableDefs["T인력분석"].Indexes.Append(di);

 

                dao.Recordset rs =

                db1.TableDefs["T인력분석"].OpenRecordset(dao.RecordsetTypeEnum.dbOpenDynaset,dao.RecordsetOptionEnum.dbDenyWrite);

 

 

                for(int ii = 0; objds자봉자료.T인력분석.Count-1 >= ii; ii++)

                {

                    rs.AddNew();

 

                    for(int i=0; objds자봉자료.T인력분석.Columns.Count -1 >= i; i++)

                    {

                        if(objds자봉자료.T인력분석.Columns[i].ColumnName != "ID_인력분석")

                        {

                            rs.Fields[i].Value = objds자봉자료.T인력분석[ii][i].ToString();

 

                        }

                                                                                                                            

                    }

 

                    rs.Update(1,false);  //이거 알아내느라 또 몇시간 보냄 위에서 오픈할때의 타입과 연관있음.

                }

 

                

                //사용했던것 모두 닫습니다. 안닫으면 압축할때  에러납니다.

                rs.Close();

                db1.Close();

                dbw.Close();

                

                rs = null;

                db1 = null;

                dbw = null;

                db = null;

 

 

 

                //MDB 압축하기 강좌에 있는 TIP 그대로 배꼈습니다.

                JRO.JetEngineClass jro = new JRO.JetEngineClass();

                jro.CompactDatabase("Provider=Microsoft.jet.OLEDB.4.0;Data Source=" + 임시mdb,"Provider=Microsoft.jet.OLEDB.4.0;Data Source=" + 원본mdb);

 

 

                //임시 파일이 남아있으면 나중에 다시 압축할 때 에러납니다. (지금까지 작업했던 임시mdb가 임시파일임)

                FileInfo ff = new FileInfo(임시mdb);

                ff.Delete();

 

 

                MessageBox.Show("완료되었습니다.");

 

이상입니다.

허접한 코드이지만 용기내서 올려봅니다.


Posted by 뭉치냐옹
: