2017-04-23 6 views
0

MySQL 데이터베이스에서 일부 데이터를 읽는 Windows Forms 응용 프로그램 (C#)이 있습니다. 새 버전에서는 몇 가지 기능을 추가하기 위해 테이블 ​​중 하나에 새 열을 추가해야했습니다. 때로는 덤프 파일에서 데이터베이스를 복원해야합니다. 새 열이없는 이전 데이터베이스에서 이전 테이블을 복원하면 "알 수없는 열"오류가 발생합니다.열이있는 경우 값이 NULL이 아니면 NULL

이 테이블의 데이터를 선택하려면 SQL 명령을 어떻게 변경해야합니까? 'newcolumn'이 존재하면 데이터를 선택해야합니다. 그렇지 않으면 NULL을 선택해야합니다.

MySqlDataAdapter da = new MySqlDataAdapter(
     "SELECT my_id AS Id,myColumn1 AS Column1,myColumn2 AS Column2, 
     newcolumn AS NewColumn (here IF NOT EXIST = NULL)", connection); 
da.Fill(izpis_podatkov); 

고맙습니다!

+1

먼저 유효한 구문으로 SQL 문을 사용해보십시오. –

+0

죄송합니다. 문제가 발생한 부분을 명확히하기위한 것이 었습니다 ... 분명히 응용 프로그램에서 구문을 작동 시켰습니다. 나는 내가 원하는 것을 할 수있는 방법이 있는지 물어 보았습니다 ... – user1080533

답변

1

데이터베이스를 복원하지만 코드를 그대로두면 코드와 데이터베이스 스키마가 일치하지 않습니다. 가장 간단한 옵션은 복원 후에 누락 된 열을 추가하도록 테이블을 변경하는 것입니다. 예 :

ALTER TABLE yourtable ADD newcolumn VARCHAR(255) 

분명히, 테이블, 열 이름 및 데이터 형식을 상황에 맞는 적절한 값으로 변경하십시오.

편집 :

가없는 경우 당신은 칼럼의 존재를 확인하고 추가 할 수 당신이 실제로 저장 프로 시저를 작성하여 무엇을 요구 가까이 뭔가를 할 수 :

CREATE PROCEDURE `MyStoredProc`() 
BEGIN 
    IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = `db_name` AND TABLE_NAME = `newtable` AND COLUMN_NAME = `newcolumn`) 
    BEGIN 
     ALTER TABLE 'newtable' ADD 'newcolumn' VARCHAR(255) NULL; 
    END 

    SELECT my_id AS Id, myColumn1 AS Column1, myColumn2 AS Column2, newcolumn AS NewColumn FROM newtable; 
END 
그런 다음 호출하여 C# 코드를 변경하려면이 저장 프로 시저해야

:

command = new MySqlCommand(procName, connection); 
da = new MySqlDataAdapter(command); 
command.ExecuteNonQuery(); 
da.Fill(izpis_podatkov); 

내가 MySQL을 모르는를 그 잘 저장 프로 시저 구문을 먼저 확인하십시오!

+0

그래, 내가해야 할 것이라고 생각했는데 ... 열이 존재하는지 확인하고 복원 된 데이터베이스에 새 열을 추가하지 않을지 확인합니다.내 아이디어가 MySQL에서 가능할 지 궁금합니다. :) – user1080533

+0

@ user1080533 당신이 요구 한 것에 더 가까운 대안을 제시하기 위해 답을 편집했습니다. 이게 도움이 되길 바란다. – swatsonpicken

0

테이블에서 존재하지 않는 컬럼을 언급하는 MySQL에서 SQL 데이터 조작 언어 (SQL Data Manipulation Language) 쿼리를 사용할 수 없습니다. MySQL 서버의 쿼리 계획자는 IFNULL()과 같은 조건부 컨텍스트에 나타나더라도이를 거부합니다. 그들은 하나의 테이블 인 것처럼

당신은 너무

  SELECT myColumn1, myColumn2, newColumn 
      FROM newTable 
      UNION ALL 
     SELECT myColumn1, myColumn2, NULL as newColumn 
      FROM oldTable 

이것은 newTable의 행과 oldTable의 행을 다시 줄 것처럼 UNION ALL 작업을 사용할 수 있습니다. 기본적으로 두 개의 테이블을 UNION 뒤에 숨기고, 동일한 레이아웃을 가진 것처럼 보이며 누락 된 열의 별칭을 oldTable으로 만듭니다.

그런 다음 oldTable을 백업에서 복원하는 경우 newTable을 잘라내어 (모든 행을 제거합니다) 애플리케이션에서 의미가있는 경우 잘라낼 수 있습니다.

CREATE VIEW 문에 표시된 쿼리를 사용할 수 있습니다. 그러면 프로덕션 소프트웨어에서이를 table 인 것처럼 볼 수 있습니다.

CREATE VIEW table AS 
     SELECT myColumn1, myColumn2, newColumn 
      FROM newTable 
      UNION ALL 
     SELECT myColumn1, myColumn2, NULL as newColumn 
      FROM oldTable;