2020년 7월 4일 토요일

WPF - DB, Xml

동영상 자료 보고 정리한 것에 불과하고,
나중에 더 추가시켜 나갈 생각.


1. Sql Server

1. 세팅

서버 다운받고 대충 테이블 만들어 놓음.

여기서 마우스 왼쪽버튼 누르면 나오는 Add Connection 을 눌러서 대충 아래처럼 함.
 


 
그럼 Tables 에 추가된 table 이 있을 거임.



DataSet 을 만들어서



드래그를 함.



그럼 이렇게 자동으로 자료형이 만들어져 있을거임.


1
2
3
4
<ObjectDataProvider  x:Key="custList"
      ObjectType="{x:Type tableAdapter:t_custTableAdapter}" 
      MethodName="GetData" 
      IsAsynchronous="True" >
cs

위를 통해 데이터를 로드하도록 하고.
ObjectDataProvider 는 여기서 설명함.


2. 접근
private ICollectionView GetList()
{
    DataSourceProvider prov = (DataSourceProvider)FindResource("custList");
    return CollectionViewSource.GetDefaultView(prov.Data);
}
ICollectionView 는 다음처럼 찾아옴.


Debug.WriteLine(((DataRowView)lstCust.SelectedItem)["name"].ToString());
데이터 접근은 DataRowView 로 형변환뒤 Attribute를 Index 로 사용해서 접근

DataSourceProvider provider = (DataSourceProvider)this.FindResource("custList");
ds_wpf.t_custDataTable tb = provider.Data as ds_wpf.t_custDataTable;
 
DataRow row = tb.NewRow();
row["age"= 11;
row["name"= "김수빈";
row["id"= "sadf";
 
tb.Rows.Add(row);
추가

((DataRowView)((Button)sender).DataContext).Delete();
제거

((DataRowView)view.CurrentItem).BeginEdit();
((DataRowView)view.CurrentItem)["age"= "12";
((DataRowView)view.CurrentItem).EndEdit();
수정


CustomSort, Filter 는 적용이 안됨.




2. Xml


보통은 위처럼 바로 DB 랑 연결하지 않고, Xml 등을 이용하는 레이어를 거쳐서 연결함.

1. XmlDataProvider
<?xml version="1.0" encoding="utf-8" ?>
<CustList xmlns="http://test01.co.kr">
	<Cust name="홍길동" age="18" id="aa"/>
	<Cust name="김유신" age="60" id="ba"/>
	<Cust name="이순신" age="32" id="ac"/>
	<Cust name="감강찬" age="18" id="da"/>
</CustList>
Xml 은 간략하게 하면 대략 저런 형식임.

<XmlDataProvider x:Key="custList2" Source="CustList.xml" XPath="/sb:CustList/sb:Cust">
            <XmlDataProvider.XmlNamespaceManager>
                <XmlNamespaceMappingCollection>
                    <XmlNamespaceMapping Uri="http://test01.co.kr" Prefix="sb"/>
                </XmlNamespaceMappingCollection>
            </XmlDataProvider.XmlNamespaceManager>
        </XmlDataProvider>
XmlData 를 사용하면 바로 Xml 과 연결 가능함.

NameSpace 를 Url 을 이용해 Prefix로 만듬.
이렇게 만든걸 이용해서 XPath 으로 불러올 데이터를 지정함.


<XmlDataProvider x:Key="custList" Source="CustList.xml" XPath="/sb:CustList/sb:Cust">
            <XmlDataProvider.XmlNamespaceManager>
                <XmlNamespaceMappingCollection>
                    <XmlNamespaceMapping Uri="http://test01.co.kr" Prefix="sb"/>
                </XmlNamespaceMappingCollection>
            </XmlDataProvider.XmlNamespaceManager>
            <x:XData>
                <CustList xmlns="http://test01.co.kr">
                    <Cust name="홍길동" age="18" id="aa"/>
                    <Cust name="김유신" age="60" id="ba"/>
                    <Cust name="이순신" age="32" id="ac"/>
                    <Cust name="감강찬" age="18" id="da"/>
                </CustList>
            </x:XData>
        </XmlDataProvider>
x:XData 로 저렇게 해도 된다는데, 직접적인 접근을 어케하는지 모르겠음.


private void LoadCustListXml()
{
    XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
    ns.AddNamespace("sb""http://test01.co.kr");
    Binding.SetXmlNamespaceManager(grdMain, ns);
 
    doc = new XmlDocument();
    doc.Load("CustList.xml");
 
    Binding b = new Binding();
    b.XPath = "/sb:CustList/sb:Cust";
    b.Source = doc;
 
    grdMain.SetBinding(Grid.DataContextProperty,  b);
}
코드로도 똑같이 할 수 있음.


2. 접근

private void btnAdd_Click(object senderRoutedEventArgs e)
{
    XmlElement c = doc.CreateElement("Cust""http://test01.co.kr");
    c.SetAttribute("name""을지문덕");
    c.SetAttribute("age""99");
    doc.DocumentElement.AppendChild(c);
}
추가

ICollectionView view = CollectionViewSource.GetDefaultView(grdMain.DataContext);
XmlElement c = (XmlElement)view.CurrentItem;
c.SetAttribute("age""12");
수정
















댓글 없음:

댓글 쓰기

List