참 오랜만에 글 쓰는듯..
7월엔 놀고 8월엔 공부하고,9월엔 공부하면서 "슬슬 결과물을 하나는 내보자." 생각하면서 추석뒤에 1차로 뽑아낸 결과물입니다.

아직 초기 테스트 버전이기에 정말 심플합니다.

기능중 일부만 소개 할 것 이기에 2가지만 넣었습니다.

*이 프로그램을 테스트하기 위해선 MS SQL SERVER 2005 EXPRESS 버전 이상이 필요합니다.
필자의 개발환경및 테스트 환경은 SQL SERVER 2008 R2 EXPRESS 32bit(winxp)/64bit(win7) 이었습니다.

먼저 이 부분은 CLR 설정 부분입니다.
*CLR을 활성화 하신분이면 넘어가셔도 됩니다.
*따로 적거나 하지 않으셔도 아래 첨부된 sql 파일에 주석까지 다 달려 있으니 그대로 해보시면 됩니다.

--CLR을 활성화 하는 설정입니다.
SP_CONFIGURE 'CLR ENABLED',1
RECONFIGURE WITH OVERRIDE
GO

--CLR을 활성화 합니다.
SP_CONFIGURE
GO

 아랫 부분은 프로그램 등록 및 테스트 입니다.
*편의상 C드라이브 루트 밑에 위치시켰고 편한쪽에 위치 시키시면 됩니다.

 --현재 DB에 어셈블리로 등록합니다.
CREATE ASSEMBLY ASM_GetDBSystemInfo FROM 'C:\GetDBSystemInfo.dll'
WITH PERMISSION_SET = UNSAFE
go

--등록된 어셈블리중 시스템정보표시 프로시저(현재하드디스크용량만 표시)를 등록합니다
CREATE PROC usp_clr_GetSysInfo
AS EXTERNAL NAME ASM_GetDBSystemInfo.StoredProcedures.usp_clr_GetSysInfo
GO

--등록된 시스템정보 표시 프로시저를 호출합니다.(테스트)
EXEC usp_clr_GetSysInfo
GO

--DB 시스템에 커맨드 명령을 날리고 결과를 반환하는 테이블 반환 함수를 지정합니다.
CREATE FUNCTION usp_command(@input NVARCHAR(512))
RETURNS TABLE
(cammand_Result NVARCHAR(512))
AS
EXTERNAL NAME ASM_GetDBSystemInfo.StoredProcedures.usp_command
GO

--DB 시스템에 커맨드 명령을 날려 IP정보를 확인 합니다.
SELECT * FROM usp_command('ipconfig /all');

간단하죠?
이제 usp_command('커맨드') 를 이용해서 간단히 DB시스템을 확인하고 제어 할수 있게 되었습니다.
작성 하실때 CREATE FUNCTION usp_command 부분에서 이름을 다르게 정하시면 그 이름으로도 사용 가능합니다.
또한 매니지먼트 스튜디오에서 DB->프로그래밍기능->어셈블리/함수 쪽에서 유저권한같은 세밀한 설정도 가능합니다.


* 이 프로그램은 프리웨어이며 상업적 이용도 가능합니다. 단 컨텐츠 무단 변경/재배포는 불가능 합니다.
또한 이 프로그램을 사용함으로서 발생 할 수 있는 문제에 대해서 책임지지 않습니다.

10.5일 추가사항.
현재 dll파일이 인증서 없이 제작 되어 있어 SYSADMIN 관리자 권한하에 TRUSTWORTHY ON 설정이
어셈블리 등록전에 필요합니다.
ALTER DATABASE ASNS SET TRUSTWORTHY ON;
를 사용하면 사용가능합니다.(인증서는 향후 추가 해보겠습니다)

by Tomoya 2011.09.23 13:45


내부DB(Inner DB)는 MS ACCESS 파일(.mdb)
외부DB(External DB)는  MS SQL 2005 SERVER EXPRESS 를 기준으로 작성한 파일이다.
내부 DB를 사용 하기 위해선 파라미터의 names부분을 (:이름) 배열 형태로 작성하면 되고,
외부 DB를 사용 하기 위해선 파라미터의 names부분을 (@이름) 배열 형태로 작성하면 된다.

내부DB는 오피스 2003 이상 버전이 있다면 DB생성 및 편집이 가능하고,
외부DB는 상업적 이용도 무료다.(단, EXPRESS 에디션은 기능에 약간의 제한이 있긴하다.그러나 테스트 구축이나
작은 사이트를 운영하는데는 큰 무리 없다고 생각 된다.)

각각 constr과 ext_constr에 컨넥션 부분의 기본정보를 작성하고,
테이블이 필요 하다면 gettable,ext_gettable을 사용하고,
데이터만 필요 하다면 GetDatas,Ext_GetDatas를 사용하면 된다.



using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Data.Odbc;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;
using System.IO;
using System.Collections;

namespace DUAL_DAO
{
    class DAO
    {
        static string constr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=(accessDB경로);Persist Security Info=True";

        static OleDbDataReader rd;

        static OleDbDataAdapter da;

        static SqlDataReader sdr;

        static SqlDataAdapter sda;

        static string ext_constr = @"Data Source=(DB서버URL);User ID=(ID);Password=(PASSWORD)";

        DAO()
        {
           
        }

        public static bool connect_test()
        {
            bool state = false;
            SqlConnection conn = new SqlConnection(ext_constr);
            try
            {
                conn.Open();
                state = true;
                conn.Close();
            }
            catch (Exception)
            {
                state = false;
                if (conn.State == ConnectionState.Open) conn.Close();
            }
            return state;
        }

        public static DataTable gettable(string sql)
        {
            DataSet ds = new DataSet();

            da = new OleDbDataAdapter(sql,new OleDbConnection(constr));

            da.Fill(ds);

            return ds.Tables[0];
        }

        public static DataTable Ext_gettable(string sql)
        {
            DataSet ds = new DataSet();

            sda = new SqlDataAdapter(sql, new SqlConnection(ext_constr));

            sda.Fill(ds);

            return ds.Tables[0];
        }

        public static DataTable gettable(string sql,string[] names, object[] values)
        {
            DataSet ds = new DataSet();

            OleDbCommand odc = new OleDbCommand(sql, new OleDbConnection(constr));

            if (values != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    odc.Parameters.AddWithValue(names[i], values[i]);
                }
            }

            odc.Connection.Open();

            da = new OleDbDataAdapter(odc);

            da.Fill(ds);

            return ds.Tables[0];
        }

        public static DataTable Ext_gettable(string sql, string[] names, object[] values)
        {
            DataSet ds = new DataSet();

            SqlCommand sc = new SqlCommand(sql, new SqlConnection(ext_constr));

            if (values != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    sc.Parameters.AddWithValue(names[i], values[i]);
                }
            }

            sc.Connection.Open();

            sda = new SqlDataAdapter(sc);

            sda.Fill(ds);

            return ds.Tables[0];
        }

        public static DataTable ExtGetTable(string sql,string[] cnames)
        {
            DataTable dt = new DataTable();

            string[][] datas = null;

            SaveLogs(sql, cnames);

            OleDbCommand odc = new OleDbCommand(sql, new OleDbConnection(constr));

            odc.Connection.Open();

            rd = odc.ExecuteReader();

            try
            {
                if (rd.HasRows)//데이터 테이블의 크기가 0보다 크다면
                {
                    int dt_cols_count = rd.FieldCount;

                    int k = 0;
                    //ArrayList temparr = new ArrayList();
                    for (int i = 0; i < cnames.Length; i++)
                    {
                        dt.Columns.Add(cnames[i]);
                    }

                    ArrayList temparr = new ArrayList();
                    while (rd.Read())
                    {
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            temparr.Add(Convert.ToString(rd[j]));//데이터를 생성한 배열에 저장
                        }
                        k++;
                    }

                    for (int i = 0; i < temparr.Count / dt_cols_count; i++)
                    {
                        datas[i] = new string[dt_cols_count];//해당 행만큼 세부 1차원 배열 생성
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            datas[i][j] = (string)temparr[(i * dt_cols_count) + j];
                        }
                    }

                    for (int i = 0; i < dt_cols_count; i++)
                    {
                        dt.Rows.Add(datas[i]);
                    }
                }
                else
                {
                    dt = null;//0보다 작다면 null값 설정
                }
            }
            catch (Exception ex)
            {
                Save_Error_Logs(ex.Message);
            }
            finally
            {
                if (odc.Connection.State == ConnectionState.Open)
                {
                    odc.Connection.Close();
                }
                odc.Dispose();
            }

            return dt;
        }

        public static string[][] GetDatas(string sql, string[] names, object[] values)
        {
            string[][] datas = null;

            SaveLogs(sql, values);

            OleDbCommand odc = new OleDbCommand(sql, new OleDbConnection(constr));

            if (values != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    odc.Parameters.AddWithValue(names[i], values[i]);
                }
            }

            odc.Connection.Open();

            rd = odc.ExecuteReader();

            try
            {
                if (rd.HasRows)//데이터 테이블의 크기가 0보다 크다면
                {
                    int dt_cols_count = rd.FieldCount;

                    int k = 0;
                    ArrayList temparr = new ArrayList();
                    while (rd.Read())
                    {
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            temparr.Add(Convert.ToString(rd[j]));//데이터를 생성한 배열에 저장
                        }
                        k++;
                    }

                    datas = new string[temparr.Count / dt_cols_count][];//행만큼의 2차원 배열 생성
                    for (int i = 0; i < temparr.Count / dt_cols_count; i++)
                    {
                        datas[i] = new string[dt_cols_count];//해당 행만큼 세부 1차원 배열 생성
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            datas[i][j] = (string)temparr[(i * dt_cols_count) + j];
                        }
                    }
                }
                else
                {
                    datas = null;//0보다 작다면 null값 설정
                }
            }
            catch (Exception ex)
            {
                Save_Error_Logs(ex.Message);
            }
            finally
            {
                if (odc.Connection.State == ConnectionState.Open)
                {
                    odc.Connection.Close();
                }
                //if(odc != null) odc.Dispose();
            }

            return datas;
        }

        public static object[][] Get_Inner_Datas(string sql, string[] names, object[] values)
        {
            object[][] datas = null;

            SaveLogs(sql, values);

            OleDbCommand odc = new OleDbCommand(sql, new OleDbConnection(constr));

            if (values != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    odc.Parameters.AddWithValue(names[i], values[i]);
                }
            }

            odc.Connection.Open();

            rd = odc.ExecuteReader();

            try
            {
                if (rd.HasRows)//데이터 테이블의 크기가 0보다 크다면
                {
                    int dt_cols_count = rd.FieldCount;

                    int k = 0;
                    ArrayList temparr = new ArrayList();
                    while (rd.Read())
                    {
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            temparr.Add(rd[j]);//데이터를 생성한 배열에 저장
                        }
                        k++;
                    }

                    datas = new string[temparr.Count / dt_cols_count][];//행만큼의 2차원 배열 생성
                    for (int i = 0; i < temparr.Count / dt_cols_count; i++)
                    {
                        datas[i] = new string[dt_cols_count];//해당 행만큼 세부 1차원 배열 생성
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            datas[i][j] = temparr[(i * dt_cols_count) + j];
                        }
                    }
                }
                else
                {
                    datas = null;//0보다 작다면 null값 설정
                }
            }
            catch (Exception ex)
            {
                Save_Error_Logs(ex.Message);
            }
            finally
            {
                if (odc.Connection.State == ConnectionState.Open)
                {
                    odc.Connection.Close();
                }
                //if(odc != null) odc.Dispose();
            }

            return datas;
        }

        public static string[][] Ext_GetDatas(string sql, string[] names, object[] values)
        {
            string[][] datas = null;

            Ext_SaveLogs(sql, values);

            //OleDbCommand odc = new OleDbCommand(sql, new OleDbConnection(ext_constr));
            SqlCommand sc = new SqlCommand(sql, new SqlConnection(ext_constr));

            if (values != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    sc.Parameters.AddWithValue(names[i], values[i]);
                }
            }

            sc.Connection.Open();

            sdr = sc.ExecuteReader();

            try
            {
                if (sdr.HasRows)//데이터 테이블의 크기가 0보다 크다면
                {
                    int dt_cols_count = sdr.FieldCount;

                    int k = 0;
                    ArrayList temparr = new ArrayList();
                    while (sdr.Read())
                    {
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            temparr.Add(sdr[j]);//데이터를 생성한 배열에 저장
                        }
                        k++;
                    }

                    datas = new string[temparr.Count / dt_cols_count][];//행만큼의 2차원 배열 생성
                    for (int i = 0; i < temparr.Count / dt_cols_count; i++)
                    {
                        datas[i] = new string[dt_cols_count];//해당 행만큼 세부 1차원 배열 생성
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            datas[i][j] = temparr[(i * dt_cols_count) + j].ToString();
                        }
                    }
                }
                else
                {
                    datas = null;//0보다 작다면 null값 설정
                }
            }
            catch (Exception ex)
            {
                Ext_Save_Error_Logs(ex.Message);
            }
            finally
            {
                if (sc.Connection.State == ConnectionState.Open)
                {
                    sc.Connection.Close();
                }
                //if(odc != null) odc.Dispose();
            }

            return datas;
        }

        public static int ExcuteQuery(string sql, string[] names, object[] values)
        {
            int state = 0;

            SaveLogs(sql, values);

            OleDbCommand odc = new OleDbCommand(sql, new OleDbConnection(constr));

            if (values != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    odc.Parameters.AddWithValue(names[i], values[i]);
                }
            }

            try
            {
                odc.Connection.Open();

                state = odc.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Save_Error_Logs(ex.Message);
            }
            finally
            {
                if (odc.Connection.State == ConnectionState.Open)
                {
                    odc.Connection.Close();
                }
                odc.Dispose();
            }

            return state;
        }

        public static int Ext_ExcuteQuery(string sql, string[] names,object[] values)
        {
            int state = 0;

            Ext_SaveLogs(sql, values);

            SqlCommand idc = new SqlCommand(sql, new SqlConnection(ext_constr));

            if (values != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    idc.Parameters.AddWithValue(names[i], values[i]);
                }
            }

            try
            {
                idc.Connection.Open();

                state = idc.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Ext_Save_Error_Logs(ex.Message);
            }
            finally
            {
                if (idc.Connection.State == ConnectionState.Open)
                {
                    idc.Connection.Close();
                }
                idc.Dispose();
            }

            return state;
        }

        public static bool SaveLogs(string sql, object[] values)
        {
            bool state = false;

            try
            {
                using (StreamWriter sw = new StreamWriter("./querylogs.txt", true))
                {
                    sw.WriteLine("---------------------------------");
                    sw.WriteLine(DateTime.Now.ToString());
                    sw.WriteLine(sql);
                    if (values != null)
                    {
                        foreach (object i in values)
                        {
                            sw.Write(i.ToString() + ", ");
                        }
                        sw.WriteLine();
                    }
                    sw.WriteLine("---------------------------------");
                }
                state = true;
            }
            catch (Exception ex)
            {
                state = false;
                Save_Error_Logs(ex.Message);
            }

            return state;
        }

        public static bool Ext_SaveLogs(string sql, object[] values)
        {
            bool state = false;

            try
            {
                using (StreamWriter sw = new StreamWriter("./Ext_querylogs.txt", true))
                {
                    sw.WriteLine("---------------------------------");
                    sw.WriteLine(DateTime.Now.ToString());
                    sw.WriteLine(sql);
                    if (values != null)
                    {
                        foreach (object i in values)
                        {
                            sw.Write(i.ToString() + ", ");
                        }
                        sw.WriteLine();
                    }
                    sw.WriteLine("---------------------------------");
                }
                state = true;
            }
            catch (Exception ex)
            {
                state = false;
                Save_Error_Logs(ex.Message);
            }

            return state;
        }

        public static int ExcuteQuery(string sql)
        {
            int state = 0;

            OleDbCommand odc = new OleDbCommand(sql, new OleDbConnection(constr));

            try
            {
                odc.Connection.Open();

                state = odc.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Save_Error_Logs(ex.Message);
            }
            finally
            {
                if (odc.Connection.State == ConnectionState.Open)
                {
                    odc.Connection.Close();
                }
                odc.Dispose();
            }

            return state;
        }

        public static int Updating_External_Servers(string logfile)
        {
            int state = 0;

            return state;
        }

        public static bool Save_Error_Logs(string errormesage)
        {
            bool state = false;

            try
            {
                using (StreamWriter sw = new StreamWriter("./errorlogs.txt", true))
                {
                    sw.WriteLine("---------------------------------");
                    sw.WriteLine(DateTime.Now.ToString());
                    sw.WriteLine(errormesage);
                    sw.WriteLine("---------------------------------");
                }
                state = true;
            }
            catch (Exception)
            {
                state = false;
            }

            return state;
        }

        public static bool Ext_Save_Error_Logs(string errormesage)
        {
            bool state = false;

            try
            {
                using (StreamWriter sw = new StreamWriter("./Ext_errorlogs.txt", true))
                {
                    sw.WriteLine("---------------------------------");
                    sw.WriteLine(DateTime.Now.ToString());
                    sw.WriteLine(errormesage);
                    sw.WriteLine("---------------------------------");
                }
                state = true;
            }
            catch (Exception)
            {
                state = false;
            }

            return state;
        }
    }
}



