c#

c#으로 돌아와서

 

using System.Data;

using System.Data.SqlClient;

 

요게 필요하다!!

 

2개를 소개하겠다.

select, insert

 

1.  select

--------------------------------------------

            SqlConnection con = new SqlConnection();
                con.ConnectionString = "Server=localhost;database=tempdb;uid=sa;pwd=";

            // Server='IP주소 가능', database = '테이블만든데이터베이스'

            // mssql 설치시 입력한 id와 pass


            string strSql = "SELECT * From diary WHERE date=@date";

            // *은 전체를 의미, diary 테이블로 부터 select한다

            // where 은 데이터를 필터링 해준다.


            SqlCommand cmd = new SqlCommand(strSql, con);
            cmd.Parameters.AddWithValue("@date", date);
            con.Open();
            SqlDataReader rd = cmd.ExecuteReader();
            if (rd.Read())
            {
                date = rd["content"].ToString();
            }
            else
            {
                date = "저장된 자료가 없습니다.";
            }
            rd.Close();
            con.Close();
            return date;

---------------------------------------------------

 

2. insert

----------------------------------------------------

            SqlConnection con = new SqlConnection();
            con.ConnectionString = "Server=localhost;database=tempdb;uid=sa;pwd=";
            string strSql = "INSERT INTO diary(content, datetime) VALUES(@content, @dateTime)";
            SqlCommand cmd = new SqlCommand(strSql, con);
            cmd.Parameters.AddWithValue("@content", content);
            cmd.Parameters.AddWithValue("@dateTime", date);
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();

//위와 동일 자세한 내용은 SQL책 혹은 검색을 해주세요 ^~^

---------------------------------------------------

 

DB연동하기 참 쉽죠잉

저는 이것땜에 2틀동안 개고생했다는 ㅠㅠ 여러분 부자되세요~

신고
c#

자 이제 db를 사용할 모든 준비는 끝났다 써보자...

 

1. 우선 기본적인 테이블을 생성하자.

mssql 2005 -> SQL Server Management Studio Express 실행

아래 같은 화면이 나타남을 볼수 있다.

설치할때 입력했던 아이디와 암호를 입력하고 연결

 


 

 

 

2. 아래와 같이 연결이 성공했다.


 

 

 

 

3. 접근할 db선택 후 table을 만드는데 나는 tempdb에다가 table을 만들었다.

tampdb 오른쪽 클릭후 새테이블을 만들자. 그럼 아래와 같은 그림이 뜬다.

원하는 테이블을 작성후 저장하자. (테이블 만들때 key값 지정하는 것은 잊지말자!)

저장할때 원하는 table이름명으로 저장


 

 

테이블이 완성되었따. !!!!!!!!!!

신고
c#

1. visual studio 2005를 설치한다.

2. iis를 설치한다.

3. mssql server 2005 Express Edition, SQL server Management Studio Express 다운

http://www.microsoft.com/korea/msdn/vstudio/express/sql/download/


 

4. mssql server 2005 를 설치한다.(공짜버전인 Express Edition)

5. SQL Server Management Studio Express 를 설치한다.

 - 매니저 설치할때

  인스턴스 선택시 :  기본 인스턴스 체크

  로그온 정보 : 윈도우 폼 인증이 아닌 sqlserver 인증 및 윈도우 폼 인증 모드 선택후 (아이디와 비밀번호를 입력)

6. 나머지 쭉 next 버튼

 

 

설치완료~~~

 

 

그런데 여기서 끝이아니다 server인증을 통한 외부에서 접근시에는 기본적으로 mssql에서 막아두었다고 한다.

- mssql 2005 -> 구성도구 ->SQL Server 구성 관리자 실행

- 네트워크 구성에서 해당 프로토콜 선택후 tcp/ip 를 사용함으로 바꾸자

- 확인을 위해 cmd 창을 뛰우고    -> telnet localhost 1433    을 입력해보자(기본 포트 1433)

  접속이 되지 않는다면... tcp/ip 오른쪽 클릭후 속성에서 동적 port 부분말고 밑에 부분의 포트를 1433으로 변경

  접속이 된다면 자 이제 mssql을 써보자




신고
c#

1. 속성을 잘 활용하자.

