GSI

FOR XML 사용방법#1

DB&XML 2007. 9. 14. 16:59 |

상세한 내용은 온라인에 있는 MSDN을 참고 바랍니다.
http://msdn2.microsoft.com/en-us/library/ms345137.aspx


select * from joyboard_notice for xml auto, type;
>> 결과
<joyboard_notice no="1" ... category="" />
<joyboard_notice no="2" ... category="" />


SELECT (SELECT * FROM joyboard_notice FOR XML AUTO, TYPE).query(
'<doc>{
   for $c in /joyboard_notice
   return
     <Person name="{data(
$c/@id)}"/>
 }</doc>')

>> 결과
<doc>
  <Person name="jaeukan" />
  <Person name="usarabia" />
</doc>
>> joyboard_notice : 테이블 이름
>> data($c/@id) : id는 컬럼명

SELECT ID as "@id",
  Nick
FROM joyboard_notice
FOR XML PATH('Customer'), ROOT('doc')

>> 결과
<doc>
  <Customer id="jaeukan">
    <Nick>Azitro</Nick>
  </Customer>
  <Customer id="usarabia">
    <Nick>사라비아</Nick>
  </Customer>
</doc>
Posted by gsi
:

내가 다니고 있는 회사..
내가 일하고 있는 회사..
나로 인해 움직이는 회사..
내가 하고 싶은 꿈을 이룰수 있는 회사..
그런 회사가 여기였음 좋겠네요 ^^.

화이팅!!

사용자 삽입 이미지

▒ iamgsi ▒

Posted by gsi
:

