C#을 프로그램으로 MS Access 데이터베이스에서 링크 된 테이블 업데이트

StackOverflow https://stackoverflow.com/questions/625360

문제

두 개의 액세스 2003 데이터베이스가 있습니다 (fooDb 그리고 barDb). 4 개의 테이블이 있습니다 fooDb 테이블에 연결되어 있습니다 barDb.

두 가지 질문 :

  • 테이블 내용을 어떻게 업데이트합니까 (링크 된 테이블 fooDb 테이블 내용과 동기화해야합니다 barDb)
  • 테이블을 다른 방법으로 어떻게 다시 링크합니까? barDb 사용 ADO.NET

Google이지만 도움이되는 결과를 얻지 못했습니다. 내가 알게 된 것은 VB (6)와 DAO에서 이것을 달성하는 방법이지만 C#에 대한 솔루션이 필요합니다.

도움이 되었습니까?

해결책

C#로 코딩하는 경우 액세스가 관련되지 않으며 제트기 만 있습니다. 따라서 데이터에 액세스하려는 모든 방법을 사용한 다음 업데이트를 코딩 할 수 있습니다.

이런 종류의 물건을 여러 번 액세스하여 코딩했으며 각 테이블에 대한 내 접근 방식은 다음과 같습니다.

  1. BARDB에 더 이상 존재하지 않는 FoodB에서 삭제하는 쿼리를 실행하십시오.

  2. FoodB에 아직 존재하지 않는 BARDB에있는 FoodB 레코드에 삽입되는 쿼리를 실행하십시오.

  3. 나는 항상 즉석 SQL을 작성하는 코드를 사용하여 BardB의 데이터로 FoodB 테이블을 업데이트합니다.

세 번째는 어려운 것입니다. DBA의 필드 컬렉션을 고리하고 다음과 같은 SQL을 즉시 작성합니다.

UPDATE table2 INNER JOIN table1 ON table2.ID = table1.ID
SET table2.field1=table1.field1
WHERE (table2.field1 & "") <> (table1.field1 & "")

숫자 필드의 경우 NULL을 0으로 변환하기 위해 사용 가능한 SQL 방언의 기능을 사용해야합니다. Jet SQL을 실행하면 NZ ()를 사용하지만 ODBC를 통해서는 작동하지 않습니다. 그래도 OLEDB에서 작동하는지 확실하지 않습니다.

어쨌든 요점은 행으로 행으로 행을하려고하는 대신 많은 열 단위 SQL 업데이트를 발행하는 것입니다. 이는 훨씬 덜 효율적입니다.

다른 팁

다음은 C#을 사용하여 DAO 테이블을 다시 표시하는 솔루션입니다.

내 애플리케이션은 중앙 MS 액세스 데이터베이스와 링크 된 8 개의 실제 데이터베이스를 사용합니다. 중앙 데이터베이스는 C# 앱에 로컬로 저장되지만 응용 프로그램은 8 개의 데이터 데이터베이스가 다른 곳에 위치 할 수 있습니다. 시작시 C# 앱은 app.config 설정을 기반으로 중앙 데이터베이스에서 DAO 테이블을 다시 연결합니다.

주목할 때,이 데이터베이스 구조는 앱이 원래 VB6에 포팅 한 MS 액세스 앱의 결과입니다. 현재 앱을 C#로 변환하고 있습니다. VB6 또는 C#에서 MS 액세스를 옮길 수 있었지만 Desktop DB 솔루션을 사용하기가 매우 쉽습니다.

중앙 데이터베이스에서 3 개의 열 표준 이름, LinkedTablename 및 DatabaseName이있는 LinkedTables라는 테이블을 만들었습니다.

앱 시작 시이 루틴을 호출합니다

            Common.RelinkDAOTables(Properties.Settings.Default.DRC_Data
                              , Properties.Settings.Default.DRC_LinkedTables
                              , "SELECT * FROM LinkedTables");

default.drc_data- Central Access의 현재 폴더 DB Default.drc_linkedTables- 현재 8 개의 데이터 데이터베이스의 현재 폴더

코드는 다음은 C#에서 DAO 테이블의 실제 다시 표시됩니다.

        public static void RelinkDAOTables(string MDBfile, string filepath, string sql)
    {
        DataTable linkedTables = TableFromMDB(MDBfile, sql);

        dao.DBEngine DBE = new dao.DBEngine();
        dao.Database DB = DBE.OpenDatabase(MDBfile, false, false, "");
        foreach (DataRow row in linkedTables.Rows)
        {
            dao.TableDef table = DB.TableDefs[row["Name"].ToString()];
            table.Connect = string.Format(";DATABASE={0}{1} ;TABLE={2}", filepath, row["database"], row["LinkedName"]);
            table.RefreshLink();
        }


    }

액세스 데이터베이스에서 데이터를 가져오고 데이터 가능한 것으로 반환하기 위해 작성된 추가 코드

        public static DataTable TableFromOleDB(string Connectstring, string Sql)
    {
        try
        {
            OleDbConnection conn = new OleDbConnection(Connectstring);
            conn.Open();
            OleDbCommand cmd = new OleDbCommand(Sql, conn);
            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
            DataTable table = new DataTable();
            adapter.Fill(table);

            return table;
        }
        catch (OleDbException)
        {
            return null;
        }
    }
    public static DataTable TableFromMDB(string MDBfile, string Sql)
    {
        return TableFromOleDB(string.Format(sConnectionString, MDBfile), Sql);
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top