2. const보다는 readonly가 좋다.

[간단설명]

const는 컴파일 시간  조금더 빠르다 , 제한적 , 딱딱

readonly 런타임 시간  const보다 조금 느리다 , 포괄적, 유연

 

const는 IL(중간언어)에서 상수로 정해진다.

readonly는 IL에서 상수로 정해지는것이 아니라 참조형으로 가리키고 있다.

신고
c#

[질문]

"한 스레드에 만든 컨트롤은 다른 스레드에 있는 컨트롤의 부모가 될 수 없습니다."

 라는 오류가 발생합니다.

- Form class

- ClassA (내부에서 Thread 생성)

- ClassB (내부에 DataTable 개체 소유)

 

Form은 ClassA를 멤버로 가지며, ClassA는 ClassB를 멤버로 가집니다.

A에서 생성된 Thread에서 ClassB에 Form의 DataGrid 참조를 넘기면 ClassB는 참조를 받아 이 그리드의 DataSource를 설정하는 부분에서

위와 같은 오류가 발생합니다.

 조언 부탁드립니다... ^^

 좋은 하루 되세요~


 ----------------------------------------------------------------------------------------

 [답변]

 
 Thread와 Windows 컨트롤간에 관계가 복잡합니다.

 그것은 window에 GDI를 담당하는 스레드와 실제 작업을 하는 워크 스레드 그리고 사용자가만든 스레드 간의

 이해 관계입니다. 이걸 설명하려면 ㅡㅡㅋ 찾아봐야하겠지만

 이해하기도 어렵습니다.

 스레드로 작업한 값을 컨트롤에 적용하기 위한 부분을 Control.Invoke()를 사용하도록 지원하고 있습니다.

---------------------------------------------------------------------------------------
InvalidOperationException 이 맞는지요???

내용을 보니..맞는거 같은데 말이죠..

아니면 패스..하세요..ㅋ

하나의 스레드에서 만든 컨트롤에 대한 엑세스는 그 스레드 영역에서만 가능 합니다.

하지만 스레드 프로그램상에서 이 원칙을 지킬려면..ㅋ

방법은 간단해요..

델리게이트를 쓰는거에요.

 메인 스레드에서 델리게이트로 델리게이트메소드를 만들어 인보크 해서 그 메소드에서 컨트롤에 대한 핸들링을 하시면 됩니다.

  아래 코드는 메인 폼 페이지에 있구요

  fileHandling 는 님의A 클래스에 해당 됩니다.

B클래스의 이벤트를 A클래스에 넘기고 A클래스의 이벤트를 메인폼에 넘긴 코드입니다.

아래 코드에서..

SetRowCount() 내용을 델리게이트로 호출하지 않고 바로 사용하게 되면..

Cross Thread 즉..InvaildOperationException 예외가 발생하게 됩니다...

 ---------------------------------------------------------------------

       private delegate void CallbackRowCount(int count);

 

 

        private void fileHandling_OnRowCount(object sender, RowCountEventArgs e)

        {

            if (this.progressBar1.InvokeRequired)

            {

                CallbackRowCount c = new CallbackRowCount(SetRowCount);

                this.Invoke(c, e.TotalCount);

            }

        }

 

        private void SetRowCount(int count)

        {

            this.progressBar1.Maximum = count;

            this.progressBar1.PerformStep();

            Application.DoEvents();

        }
 
 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 비주얼스튜디오 2005로 작업 하고 있습니다.   닷넷프레임웍 2.0

1.1에서는 잘 돌아가는 코드 입니다.

다음과 같이 했는데 크로스 쓰레드 라는 에러가 발생 합니다.

thread th;   // 전역 변수로 선언

A() 메소드

try {

    while ( true ) {

      작업

        .

        .

        .

    }

}  catch {

        레이블컨트롤.Text = "에러";

}

 

 

버튼 클릭 이벤트()

 

this.th = new Thread ( new ThreadStart ( A ) );

th.Start();

 

 

 

 

 

간단하게 이런 코드 인데

레이블컨트롤.Text = "에러";     <= 이 부분에서

자기가 생성하지 않은  쓰레드에 접근 ?     [ 에러내용이 자세하게 생각나지 않네요..]

대략 이런 메세지를 보내면서   크로스쓰레드 에러를 발생합니다.

하지만  레이블컨트롤.Text = "에러"; 이부분을 주석처리 하면 에러가 나지 않습니다.

저 레이블콘트롤은  SplitContainer컨트롤의 Panel1에  있습니다.

무슨 에러이며, 해결 방법  부탁드립니다.
 
 ---------------------------------------------------------------------------------------

컨트롤을 만든 쓰레드만 컨트롤을 다룰 수 있습니다.

다른 쓰레드에서는 간접적인 방법으로 컨트롤을 만든 쓰레드에게 요청을 할 수 있습니다.

             this.Invoke(new MethodInvoker(delegate()

            {

                this.label1.Text = "Test";

            }));

 

원래 MethodInvoker의 인수는 메소드여야 하는데 .NET 2.0 부터는

[출처] 크로스 쓰레드|작성자 whwh0207

신고

'Computer Engineering > C#' 카테고리의 다른 글

[C#] C#과 MSSQL2005 연동하기 개돌 - 1편  (0) 2011.01.11
[C#] Effective c#을 읽고 정리  (0) 2011.01.11
[C#] 크로스쓰레드  (0) 2011.01.11
[C#] c#을 이용한 usb 연결, 연결해제 처리  (0) 2011.01.11
[C#] PC 종료 코드  (0) 2011.01.11
[C#] 메모리 Leak?  (0) 2011.01.11
c#
ㅊprotected override void WndProc(ref Message m)

            {

                UInt32 WM_DEVICECHANGE    = 0x0219;

                UInt32 DBT_DEVTUP_VOLUME = 0x02;

                UInt32 DBT_DEVICEARRIVAL = 0x8000;

    

                if ((m.Msg == WM_DEVICECHANGE) && (m.WParam.ToInt32() == DBT_DEVICEARRIVAL))

                {

                    MessageBox.Show("디바이스가 연결되었습니다.");

    

                    int m_Count = 0;

                    int devType = Marshal.ReadInt32(m.LParam, 4);

    

                    if (devType == DBT_DEVTUP_VOLUME)

                    {

                        MessageBox.Show("USB 장치가 연결 됨");

                    }

                    else

                    {

    

                        MessageBox.Show("USB to COM 장치가 연결 됨");

                        //단순하게 test하기 위해 젤 마지막 포트이름을 뿌려 봄

                        foreach (string str in SerialPort.GetPortNames())

                        {

                           

                               //........블러블러 COM으로 Device Chage 잡힐경우

                                MessageBox.Show("현재 연결된 디바이스 포트는 : " + str);

                       }

                   }//.....etc....

               }

               base.WndProc(ref m);

           }

신고

'Computer Engineering > C#' 카테고리의 다른 글

[C#] Effective c#을 읽고 정리  (0) 2011.01.11
[C#] 크로스쓰레드  (0) 2011.01.11
[C#] c#을 이용한 usb 연결, 연결해제 처리  (0) 2011.01.11
[C#] PC 종료 코드  (0) 2011.01.11
[C#] 메모리 Leak?  (0) 2011.01.11
[C#] DB exception 처리 정석?  (0) 2011.01.11
c#

안녕하세요? 홍석입니다.

컴퓨터를 종료/재부팅/로그오프를 하는방법은 다음과 같습니다.

 기본적으로  Using System.Diagnostics을 사용하며,

예제코드는 다음과 같습니다.

종료

Process.Start("shutdown.exe", "-s");            // 기본적으로 30초 후 종료됩니다.

Process.Start("shutdown.exe", "-s -t xx")     // xx 초 후 종료됩니다.

 

재부팅

Process.Start("shutdown.exe","-r");              // 종료과 유사하며 커멘드만 "-r"을 사용합니다.

Process.Start("shutdown.exe","-r -t xx");

 

로그오프

Process.Start("shutdown.exe","-l");              // 위 코드와 유사하며 커멘드만 "-l"(숫자 1이 아닌 소문자'l')을 사용합니다.

 

 

원하는 시간에 종료하길 원하신다면, 현재시간을 비교해 종료하는 방법을 쓸 수 있겠네요:)

 

 

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=117679&ref=117671&page=7#Contents117679

신고

'Computer Engineering > C#' 카테고리의 다른 글

[C#] 크로스쓰레드  (0) 2011.01.11
[C#] c#을 이용한 usb 연결, 연결해제 처리  (0) 2011.01.11
[C#] PC 종료 코드  (0) 2011.01.11
[C#] 메모리 Leak?  (0) 2011.01.11
[C#] DB exception 처리 정석?  (0) 2011.01.11
[C#] 윈폼 로그인 해킹에 안전하게?  (0) 2011.01.11
c#

[ 질문]

안녕하십니까. 궁금한 점이 있어 질문 드립니다.

응용프로그램이 있습니다. C#으로, .NET 2.0 환경입니다.

응용프로그램을 실행시키면 원래 사용 메모리가 죽죽 올라갔다가 GC로 다시 일정 수준까지 내려오고,

이것을 반복하면서 메모리가 어느선까지 유지가 되어야 하는데요...

메모리가 아주 죄금씩 증가됩니다.

처음에는 문제가 되지 않지만, 오~랜 시간동안 프로그램을 실행시켜놓으면, 서서히 서서히 맛탱이가 떠나가고맙니다..;;

이럴경우, 소스를 확인해봐도 도저히 어디서 메모리 누수(?)가 발생하는지 확인하지 못하면,


[답변]

C# 에서는 기본적으로 Leak 이란게 없습니다

단 프로그램 실수상으로 나올 수 있는데.


1. ActiveX 등의 UnManaged 메모리를 제대로 처리하지 않은경우(이건 자동 아닙니다!)

2. 어딘가의 Collection 에 객체 넣어두고 안뺀경우(참조를 하고있으니 당연히 GC가 해제를 못하죠)

 이 두가지를 살펴보심 되겠습니다.

 API 에서 생성된 리소스(메모리, 핸들 등) 은 다 수동해제해야합니다.

그것 역시 UnManaged 리소스니까요

 출처

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=117840&ref=117840&page=1

신고
c#
using (SqlCommand cmd = 프로시저 호출)
    {
        try
        {
            try
            {
                if (cmd.ExecuteNonQuery() != 1)
                {
                    throw new Exception();
                }
            }
            catch (SqlException se)
            {
                foreach (SqlError err in se.Errors)
                {
                    if (err.Message.IndexOf("UNIQUE KEY 제약 조건 'IX_t_ent'을(를) 위반했습니다.") != -1)
                    {
                        Output("이름이 중복됩니다.");
                        return;
                    }
                }
                throw new Exception();
            }
        }
        catch (Exception)
        {
            Output("DB서버에 문제가 있습니다.");
            return;
        }
    }
신고

'Computer Engineering > C#' 카테고리의 다른 글

[C#] PC 종료 코드  (0) 2011.01.11
[C#] 메모리 Leak?  (0) 2011.01.11
[C#] DB exception 처리 정석?  (0) 2011.01.11
[C#] 윈폼 로그인 해킹에 안전하게?  (0) 2011.01.11
[C#] 프로그램 중복 실행 방지  (0) 2011.01.11
[C#] 자석 효과 사용법 설명  (0) 2011.01.11
c#

[질문]

리버스 엔지리어링으로 부터 접속 아이디와 패스워드 보호하기-----------------------------------------------------------------------------------

원폼 --------> 미들티어(XML 웹서비스, WCF 서비스)  ----(서버접속 아이디와 패스워드)----> 서버

 

로그인 필요 없는 경우에는 미들티어를 사용하여 서버 접속 아이디와 암호를 보호 할 수 있겠지만.

 

 

 

원폼 ----(아이디, 패스워드)----> 미들티어(XML 웹서비스, WCF 서비스)  ----(서버접속 아이디와 패스워드)----> 서버

 

미들티어에 로그인 필요한 경우에 아이디와 패스워드를 보호 할 수 있는 방법이 무엇이 있을까요?

 

[답변]

1. SSL 등의 암호화 방법들

2. MD5등의 해시화 알고리즘들

 2가지를 혼용해야합니다.

 

1번만 할 경우 리버스엔지니어링에 취약하고

2번만 할경우 패킷스니핑에 취약합니다.

신고

+ Recent posts

티스토리 툴바