발췌...(inside C#_2E, 무료기술 서적)

FileStream은 바이너리 데이터를 읽거나 쓸 수 있다. 문자 데이터로 작업하려면 StreamReader와 StreamWrite와 같은 클래스가 더 적합하다. 이러한 클래스는 백그라운드에서 FileStream 객체를 사용하여 원본 바이트 처리 과정의 최상위 계층인 문자 삽입 계층에 효과적으로 작동할 것이다. StreamReader/StreamWriter를 닫는 것은 백그라운드에 깔려 있는 FileStream 또한 닫는다는 것을 의미한다.

FileStream s =
    new FileStream("Bar.txt", FileMode.Create);
StreamWriter w = new StreamWriter(s);
w.Write("Hello World");
w.Close();

s = new FileStream("Bar.txt", FileMode.Open);
StreamReader r = new StreamReader(s);
string t;
while ((t = r.ReadLine()) != null)
{
    Console.WriteLine(t);
}
w.Close()

결과 : Hello World

StreamReader 클래스와 StreamWriter 클래스는 Encoding을 사용하여 문자를 바이트로 혹은 그 반대로 변환할 수 있다. 몇몇 엔코딩을 이용하여 데이터를 파일에 기록하려면 다음과 같이 StreamWriter와 Encoding 파라미터를 추가한 StreamReader를 생성해야 한다.

//StreamWriter w = new StreamWriter(s);
StreamWriter w = new StreamWriter(s, System.Text.Encoding.BigEndianUnicode);

[참고]
읽기 전용으로 설정된 파일을 열려면 FileStream 생성자에 파일을 읽기만 하도록 지정하기 위해 몇가지의 파라미터를 더 추가할 수 있다.

s = new FileStream(
   "../../TextFile1.txt",
   FileMode.Open, FileAccess.Read);

[참고]
C#에서 파일 경로를 지정할 때 C#에서의 경로는 C나 C++와 동일하게 백슬래시(\)를 사용하기 때문에, 다음과 같은 3가지 방법 중 선택해서 사용할 수 있다.

s = new FileStream(
   "C:\\temp\\goo.txt", FileMode.Create);
or.
s = new FileStream(
   "C:/temp/goo.txt, FileMode.Create);
or.
s = new FileStream(
   @"C:\temp\goo.txt", FileMode.Create);

이상....

Posted by gsi
:

Thread를 두개를 사용할 경우 하나의 함수를 호출한다고 가정해 보자.
그렇게 되면 다량의 데이터를 효과적으로 여러개의 스레드를 사용해서 처리할 수가 있다.
아래의 예제를 보면 AddItems()를 스레드 두개를 사용해서 처리 되고 있다.
하지만 결과를 보면 100개의 데이터 값만 뿌려지는 것을 알수 있다.

이때 사용하게 되는 것이 lock 구문이다. 이 구문을 사용해서 멀티 스레드에서의
데이터를 안전하게 처리할 수 있다.
lock 에 포함되는 것은 동기화에 처리되어야 할 데이터를 락을 걸어 주게 되는 것으로
여겨진다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ConsoleApplication4
{
    class Program
    {
        static List<string> list = new List<string>();

        static void Main(string[] args)
        {
            new Thread(AddItems).Start();
            new Thread(AddItems).Start();
        }

        static void AddItems()
        {
            for (int i = 0; i < 100; i++)
                lock (list)
                {
                    string _str = "Item " + list.Count + " ID=" + AppDomain.GetCurrentThreadId();
                    list.Add(_str);
                    Console.WriteLine(_str);
                }
        }
    }
}




 

Posted by gsi
:

사용자 삽입 이미지

[작업 경위]

--xaml 파일--
1. Blend를 사용해서 기본 베이스 제작
   - 해당 경로를 입력 받을 수 있도록 TextBox를 추가
   - 경로 이미지를 가져 오기 위한 Button를 추가
   - 이미지를 보여 주기 위한 ListBox를 추가
2. 템플릿 변경
   - ListBox > StackPanel > TextBlock
                                       Border > Image
     위와 같이 파일 이름과 이미지를 보여 주기 위한 테플릿을 하나 제작하였다.
     이 부분은 상세하게 적지 않는다. (lynda 페이지의 blend 항목에 가면 자세히 나와 있음)
3. 리스트 정보를 저장할 CLR 클래스를 하나 생성한다.
   - Name, Path 정보를 담고 있는 클래스이며, 배열로 사용하기 위해서 ObservableCollection 를 사용하였다.
   - xaml 파일로 클래스 연동시킨다.
     xmlns:c="clr-namespace:GsiImageView" //클래스 네임스페이스 추가
     <Window.Resources>
        <c:PathInfoList x:Key="pathData" /> //를 추가 한다.

--cs 파일--                
1. 스레드를 사용하기 위해서 네임 스페이스 추가
   - using System.Threading;
2. xaml 파일의 버튼 클릭 이벤트를 생성한다.
        private void OnFolderOpenClick(object sender, RoutedEventArgs e)
        {
            Thread loadThread = new Thread(new ThreadStart(DataLoad));
            loadThread.Start();
            Thread.Sleep(1);
        }
3. 스레드에 사용할 함수를 하나 만든다. 이 함수내부에서 폴더 내의 이미지를 읽어서 작업 하도록 한다.
        private void DataLoad()
        {
            .....
        }
4. 메인 스레드의 인스턴스된 객체를 접근 하기 위해서 delegate를 선언한다.
        public delegate void UpdateImage(string _path);
5. Invoke에 사용할 함수를 추가 한다.
        public void UpdateImageList(string _path)
        {
            PathInfoList pathinfolist = (PathInfoList)this.FindResource("pathData");
            pathinfolist.Add(new PathInfo(_path, "none.jpg"));
        }
6. DataLoad() 함수 안에 내용을 추가 한다.
        private void DataLoad()
        {
            //디렉토리 경로 가져 오기
            DirectoryInfo di = new DirectoryInfo(@"D:\WPF_Project\GsiImageView\Image\MaxImageTest");
            try
            {
                if (di.Exists)
                {
                    //경로가 있음
                    foreach (FileInfo fi in di.GetFiles())
                    {
                        //경로를 타고 세부 이미지 이름을 얻어 온다.
                        string path = di.FullName + "\\" + fi.Name;

                        this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.DataBind, new UpdateImage(UpdateImageList), path);

                        Thread.Sleep(60);
                    }
                }
                else
                {
                    MessageBox.Show("경로가 확실하지 않습니다.");
                    return;
                }
            }
            catch
            {
                MessageBox.Show("경로가 확실하지 않거나, 비정상 오류 입니다.");
                return;
            }
        }


몇개더 구현되어야할 내용입니다.
1. 경로 입력후 해당 경로에 맞는 이미지 찾아 오기
2. 경로 내부의 서브폴더까지 찾아서 이미지 추가 하는 방법 구현하기
3. ListBox의 그룹별 소트 방법 및 재정렬 방법 구현하기
4. 미리 목록을 얻어 와서 드로잉 하고 세부 이미지 부분만을 여러개의 스레드를 사용해서 구동되는 형태로 구현하기
5. 미정...


<해당 데모>


Posted by gsi
: