2017-04-23 10 views
0

私は、MySQLデータベースからいくつかのデータを読み込むWindowsフォームアプリケーション(C#)を持っています。新しいバージョンでは、テーブルの1つに新しい列を追加する必要がありました(機能を追加するため)。場合によっては、ダンプファイルから復元データベースを作成する必要があります。古い列のテーブルを元のデータベースから復元すると、「不明な列」というエラーが表示されます。カラムから選択する値が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) 

明らかに、表、列名、およびデータ型を状況に応じた適切な値に変更します。

EDIT:

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#のコードを変更する必要があります:私は、MySQLにそれを知らない

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

をさて、まずストアドプロシージャの構文を確認してください!

+0

はい、私はこれをやろうと思っていました...カラムが存在するかどうか、リストアされたデータベースに新しいカラムを追加しないかどうかをチェックします。私のアイディアがMySQLで可能かどうか疑問に思っていました。 :) – user1080533

+0

@ user1080533私はあなたが求めているものに近い選択肢を与えるための答えを編集しました。私はこれが役立つことを願っています – swatsonpicken

0

テーブル内に存在しない列を記述するSQLデータ操作言語クエリをMySQLで使用することはできません。 MySQLサーバのクエリプランナは、IFNULL()のような条件文脈で表示されても拒否します。

彼らは、単一のテーブルであるかのように

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

これはnewTableの行とoldTableの行をあなたに戻って得られますようにあなたは、UNION ALL操作を使用することができます。基本的にUNIONの背後にある2つのテーブルを隠し、それらが同じレイアウトになっていると思われ、見つからない列のエイリアスを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; 
関連する問題