2010-12-14 4 views
0

나는 ADO.NET을 사용하여 Excel 파일을 읽을 때 오는에서 다음 방지하기 위해 노력하고있어 위해 :읽기 전용 ADO.NET 연결 문자열을 엑셀

파일을 열 수 없습니다 Microsoft Jet 데이터베이스 엔진 ' '. 이미 다른 사용자가 독점적으로 열었거나 해당 데이터를 볼 수있는 권한이 필요합니다.

나는 다른 사용자가 파일을 열었으므로 일어나는 것을 알고 있지만, 제거 할 수는 없습니다. 내 연결 문자열에 Read Only=True;을 추가하려고 시도했지만 작동하지 않습니다. 나는 또한 연결의 Mode을 읽기 전용으로 설정하려고 시도했지만 C#으로 어떻게해야하는지 알 수 없다. 도움을

Provider=Microsoft.Jet.OLEDB.4.0; data source=test.xls; Extended Properties="Excel 8.0;HDR=No;IMEX=1" 

감사 :

여기 내 연결 문자열입니다!

+0

당신은 Microsoft Jet 데이터베이스 엔진이 아닌 다른 공급자를 사용하려고 했습니까? – Alain

+0

다른 사람들이 있습니까? – zsalzbank

+0

톤이 있습니다 : http://www.connectionstrings.com/하지만 파일에서 작동하는 것은 아닙니다. 제트 공급자가 파일을 열지 못하면 구식으로 열어 보지 않으시겠습니까? '열기'와? – Alain

답변

2

독점적으로 열려있을 때뿐만 아니라 파일에 대한 권한이없는 경우 표시 될 수도 있습니다. 어쨌든 필자는 항상이 문제에 대한 최상의 해결 방법이 파일의 복사본을 새 임시 파일로 자동화하는 것이 었습니다. 사본은 대용량 파일 일지라도 거의 즉각적이므로 복사 속도가 느려서는 안되며 응용 프로그램이 읽기 전용이므로 나중에 임시 파일을 버릴 염려가 없습니다.

또한이 작업은 제거 할 수있는 사용 권한 문제를 해결합니다. 읽기 권한이 있으면 사본이 작동하고, 그렇지 않으면 어쨌든 해결 방법이 없습니다. 임시 복사본의 대상 경로를 통합 문서와 동일한 경로로 만들면 복사 된 파일에 대한 전체 사용 권한을 갖게됩니다. (Application.Path)

이렇게하려면 FileCopy srcFile, destName 명령을 사용하십시오.

+0

나는 파일에 대한 전체 액세스 권한이 있습니다.엑셀에서 파일을 수동으로 열어서 (읽기 전용 모드로 열어서) ADO.NET에 액세스하려고하면 연결할 수 있다는 것을 알게되었습니다. 나는 그것을 읽기만 열어보고 싶다 - 방법이 있어야한다. – zsalzbank

+0

그래서 나는 움찔하고 이것을 시도했지만 원본 파일은 네트워크에 있지만 매핑 된 드라이브에는 없습니다. FileCopy는 매핑되지 않은 드라이브에서 작동하지 않습니다. 파일을 여전히 복사하는 방법이 있습니까? – zsalzbank

+0

이 문제는 흥미 롭습니다. 매핑되지 않은 드라이브가 문제가있는 원래 Jet 공급자와 관련이 있는지 궁금합니다. 파일을 매핑 된 드라이브에 수동으로 복사하고 동일한 문제가 모두 발생하는지 확인할 수 있습니까? 이것은 알려진 거의 알려지지 않은 한계 중 하나 일 수 있습니다. – Alain

0

글쎄, 당신은 모드를 읽기 전용으로 변경하려고 시도했다고 하셨는데, 정확히 그렇게하셨습니까?

기본적으로 Microsoft Jet 용 OLE DB 공급자는 MSDN에 따라 Microsoft Jet 데이터베이스를 읽기/쓰기 모드로 엽니 다. 읽기 전용 모드로 데이터베이스를 열려면 ADO Connection object의 Mode 속성을 adModeRead로 설정하십시오.

그래서 C#에서이 같은 봤어야 :

ADODB.Connection myConn = new new ADODB.Connection(); 
myConn.Mode = adModeRead; //1 
myConn.Open(strConectionString, null, null, -1); 
+0

이렇게하면 연결의 데이터로 DataSet을 채울 수있는 방법이 있습니까? 감사합니다 – zsalzbank

+0

그래, 당신은'set 레코드 세트 = 연결. 실행 (CommandText, RecordsAffected, 옵션) '를 사용하여 연결을 사용하여 쿼리를 수행 할 수 있으며 당신은'OleDbDataAdapter.Fill (DataSet, RecordSet, "TableName")'명령 또는 'OleDbDataAdapter.Fill (DataSet.Table, RecordSet)'명령 – Alain

+0

샘플 코드는 다음과 같습니다. http://bytes.com/topic/c-sharp/answers/440071-filling-dataset-ado- 레코드 세트 레코드 – Alain