아아...빌어먹을 마이크로소프트...
日新又日新 | 2007. 2. 9. 08:51
너네 땜에 금방 해결될 문제를 한참을 고민했잖아...=_=

MS Access Driver를 사용하는데 SQL쿼리를 날리는게 자꾸 매개변수가 1개 부족하다고 나왔다.

그래서 처음에는 낑낑대면서 고치고 있었는데...

하도 답답해서 parameter 로 검색을 해보니 이럴 수가...바로 나온다.

BUG: Incorrect SQL Generated for Access Query with String Parameter


그래...너네를 믿은 내가 잘못이다...=_=

아무튼 이걸 해결하고 나니 나머지는 일사천리.

어차피 공부 겸 도와줄 겸 해서 만든거니까 여기 소스를 올려둬야겠다.
참고로 이건 탑클래스라는 학원관리프로그램에서 학생별로 상담기록이 인쇄가 안 되길래 만든 프로그램이다. UI는 [엉망]이다.ㅋㅋㅋ

나중에 이 코드를 하나씩 분석한 글을 다시 또 올려봐야지.



# -*- coding: EUC-KR -*-
#아래 세 줄은 wxPython 을 이용한 코드가 py2exe로 변환할때 한글이 끼어있으면 나는 에러를 방지하기 위함.
import sys
if hasattr(sys, "setdefaultencoding"):
    sys.setdefaultencoding(sys.getfilesystemencoding())
import wx
import wx.grid
import dbi, odbc
import shutil
import os
import win32api


class MyPanel(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, id)
        self.parent = parent
       
       
        self.txtName = wx.TextCtrl(self, -1, "학생이름 입력")
        self.btnSearch = wx.Button(self, -1, "상담기록 검색")
        self.btnPrint = wx.Button(self, -1, "인쇄")
        self.grdData = wx.grid.Grid(self, -1, size=(350,150))
        self.grdData.CreateGrid(500, 3)
       
        self.txtName.SetPosition((10, 10))
        self.btnSearch.SetPosition((120, 10))
        self.btnPrint.SetPosition((220, 10))
        self.grdData.SetPosition((10,60))
        self.grdData.SetColLabelValue(0,"날짜")
        self.grdData.SetColLabelValue(1,"상담선생님")
        self.grdData.SetColLabelValue(2,"상담내용")
       
        self.txtName.SetFocus()

        self.Bind(wx.EVT_BUTTON, self.OnSearchDB, self.btnSearch)
        self.Bind(wx.EVT_BUTTON, self.OnPrint, self.btnPrint)

    def OnSearchDB(self, event):
#        여기에 기존 표에 있던 내용 지우는 과정이 들어가야 된다.
        ClearGrid()
        result = GetData(self, self.txtName.Value)
        for row in range(len(result)):
            for col in range(len(result[row])):
                values = result[row][col]
#                    print values
#                    print len(values)
                try:
                    self.grdData.SetCellValue(row,col,str(values))
                except:
                    self.grdData.SetCellValue(row,col,"DB입력이 잘못되어 있습니다. 5줄제한을 맞춰주세요.")

    def OnPrint(self, event):
        #텍스트 파일로 저장.
        result = GetData(self, self.txtName.Value)
        SaveFile(result, self.txtName.Value)
        #텍스트 파일 인쇄.
        PrintFile()
        #인쇄한 텍스트 파일 삭제.
        DeleteFile()
   

def SaveFile(result, Name):
    SeperateLine = '\n' + ("-" * 80 ) + '\n'
   
    SaveFile = open('Record.txt','w')
   
    SaveFile.write('   학    생   :  %s\n' % EncodingChange(Name))
    for row in range(len(result)):
        SaveFile.write('%s' % SeperateLine)
        for col in range(len(result[row])):
            if col == 0:
                values = '[상담 일자]   : ' +  result[row][col]
            if col == 1:
                values = '[상담 선생님] : ' + result[row][col]
            if col == 2:
                values = '[상담 내용]   : \n' + result[row][col]

            SaveFile.write('%s\n' % values)
   
    SaveFile.close()


