programing

작업은 Excel 시트를 업데이트할 때 업데이트 가능한 쿼리를 사용해야 합니다.

abcjava 2023. 6. 20. 21:19
반응형

작업은 Excel 시트를 업데이트할 때 업데이트 가능한 쿼리를 사용해야 합니다.

Excel 시트를 업데이트할 때 다음 오류가 발생합니다.

Server Error in '/ReadExcelData_Csharp' Application.
Operation must use an updateable query. 

그리고 제가 사용하고 있는 코드는 다음과 같습니다.

  querys = "UPDATE [Sheet1$] "+"SET [Number]=" +s.Trim()+ " WHERE [Number]=" + s2.Trim() ;
  objcmc = new OleDbCommand(querys, conn);
  objcmc.ExecuteNonQuery();

어떤 도움이든 감사하겠습니다.

그리고 내가 사용한 연결은 다음과 같습니다.

if (strFileType.Trim() == ".xls")
            {
                connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strNewPath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
            }
            else if (strFileType.Trim() == ".xlsx")
            {
                connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strNewPath + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
            }

연결 문자열에서 IMEX=2(또는 IMEX=1)를 제거하면 작동합니다.이 미친 솔루션을 여러 번 테스트했는데 이상한 이유로 IMEX를 제거하는 것이 효과가 있는 것 같습니다(적어도 xlsx 파일의 경우).

다음 코드가 작동합니다.

    static void Main(string[] args)
    {
        string connectionString  = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + "d:\\temp\\customers.xlsx" + ";Extended Properties=\"Excel 12.0;ReadOnly=False;HDR=Yes;\"";
        string selectString = "INSERT INTO [Customers$](Id,Company) VALUES('12345', 'Acme Inc')";

        OleDbConnection con = new OleDbConnection(connectionString);
        OleDbCommand cmd = new OleDbCommand(selectString, con);

        try
        {
            con.Open();
            cmd.ExecuteNonQuery();
            Console.WriteLine("Success");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            con.Dispose();
        }
        Console.ReadLine();
    }
}

social.msdn.microsoft.com 의 RobertNet 덕분입니다.

위에 제공된 솔루션을 사용하여 연결 문자열에서 IMEX=2 또는 IMEX=1 문자열을 제거했습니다.하지만 이것으로는 충분하지 않았습니다.저의 경우, 솔루션에 대한 추가적인 해결책이 필요했습니다.

하지만 제 데이터베이스에는 IMEX가 필요했습니다. 왜냐하면열에는 혼합 데이터 유형이 있고 일부는 문자열 값을 이중으로 값기 때문입니다.IMEX = 1을 제거하면 열에서 가장 인기 있는 값을 기준으로 열 데이터 유형을 자동으로 선택한 다음 선택한 유형이 아닌 값을 캐스트하지 못하기 때문에 런타임 예외 "유형의 개체를 캐스트할 수 없습니다"가 표시됩니다.

나는 나의 이중값과 int값을 문자열 값으로 변경하고(excel에서 셀 값의 시작 부분에 수동으로 '를 추가함), 연결 문자열에서 IMEX를 제거함으로써 이 문제를 해결했습니다.

저 같은 경우에는 제가 변했어요.ConnectionString그리고 이것이 문제를 해결했습니다.
제거했습니다.ReadOnly=False;HDR=Yes;의 매개 변수.connectionString

string _connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;\";", pathToExcelFile);

제 문제는 이전 연결에서 엑셀 파일이 읽기 전용 모드로 잠겨 있었다는 것입니다.연결을 끊어야 합니다.

언급URL : https://stackoverflow.com/questions/7622492/operation-must-use-an-updateable-query-when-updating-excel-sheet

반응형