by Tomoya 2009.07.20 11:49
아래 개선형 DB 긁기 (Java)
역시 동일하게 처리속도도 빠르고 모든 SELECT SQL형태에 대응 한다.
-------------------DAO설정

 private Connection conn=null;
 PreparedStatement pstmt = null;

public Connection connection()
  {
   try
   {
    // 드라이버 적재
    Class.forName(_driver);
   
    // DB 연결
    conn = DriverManager.getConnection(_url, _id, _passwd);
   }
   catch(Exception e)
   {
    System.out.println("DB연결 실패");
    System.out.println(e.getMessage());
   }
   return conn;
  }
-------------------- 읽을부분설정
        DAO dao = new DAO();
        Connection conn = dao.connection();
        PreparedStatement psmt = null;
        PreparedStatement psmt2 = null;

try
  {
         Find= null;
 
         String[] value = new String[2];
         value[0] = start;
         value[1] = end;
           
         Find = GetFastDatas(psmt,value);

---------------- 호출
static public String [][] GetFastDatas(PreparedStatement pstmt,String[] values)
 {
   String[][] datas = null;
  
  ResultSet rs = null;
  boolean state = true;
 
  try
  {
   for(int i=0;i<values.length;i++)
   {
    //System.out.println(values.length + "");
    pstmt.setString(i+1, values[i]);
   }
   
   rs = pstmt.executeQuery();
   
   state = true;
   
   ResultSetMetaData rsmd = rs.getMetaData();
   int numberOfColumns = rsmd.getColumnCount();
   
   ArrayList al = new ArrayList();
   while(rs.next())
   {
    for(int i=1;i<numberOfColumns+1;i++)
    {
     al.add(rs.getString(i));
    }
   
   }
   int rows = al.size()/numberOfColumns;
   
   datas = new String[rows][numberOfColumns];
   for(int i=0;i<rows;i++)
   {
    for(int j=0;j<numberOfColumns;j++)
    {
     datas[i][j] = String.valueOf(al.get(i * numberOfColumns + j));
    }
   }
   
   
  }
  catch(SQLException e)
  {
   e.printStackTrace();
   state = false;
  }
  catch(Exception e)
  {
   e.printStackTrace();
   state = false;
  }
  finally
  {
   
  }
  
   if(!state)
   {
    return null;
   }
  
   return datas;
 }
by Tomoya 2009.04.13 18:03

아래 개선형 DB 긁기 (C# 2.0)
처리속도도 빠르고 역시 모든 SQL형태에 대응 할수 있다.
컨넥션 얻어 오는 것은 아래 글 참조

using System.IO;
using System.Data.Sql;
using System.Data;
using System.Data.OracleClient;
using Oracle.DataAccess;

----------------------------------
OracleCommand cmd = new OracleCommand(sql, DbConn.GetConn());

            OracleDataReader rd;

            Find = null;//길 찾기 배열 초기화

            cmd.Parameters.AddWithValue(":SID", startbstop);
            cmd.Parameters.AddWithValue(":EID", endbstop);

            cmd.Connection.Open();

            rd = cmd.ExecuteReader();
            Find = GetOraDatas(rd);
--------------------------------------------------

//오라클 데이터 받아오기
        public static string[][] GetOraDatas(OracleDataReader rd)
        {
            string[][] datas = null;

            try
            {
                if (rd.HasRows)//데이터 테이블의 크기가 0보다 크다면
                {
                    int dt_cols_count = rd.FieldCount;

                    int k = 0;
                    ArrayList temparr = new ArrayList();
                    while(rd.Read())
                    {
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            temparr.Add(Convert.ToString(rd[j]));//데이터를 생성한 배열에 저장
                        }
                        k++;
                    }

                    bisdatas = new string[temparr.Count/dt_cols_count][];//행만큼의 2차원 배열 생성
                    for (int i = 0; i < temparr.Count / dt_cols_count; i++)
                    {
                        bisdatas[i] = new string[dt_cols_count];//해당 행만큼 세부 1차원 배열 생성
                        for (int j = 0; j < dt_cols_count; j++)
                        {
                            datas[i][j] = (string)temparr[(i * dt_cols_count) + j];
                        }
                    }
                }
                else
                {
                    bisdatas = null;//0보다 작다면 null값 설정
                }
            }
            catch (Exception ex)
            {
                using (StreamWriter sw = new StreamWriter("./sqlerror.txt"))
                {
                    //string message = "can not read file";
                    sw.WriteLine(ex.Message);//오류 발생시 sql에러로 저장
                }
            }
            finally
            {
               
            }

            return datas;//해당 sql문의 쿼리 결과를 2차원 문자열 배열로 전송
        }

by Tomoya 2009.04.13 17:56
| 1 |