def PrintFile():
    win32api.ShellExecute(0, "print", "Record.txt", None, ".", 0)
    pass

def DeleteFile():
    #굳이 인쇄한 내용을 삭제할 필요를 못 느끼겠다.
#    os.remove("Record.txt")
    pass


class MyFrame(wx.Frame):
    def __init__(
            self, parent, ID, title, pos=wx.DefaultPosition,
            size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE
            ):

        wx.Frame.__init__(self, parent, ID, title, pos, size, style)
        self.SetTitle(title)
       
def GetData(Frame, Name):
    Student = EncodingChange(Name)
    dbc = odbc.odbc("Driver={Microsoft Access Driver (*.mdb)};DBQ=%s;PWD=^^;여기는 비밀^^'"%(DB))
    crsr = dbc.cursor()
    #돌겠다. 아랫줄 mssql 버그라는군... where 문의 인자를 single quote로 묶어줘야 된다는구만. 이것땜에 하루 꼬박 보냈잖아...-_-
    #영문검색을 생활화하자. parameter로 검색하니까 바로 나오잖어...-_-
#   crsr.execute("""SELECT \"상담일지.내용\", \"상담일지.교사\" """ + """ FROM \"상담일지\"""" + """ WHERE (((\"상담일지.교사\")=\'이우성 수학선생님\'));""")
    crsr.execute(
                 """
                    SELECT 상담일지.날짜, 상담일지.교사, 상담일지.내용
                    FROM 수강생 INNER JOIN 상담일지 ON 수강생.수강생번호 = 상담일지.수강생번호
                    WHERE (((수강생.성명)=\'%s\'));
                """ % (Student)
                )
    result = crsr.fetchall()      # fetch the results all at once
    return result
   
def ClearGrid():
   
    pass
   
def CopyDB():
    rS = r'C:\\Program Files\\^^.mdb'
    DBFile = eval("'%s'" % rS)
    shutil.copyfile("C:\Program Files\^^.mdb", DBFile)
    return DBFile

def EncodingChange(SourceString):
    ReturnString = SourceString.encode('euc-kr')
    return ReturnString


DB = CopyDB()

wxApp = wx.App(False)
frame = MyFrame(None, -1, DB)
MyPanel(frame, -1)
frame.Show()
wxApp.MainLoop()
ㅋㅋㅋ 스파게티 소스도 완전히 불어터진 놈이다...^^;

아, py2exe 를 이용해서 실행파일로 만들었는데 이건 py2exe를 실행하기 위한 setup.py 파일이다.
# -*- coding: EUC-KR -*-

from distutils.core import setup
import py2exe

#다음 코드를 소스파일이 있는 디렉토리에서 실행하시오.
#python setup.py py2exe
#setup(console=['Main.py'])

setup(
    options = {"py2exe": {"packages": ["encodings"]}},
      console=["C:\Documents and Settings\YWS\My Documents\Eclipse_Workspace\ConsultationList\src\Main.py"]
    )
그리고 여기는 내가 이번에 작업을 하면서 도움 받은 사이트들이다.

py2exe.org

Koders - sqlite.py

PythonODBC Datenbankzugriff mit den Win32 extensions - Sonstige Sprachen @tutorials.de: Forum - Tutorials - Hilfe - Schulung & mehr

ADOdb for Python

파이썬 마을 :: 주제 보기 - window의 odbc로 한글데이터를 읽을때 데이터가

Python ODBC 연결하기 (Windows only)

mxODBC - Python ODBC Interface

Serpia: Python/MySQL tutorial

 
 
 
트랙백 | 댓글



위치로그 : 태그 : 방명록 : 관리자
이우성's Blog is powered by Daum / Designed by SSen
관리자  |  글쓰기
BLOG main image
전, 이우성입니다. ( I am Woosung, Lee. ) ""
 Category
 Media
 TAGS
 Recent Entries
 Recent Comments
 Calendar
 Archive
 Link Site
 Visitor Statistics
+ Total :
+ Today :
+ Yesterday :
카피
rss