2017-04-23 32 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; 
相关问题