日新又日新
아아...빌어먹을 마이크로소프트...
이우성
2007. 2. 9. 08:51
너네 땜에 금방 해결될 문제를 한참을 고민했잖아...=_=
MS Access Driver를 사용하는데 SQL쿼리를 날리는게 자꾸 매개변수가 1개 부족하다고 나왔다.
그래서 처음에는 낑낑대면서 고치고 있었는데...
하도 답답해서 parameter 로 검색을 해보니 이럴 수가...바로 나온다.
그래...너네를 믿은 내가 잘못이다...=_=
아무튼 이걸 해결하고 나니 나머지는 일사천리.
어차피 공부 겸 도와줄 겸 해서 만든거니까 여기 소스를 올려둬야겠다.
참고로 이건 탑클래스라는 학원관리프로그램에서 학생별로 상담기록이 인쇄가 안 되길래 만든 프로그램이다. UI는 [엉망]이다.ㅋㅋㅋ
나중에 이 코드를 하나씩 분석한 글을 다시 또 올려봐야지.
아, py2exe 를 이용해서 실행파일로 만들었는데 이건 py2exe를 실행하기 위한 setup.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
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