2017-04-23 31 views
0

我有一個Windows窗體應用程序(C#),它從MySQL數據庫中讀取一些數據。在新版本中,我需要在其中一個表中添加新列(以添加一些功能)。有時我需要製作一個恢復數據庫(從轉儲文件)。如果我從舊數據庫(沒有新列)恢復舊錶,我會收到「未知列」錯誤。如果存在,從列中選擇如果不存在值爲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數據操作語言查詢。即使MySQL服務器中的查詢規劃器出現在像IFNULL()這樣的條件環境中,它也會拒絕它。

你可以使用一個UNION ALL操作,像這樣

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

這會給你回newTable的行和oldTable的行,就好像它們是一個單一的表。它基本上隱藏了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; 
相關問題