파폭이 좋죠. 크롬도 이번에 3.0이 되면서 빨라졌다고 하고 ^^; 그래도 아직까진 플러그인이 많은 파폭이 좋네요. ㅎㅎ
포스팅이야 자주 해야되는데...전 라이너스님 글이 안올라오길래 잠시 쉬시나 했어요;;;
알고 봤더니 아침에 RSS에 글이 많길래 안읽고 그냥 읽은 글 처리해버렸더니 항상 글을 못보네요 ^^;;;
라이너스님도 즐거운 하루 되시길 ^^
안녕하세요. 웹페이지 하나를 수정하면서 css를 사용해서 풀다운 메뉴를 만들었습니다. 그런데 ie에서는 잘 되는데 fire fox에서는 깨져서 나와서 알아보려고 웹서핑을 하다가 이곳까지 왔네요. 근데 윗 글을 읽어도 무슨 말인지 잘 모르겠습니다. 저에게 도움을 주실수 있으시겠어요? 감사합니다. 이메일 연락 기다릴께요. ffantast@hotmail.com 감사합니다.
- 참고2 : 빨간색의 굵게 표시된 JAR파일을 제외하고 나머지 jar 파일은 JEUS 설치 후 JEUS 홈디렉토리 아래 \lib\system 폴더 하위에 존재한다.
소스에 적용하기
기상청에서 제공하는 많은 웹서비스들이 있고 각 서비스마다 조회 가능한 기상정보들이 많기 때문에 다 쓸 필요는 없고 필요한 서비스만 가져다 쓰면 된다.
해당 웹서비스의 WSDL을 JAVA 소스로 변환하여 프로젝트에 추가한 후 아래와 같이 사용하면 된다.
/**
* 기상청 웹서비스 관련 Util Class
*/
public class KmaWeatherUtil {
private static SurfaceServiceImplService_Impl impl = null;
private static SurfaceServiceImpl_Stub service = null;
/**
* Default Constructor
*/
public KmaWeatherUtil() {
impl = new SurfaceServiceImplService_Impl();
service = (SurfaceServiceImpl_Stub)impl.getSurfaceService();
/**
* 주어진 지점코드와 시간의 현재 기상정보를 받아온다.
* @param station_id
* @param time
* @return
* @throws RemoteException
*/
public CurrentWeatherModel getCurrentWeatherInfo(String station_id, String time) throws RemoteException {
return service.getCurrentWeather(station_id, time);
}
}
// 실제 사용하는 부분
// 143은 대구의 지역코드이고 2번째 인자는 String 형태(yyyyMMddHH)의 시간이며 null은 현재 시간
KmaWeatherUtil kmaWtUtil = new KmaWeatherUtil();
CurrentWeatherModel curWtInfo = kmaWtUtil.getCurrentWeatherInfo("143", null);
위 소스에서 getCurrentWeatherInfo 함수는 현재 시간의 기상정보를 가져오고 필요한 파라메터는 조회하고자 하는 위치코드(station_id)와 조회를 원하는 시간(time)을 넘겨주면 되고 현재 시간의 기상정보를 얻을려면 null값을 넘겨주면 된다.
JSP에서 표시되는 결과는 아래 그림과 같이 나온다.
이상으로 변환에 대한 정리를 마친다. 현재 프로젝트에서 사용하는 건 현재 기상정보만을 사용하기때문에 함수 하나로 간단하게 되지만 서비스하고자 하는 기능이 많다면 좀 더 복잡해질거라 본다.
닷넷을 이용하신다면 이 글에 적힌 방법으로는 안됩니다 ^^;
이 글은 자바 기준으로 변환하는 방법이구요.
구글에서 닷넷용으로 찾아보시길 권해드립니다.
닷넷으로 할때는 웹참조를 이용하면 된다고 하는데 닷넷으로 하는 방법은 해보지를 않아서 정확한 방법은 잘 모르겠네요.
혹시 ASP.NET이라면 아래 링크를 참고해보세요.
첫번째 : http://msdn.microsoft.com/ko-kr/library/7bkzywba%28VS.80%29.aspx
두번째 : http://quickstarts.asp.net/QuickStartv20/webservices/
죄송합니다 제가 바빠서 블로그 관리가 소홀하네요 ^^;
제우스와 웹투비, 전자정부 프레임워크 연동은 해본적이 없군요;;
근데 java를 이용한다면 크게 차이는 없을거라 생각합니다 ^^;
자세히 설명을 해드리고 싶지만
제가 설명을 해드릴 수 있는 범위는 본문에 있는 글 정도 밖에 안될 거 같습니다 ^^;
네 저걸 적용한 관공서 사이트는 현재도 운영중에 있습니다.
근데 저 웹서비스는 관공서에서 기상청에 공문으로 요청하여
아이디와 비밀번호를 발급받아 사용하는 모듈입니다.
저희와 똑같이 아이디와 비밀번호 발급을 받으셨다면 모르겠지만
아니면 저걸 그대로 사용은 못할거에요 ^^;
예기치 않은 null은 기상청에서 막아놓은 오퍼레이션을 호출할 경우에 발생하네요. 저는 아이디를 발급받아 놓을걸 받아서 써서 이런 사항을 몰랐는데, 혹시나 해서 참고하실분 하시라고 끄적여 놓습니당 ㅠㅠ 헌데,
"일련화 해제 오류: 예기치 않은 XML 판독기 상태입니다. END을(를) 예상했지만 START: {http://xml.apache.org/axis/}stackTrace이(가) 검색되었습니다." 이 오류 아시는분 혹시 있으신가요? ㅠㅠ
eclipse의 web service를 이용하여 client stub으로 변환하여 기상특보 웹서비스(WarningService) 연결이 정상적임을 확인했습니다.
위성 웹서비스(SatelliteService)를 똑같은 형식으로 호출하였더니..
java.lang.RuntimeException: No support for attachments
org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
org.apache.axis.client.Call.invokeEngine(Call.java:2784)
org.apache.axis.client.Call.invoke(Call.java:2767)
org.apache.axis.client.Call.invoke(Call.java:2443)
org.apache.axis.client.Call.invoke(Call.java:2366)
org.apache.axis.client.Call.invoke(Call.java:1812)
kr.go.kma.websky.services.SatelliteService.SatelliteServiceSoapBindingStub.getSatelliteImage(SatelliteServiceSoapBindingStub.java:170)
kr.go.kma.websky.util.SatelliteUtil.getSatelliteImage(SatelliteUtil.java:33)
org.apache.jsp.SatelliteService_jsp._jspService(SatelliteService_jsp.java:57)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:371)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
이와 같은 에러가 발생하더군요. 어떤 차이가 있는건가요?
해결방법은?
2. 크리스탈 리포트 웹사이트 프로젝트가 열려있는 상태에서 <그림1>과 같이 파일 메뉴에서 추가를 선택하여
새 프로젝트를 선택하여 <그림2>에 보이는 템플릿 중에 웹 설치 프로젝트를 선택하여 생성한다.
<그림1> 기존 프로젝트에 새 프로젝트 추가
<그림2> 웹 설치 프로젝트 템플릿 선택
3. 추가된 프로젝트에 기본 컨텐츠 및 병합모듈을
추가한다. 기본 컨텐츠 (크리스탈 리포트 프로젝트 소스 컨텐츠)는 이미 등록이 되어있다. 크리스탈 리포트 2008 배포 시 필요한 병합모듈은 “C:\Program
Files\Common Files\Merge Modules” 위치 시켜야 한다.
- Crystal Reports 2008용 Merge Modules(병합모듈)
<그림3>에서 생성한 WebSetup 프로젝트에서 마우스 오른쪽 버튼 클릭 후 추가를 눌러 병합모듈을
<그림4>에서 보는 것처럼 다운받은 병합모듈을 필요한 파일만 선택하여 프로젝트에 추가한다.
4. 추가한 병합 모듈 중 <그림5>에서 보는 것처럼 CRRuntime_12_0.msm 파일의 속성을 선택하여 <그림6>과 같
이 Keycode 부분에 크리스탈 리포트의 라이센스키를 입력해준다.
(참고 : 정식 라이센스키가 있다면 정식키를 입력해주고 Trial버전을 설치하였다면 Trial키를 넣어준다.)
<그림5> CRRuntime_12_0.msm 속성 선택
<그림6> 속성 중 Keycode에 라이센스 키를 입력
5. 컨텐츠 및 병합모듈의 추가가 끝났다면 웹 설치 프로젝트를 빌드 한다. 빌드 후 프로젝트 폴더에 Debug 폴더에 가면 WebSetup.msi 파일이 생성되어 있을 것이다.
(Release 모드로 빌드를 했다면 Release 폴더에 생성)
6. 생성된 WebSetup 파일을 실행하여 설치를 진행을 한다.
설치시 경로는 크리스탈 리포트를 호출하여 사용하는 웹사이트의 경로에 설치를 하고 설치 가상 디렉토리는
크리스탈 리포트 프로젝트 생성할 때 만든 이름으로 생성하여야 한다.(<그림7> 참고)
설치시 <그림8>에서 보는 것처럼 DLL 등록실패 에러가 뜨는데 크리스탈 리포트가 설치가 안된 서버에서
DLL을 등록하기 위한 부분인데 이미 크리스탈 리포트가 설치되어 있는 상태에서 실행을 하였기 때문에
뜨는 에러이기 때문에 여기서는 그냥 계속을 눌러서 설치 완료를 한다.
<그림7> WebSetup 설치 경로 설정
<그림8> DLL 등록 실패 에러.
7. 설치가 완료된 후 해당 폴더에 보면 기존 웹사이트 폴더에 설치한 CR 폴더가 위치해 있는 걸 볼 수 있다.
(<그림9> 참고)
이 상태에서 실행시 자바스크립트 에러가 발생하는 경우가 있는데 이때에 CR 폴더와 동일한 레벨 위치에
IIS 사이트 루트(interpub\wwwroot\) 폴더 아래에 위치한 aspnet_client 폴더를 복사해와서 두면 된다.(<그림10> 참고)
<그림9> 설치 후 모습
<그림10> aspnet_client 폴더 위치
이상으로 Crystal Reports 2008(크리스탈 리포트 2008)의 웹 배포 방법에 대한 설명을 마친다.
※ 설명이 제대로 되었는지는 모르겠습니다. 3주간 삽질하다가 아래 직원이랑 같이 찾아본 결과 겨우 배포방법을 찾아서 이번에 진행하는 프로젝트에 적용을 하면서 정리를 한다고 했는데 이게 다른 프로젝트에도 제대로 배포가 될지는 모르겠네요. 일단 현재 진행중인 프로젝트에서는 잘 실행이 되는군용~^^;
크리스탈 리포트 2008 Trial 버전으로 작업을 하였는데 프로젝트를 제안한 곳에서 정식CD를 구매를 하긴 했는데 크리스탈 리포트 원제작사가 SAP이란 회사에 합병되면서 CD 발송이 늦어지고 있다고 하네요.
주문은 7월말에 했는데 아직 도착을 안하고 있다는 ㅡㅡ^
정식CD에 배포와 관련한 메뉴얼이 있을지는 모르겠지만 만약에 있다면 욕나올 듯 합니다 ㅡㅡ;
어찌됐든 배포 성공해서 프로젝트 종료가 가능했네요. 후~
죄송합니만, 혹시 아래와 같은 에러가 뜨면서 엑세스 파일을 열수없는 문제는 왜 발생하는 걸까요? CR은 2008버전을 쓰고 있고 오피스는 2003, sp3 사용하고 있으며 엑세스 파일자체에 암호는 걸지 않았습니다. 질문하는 곳은 아닌것 같은데.. 급한 마음에.. 죄송합니다.
Error Message in Crystal Report
Logon Failed.
Details: DAO Error Code: 0xbd5
Source: DAO.DbEngine
Descriptiion: Not a valid account name or password
헉..요즘 블로그 관리를 못하고 있는지라 이제써야 질문을 봤네요. 죄송합니다 ㄷㄷ; 요즘 바쁜 시즌이라 ^^;
이글을 작성한지가 2년전이라 기억은 잘 안나는데 작업 당시에 Visual Sudio 2005로 작업을 하였던걸로 기억합니다.
아마 Visual Sudio 2008로 작업시에는 해당 버전에 맞는 걸로 작업하셔야 할 듯 합니다.
명확한 답변을 드리지 못해서 미안하네요 ^^;;
Public Const BUFFERSIZE = 255
Public Const INTERNET_FLAG_PASSIVE = &H8000000
Public Const FTP_TRANSFER_TYPE_BINARY = &H2
Public Const FTP_TRANSFER_TYPE_ASCII = &H1
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Long
Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
Public Declare Function FtpOpenFile Lib "wininet.dll" Alias "FtpOpenFileA" (ByVal hFtpSession As Long, ByVal sBuff As String, ByVal Access As Long, ByVal Flags As Long, ByVal Context As Long) As Long
Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToRead As Long, dwNumberOfBytesRead As Long) As Integer
Public Declare Function InternetWriteFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToWrite As Long, dwNumberOfBytesWritten As Long) As Integer
Public hOpen As Long
Public hConnection As Long
Public hFile As Long
Public dwType As Long
Public dwSeman As Long
' FTP서버 접속
Public Function FtpOpen(strIP As String, strPort As String, strUser As String, strPassword As String) As Boolean
'기존에 이미 접속되어 있으면 기존 접속 종료
If hConnection <> 0 Then InternetCloseHandle hConnection
If (InternetWriteFile(hFile, Data(0), BUFFERSIZE, Written) = 0) Then Exit Function
DoEvents
Sum = Sum + BUFFERSIZE
objTarget.PBar.Value = Sum
DoEvents
Next
Get #1, , Data
If (InternetWriteFile(hFile, Data(0), lonSize Mod BUFFERSIZE, Written) = 0) Then Exit Function
Sum = Sum + (lonSize Mod BUFFERSIZE)
lonSize = Sum
Close #1
InternetCloseHandle (hFile)
FTPUpload = True
End If
End Function
4. 접속 종료
'FTP접속종료
Public Sub FtpClose()
If hConnection <> 0 Then InternetCloseHandle hConnection
hConnection = 0
End Sub
5. 기능 사용예
If FtpOpen(FTP 접속 IP, FTP 접속 Port, FTP 접속 사용자 이름, FTP 접속 비밀번호) = False Then
MsgBox "FTP 서버접속 실패!", vbCritical, "확인"
Exit Sub
End If
If FTPUpload(업로드할 로컬 파일, 원격 서버 파일, ProgrssBar를 가지고 있는 폼 객체) = False Then
MsgBox "FTP 서버전송 실패!", vbCritical, "확인"
End If
Call FtpClose
MsgBox "전송 완료"
Unload frmProgress
※ 테스트시 유의할점
테스트를 위해서 기본 폼 외에 ProgressBar를 가지고 있는 폼을 따로 생성해두어야 합니다.
따로 폼 생성을 하기 싫으면 함수 모듈 중 FTPUoload 함수 마지막 인자를 없애고
FTPUpload 함수 내 objTarget 객체를 삭제를 하여 사용을 하시기 바랍니다.
// GridView 헤더 클릭할 때마다 정렬 방향 설정
if (GridViewSortDirection == SortDirection.Ascending)
{
GridViewSortDirection = SortDirection.Descending;
SortGridView(sortExpression, "DESC"); // 현재 클릭한 헤더 정보와 정렬 방향(DESC) 정보를
// Sorting 처리 함수에 전달
}
else
{
GridViewSortDirection = SortDirection.Ascending;
SortGridView(sortExpression, "ASC"); // 현재 클릭한 헤더 정보와 정렬 방향(ASC) 정보를
// Sorting 처리 함수에 전달
}
}
// 정렬 방향 설정
private SortDirection GridViewSortDirection
{
get
{
if (ViewState["sortDirection"] == null)
ViewState["sortDirection"] = SortDirection.Ascending;
- TemplateField : 사용자 정의 필드
- EditItemTeamplate : 편집 상태일 때 보여줄 필드
- ItemTemplate : 편집 상태가 아닌 일반 화면일 때 보여주는 필드
- OnRowDeleting : GridView에 선택 행 삭제할 때 발생하는 이벤트
- OnRowEditing : GridView에서 편집 버튼을 클릭했을 때 발생하는 이벤트
- OnRowUpdating : GridView에서 Update 버튼을 클릭했을 때 발생하는 이벤트
- OnRowCancelingEdit : GridView에서 편집 취소 버튼을 클릭했을 때 발생하는 이벤트
3.2 3.1에 정의한 각 이벤트에 대한 이벤트를 aspx.cs 소스에 정의
// GridView 편집 전환
protected void gridDetail_RowEditing(object sender, GridViewEditEventArgs e)
{
gridDetail.EditIndex = e.NewEditIndex; // 현재 편집을 선택한 행의 Index 설정
gridDetail.DataSource = GetDataSet(); // DataSet 객체 얻어와서 GridView 객체에 설정
gridDetail.DataBind(); // GridView를 다시 재바인딩
}
// GridView 데이터 수정
protected void gridDetail_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int idx = e.RowIndex; // 현재 수정버튼을 클릭한 행의 Index를 얻어옴
// 다음과 같이 GridView의 해당 Index에 대한 데이터를 얻어옴
String data = ((TextBox)gridDetail.Rows[idx].FindControl("data")).Text;
// DB에 저장하는 코드 부분을 이곳에 정의
gridDetail.EditIndex = -1; // 처리 후 -1로 설정하는 이유는 저장 처리 후 다시 일반화면으로
// 전환하기 위함.
gridDetail.DataSource = GetDataSet(); // DataSet 객체 얻어와서 GridView 객체에 설정
gridDetail.DataBind(); // GridView를 다시 재바인딩
}
gridDetail.DataSource = GetDataSet(); // DataSet 객체 얻어와서 GridView 객체에 설정
gridDetail.DataBind(); // GridView를 다시 재바인딩
}
// GridView Row 삭제 이벤트
protected void gridDetail_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int idx = e.RowIndex; // 현재 삭제 버튼을 클릭한 행의 Index를 얻어옴
// 다음과 같이 GridView의 해당 Index에 대한 데이터를 얻어옴
String data = ((TextBox)gridDetail.Rows[idx].FindControl("data")).Text;
// DB에서 삭제하는 코드 부분을 이곳에 정의
gridDetail.EditIndex = -1; // 처리 후 -1로 설정하는 이유는 저장 처리 후 다시 일반화면으로
// 전환하기 위함.
gridDetail.DataSource = GetDataSet(); // DataSet 객체 얻어와서 GridView 객체에 설정
gridDetail.DataBind(); // GridView를 다시 재바인딩
}
private DataSet GetDataSet()
{
// SQL Connection 개체 생성
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MATL_DBConnectionString"].ConnectionString);
이번에 프로젝트 투입이 되면서 처음 접하게 된 언어가 있다. 바로 Adobe사의 Flex란 언어이다.
그동안 자바, JSP로만 웹 개발만 해오다 새로운 걸 접하니 생소하고 두렵기도 하고 해서 예제로 배우는 Adobe FLEX란 책을 구매하여 공부하는 중이다.
그런데 구글 날씨 API를 이용한 날씨 정보 유틸은 이 책에 제일 뒤쪽 부록으로 간략하게 설명이 되어 있는 AIR란 걸 이용하여 만들었다.
에어(AIR)란 Adobe사에서 아폴로(Apollo)란 이름으로 진행했던 프로젝트의 정식 명칭이다.
에어는 윈도우 데스크탑 버전의 RIA 어플리케이션을 작동하게 하기 위한 운영체제 호환, 디바이스 호환이 가능한 런타임이다.
기존의 FLEX가 웹브라우저에서 동작하는 어플리이케이션이고 로컬 자원에 접근하기가 힘든 반면
에어는 웹브라우저가 아닌 윈도우에서 실행이 되고 로컬 자원에 접근할 수 있다는 장점이 있다.
대강 에어가 이렇다는 걸 상기하고 기존 플렉스(FLEX)를 개발해봤던 사람이면 에어 어플리케이션을 쉽게 제작 가능하다.
왜냐하면 실행되는 환경이 다를 뿐 개발 방식은 똑같기 때문이다. 설명은 여기까지 하고 구글 날씨 API를 이용하여 개발한 소스를 첨부한다.
public function resultHandler(event:ResultEvent):void {
var resultAC:ArrayCollection = (event.result.xml_api_reply.weather is ArrayCollection) ?
event.result.xml_api_reply.weather as ArrayCollection :
new ArrayCollection(ArrayUtil.toArray(event.result.xml_api_reply.weather));
// 이미지 파일을 가져올 때
// 사용법 : http://localhost/Default.aspx?fileName=test.jpg
protected void Page_Load(object sender, EventArgs e)
{
Byte[] arrBytes = null; // 파일을 바이트로 읽기 위한 변수
string fileName = null; // 파일명을 받을 변수 선언
// Content Type을 반드시 image/jpeg 혹은 image/gif 등의 image 유형으로 지정
Response.ContentType = "image/jpeg";
arrBytes = new Byte[1000000];
FileStream fs = null; // 파일을 읽이위한 파일 스트림 선언
fileName = Server.UrlDecode(Request["fileName"]);
String imgFileName = Server.MapPath("이미지 파일이 있는 경로명" + fileName);
fs = new FileStream(imgFileName, FileMode.Open, FileAccess.Read, FileShare.Read);
With objDS.Tables("code")
For intCount = 0 To .Rows.Count - 1
cbRelate.Items.Add(.Rows(intCount).Item("c_code").ToString & " : " & .Rows(intCount).Item("c_value").ToString)
Next
End With
Call DB_DISCONNECT()
Else
MessageBox.Show("DB 연결을 확인하십시오!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
- "Provider=PostgreSQL OLE DB Provider;Data Source=DB서버 주소;location=DB명;User ID=아이디;password=비밀번호"
2. DB 연결 함수
Private gOleDBConn As OleDb.OleDbConnection
Public objDA As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter()
Public objDS As DataSet = New DataSet()
Public strCmd As OleDb.OleDbCommand = New OleDb.OleDbCommand()
Public Function DB_CONNECT() As Boolean
Dim strConn As String = "Provider=PostgreSQL OLE DB Provider;Data Source=DB서버 주소;location=DB명;User ID=아이디;password=비밀번호"
Try
If gOleDBConn Is Nothing Then
gOleDBConn = New OleDb.OleDbConnection(strConn)
gOleDBConn.Open()
Else
If gOleDBConn.State = ConnectionState.Open Then
ElseIf gOleDBConn.State = ConnectionState.Closed Then
gOleDBConn = New OleDb.OleDbConnection(strConn)
gOleDBConn.Open()
End If
End If
Catch ex As Exception
Console.WriteLine(ex.Message)
If gOleDBConn.State = ConnectionState.Closed Then
DB_CONNECT = False
MsgBox("데이터베이스 접속 실패!", MsgBoxStyle.Critical, "Error")
Else
DB_CONNECT = True
End If
End Try
DB_CONNECT = True
End Function
3. DB 연결 해제 함수
Public Function DB_DISCONNECT() As Boolean
Try
If gOleDBConn.State = ConnectionState.Open Then
objDA.Dispose()
objDS.Dispose()
strCmd.Dispose()
gOleDBConn.Close()
ElseIf gOleDBConn.State = ConnectionState.Closed Then
MsgBox("데이터 베이스가 이미 연결 해제 상태입니다!", MsgBoxStyle.Critical, "Error")
End If
Catch ex As Exception
Console.WriteLine(ex.Message)
If gOleDBConn.State = ConnectionState.Open Then
objDA.Dispose()
objDS.Dispose()
strCmd.Dispose()
gOleDBConn.Close()
End If
End Try
If intCount = -1 Then
MessageBox.Show("데이터 입력 성공", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("데이터 입력 실패!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Call DB_DISCONNECT()
Else
MessageBox.Show("DB 연결을 확인하십시오!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
if (ds.Tables.Count != 0)
{
if (ds.Tables[0].Rows.Count != 0)
{
check = true;
DataView dv = new DataView(ds.Tables[0]);
SaveDataView2Excel(dv);
}
else
{
check = false;
}
}
if (!check)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("<script type='text/javascript'>alert('검색된 결과가 없습니다.'); </script>");
// Report 문서 경로 설정
rptdoc.ReportDocument rpt = new rptdoc.ReportDocument();
rpt.Load(Server.MapPath("리포트 파일 경로명"), OpenReportMethod.OpenReportByDefault);
// 파라메터 전송을 위한 개체 정의
rptdoc.ParameterFieldDefinition pfd;
ParameterValues pvals;
ParameterDiscreteValue pdv;
// 파라메터 설정 - 파라메터 설정은 리포트에서 필요로 하는 파라메터만큼 만들어준다.
pfd = rpt.DataDefinition.ParameterFields["@iType"];
pvals = new ParameterValues();
pdv = new ParameterDiscreteValue();
pdv.Value = "S1";
pvals.Add(pdv);
pfd.ApplyCurrentValues(pvals);
if (!currentTitleOfCourtesy.Equals(row["TitleOfCourtesy"].ToString())) { returntrue; } if (!currentLastName.Equals(row["LastName"].ToString())) { returntrue; } if (!currentFirstName.Equals(row["FirstName"].ToString())) { returntrue; } if (!currentTitle.Equals(row["Title"].ToString())) { returntrue; } if (!currentExtension.Equals(row["Extension"].ToString())) { returntrue; }
returnfalse;
}
--> 버튼 클릭하였을 때 현재 변경된 부분을 보관해둔 ViewState의 값과 비교하여 다른 부분만 GridView를업데이트 처리 음...근데 대충 정리를 하다보니 이것도 내가 원하는 방식이 아니네 일단 이건 SqlDataSource를 사용하고 GridView 설정을 하면서 Update 쿼리문을 지정을 해주어야 한다. 지금 프로젝트에서는 일반 업데이트 쿼리가 아니라 저장 프로시져를 사용하는 거라 조금 다르게 작업을 해야겠네....일단 이런 방법으로 하는 거라 생각만 해두고 작업이 완료되면 다시 따로 정리할 예정.
GridView에서 특정 버튼을 눌러서 행추가를 할려고 근 1주일넘게 삽질을 하다가 하나의 꼼수를 생각해냈다 --;;
여기저기 자료를 찾아보니
SqlDataSource를 사용하면 insert() 함수로 간단히 추가가 가능한 거 같은데
살펴보니 내가 원하는 방식은 아니다.
내가 원하는 방식은 따로 버튼을 두어 해당 버튼이 클릭이 되면 행이 추가가 되도록 하고 싶었는데
머리가 둔한건지 근 1주일 넘게 삽질하다 생각해낸게 아래 소스 방식이다 ㅡ,.ㅡ
하아~ 벌써 끝날 프로젝트인데 종료가 안된 상황에서 다른 프로젝트 투입되느라 작업시간도 없거니와
ASP.Net은 이번에 처음 만지는거라 작업시간이 오래 걸리네 (원래 난 JSP, JAVA만 쭈욱 해왔다;;)
1. 행추가 꼼수를 위해 aspx 소스 아무 위치에 HiddenField를 다음과 같이 하나 둔다.
private void insertRow()
{
int curRowCnt =
int.Parse(((HiddenField)Master.FindControl("MainContent").FindControl("rowcnt")).Value);
// Create a DataTable
DataTable table = new DataTable();
// Create a DataColumn and set various properties
DataColumn column1 = new DataColumn();
column1.DataType = Type.GetType("System.String");
column1.AllowDBNull = true;
column1.Caption = "ITEM";
column1.ColumnName = "ITEM";
// Add the column to the table
table.Columns.Add(column1);
for (int i = 1; i <= 12; i++)
{
DataColumn column2 = new DataColumn();
column2.DataType = Type.GetType("System.Decimal");
column2.AllowDBNull = true;
column2.Caption = i.ToString();
column2.ColumnName = i.ToString();
table.Columns.Add(column2);
}
// Add Row and set values
DataRow row; for (int i = 0; i < curRowCnt; i++) { row = table.NewRow(); row["ITEM"] = "";
for (int j = 1; j <= 12; j++) {
row[j] = 0; }
// Be sure to add the new row to the // DataRowCollection. table.Rows.Add(row); }
--> 위 소스에 대해서 간략하게 설명을 하면 행추가 버튼을 클릭을 하면 HiddenField인 rowcnt를 1씩 증가시키고 그 값을 insertRow() 함수 빨간색 부분 첫번째 for문에서 사용한다.
행추가 버튼을 눌러 증가된 rowcnt만큼 반복하면서 행을 하나씩 추가한다.
아무리 생각해도 허접한 삽질소스이지만 일단 원하는 행추가는 되니까 뭐 일단은 이렇게라도 쓰자;;
항상 배우려고하는데..오호 볼때마다 어려운 컴퓨터의 세계입니다..ㅠ.ㅠ
ㅎㅎㅎ 뭐 시작하기전엔 어렵다 생각하지만 스타트를 끊으면 어렵지 않아요~
회사에 누군가가 파폭을 깔아놨길래
써봤는데 매우 안정적이더군요. 에러도 잘안나고^^;
그간 잘지내셨는지요.
요새 통 포스팅도 없으시구^^;
좋은 하루되세요~
파폭이 좋죠. 크롬도 이번에 3.0이 되면서 빨라졌다고 하고 ^^; 그래도 아직까진 플러그인이 많은 파폭이 좋네요. ㅎㅎ
포스팅이야 자주 해야되는데...전 라이너스님 글이 안올라오길래 잠시 쉬시나 했어요;;;
알고 봤더니 아침에 RSS에 글이 많길래 안읽고 그냥 읽은 글 처리해버렸더니 항상 글을 못보네요 ^^;;;
라이너스님도 즐거운 하루 되시길 ^^
좋은 작품 잘 감상하오며
즐거운 오후 시간으로 승리하시길
사랑합니다 행복하세요!!
방문 감사합니다. 테리우스원님도 오늘 하루 마무리 잘하세요 ^^
fantast 2010.11.17 06:27
안녕하세요. 웹페이지 하나를 수정하면서 css를 사용해서 풀다운 메뉴를 만들었습니다. 그런데 ie에서는 잘 되는데 fire fox에서는 깨져서 나와서 알아보려고 웹서핑을 하다가 이곳까지 왔네요. 근데 윗 글을 읽어도 무슨 말인지 잘 모르겠습니다. 저에게 도움을 주실수 있으시겠어요? 감사합니다. 이메일 연락 기다릴께요. ffantast@hotmail.com 감사합니다.
메일로 답변드렸는데 아마 제가 쓴 글의 내용과는 다를 듯 합니다.
메일 확인하세요 ^^