web-dev-qa-db-ja.com

MVC4:実行時にモデルを作成する方法は?

私のプロジェクトでは、テーブル名(extudentなど)を指定して動的にテーブルを作成し、そのテーブルにフィールドを追加して、テーブルを保存しています。これで、SQL Serverデータベースにテーブルが作成されました。

テーブルにデータがあり、WebGridにテーブル(ex Student)のデータを表示したいとします。しかし、問題はそのテーブル(例:学生)のモデルがないことです。では、新しく作成したテーブルのモデルを作成する方法、またはWebGridにデータを表示する方法を教えてください。

3
Vicky

それをしないでください

実行時にテーブルスキーマを変更するべきではありません。あらゆる種類の問題が発生する可能性があります。予約された単語であることが判明した列を作成しようとする可能性があります。これらの変更を行うためにユーザーに与えるアクセス権により、テーブルの削除なども可能になります。

あなたreallyは、実行時にテーブルスキーマを変更するべきではありません。それはあなたがデータベースが良いで何であるかの多くを使用していないことを意味します。

代わりにEAVテーブル構造を試してください

列が変更されて任意に作成される動的データを書き込む場合は、代わりに [〜#〜] eav [〜#〜] テーブル構造の使用を検討してください。それはよく知られており、それがどのように機能するかを理解しています。

はい、さまざまなDBAや純粋主義者はそれで大騒ぎしますが、実行時に列を追加するという提案された解決策を提案します。おそらくそれらは提供されます。そのためのモデルを作成できるライブラリを見つけることもできます(-など)。 EAV @ CodePlex )。

たぶんNoSQLから何かを試す

おそらく、リレーショナルデータベースはまったく必要ないでしょう。たぶん、あなたはドキュメントモデルを持つものを望んでいて、そこにjsonを差し込んでいるだけかもしれません。その後、モンゴまたはソファーは許容範囲内で機能します。または、Cassandraのような列指向のデータベースが必要な場合もあります。確かではありませんが、「実行時に列を作成する」というタイプの考え方を実際に実行したい場合は、検討する必要があります。

わかりました、あなたは本当にそうしています

テーブルからメタデータを取得できます。 Javaの世界では、これは ResultSetMetaData のようなものです。これにより、すべての列の詳細、列に格納されるデータのタイプ、およびその他のビットがわかります。それ。

C#では、これは DataColumn クラスに格納されているようです。スタックオーバーフローで SQLステートメントからメタデータ(テーブル名)を取得 から:

SqlConnection con = new SqlConnection(connString);
String queryString = "Select CUSTOMER_NAME from CUSTOMER_DETAIL";
SqlCommand cmd = new SqlCommand(queryString, con);
DataTable myTable = new DataTable();
myTable.Load(cmd.ExecuteReader());
DataColumn column = myTable.Columns[0];
// zero based index of column, alternatively use column name
string typeOfColumn = column.DataType.Name;
// or column.DataType.FullName to get the fully qualified name of the System.Type
7
user40980

テーブルの内容がわからない場合は、どこにも表示しないでください。クレジットカードの詳細(Yowch!)または「匿名の名前の」フィールド(Eek!)のパスワードがいっぱいの場合はどうなりますか?

そして、あなたはそれらすべてを画面上でふっくらさせて、すべてを見ることができますか?
私にとって、それは少なくとも無責任に接しています。

あなたは必要を試してみる前に、そこに何があるかを知る必要があります何かそれを使って。

あなたはデータベースにフィールドを動的に作成していると言います。 OK;それは私の本であなたのデータベースを設計する良い方法ではありませんが、それは方法です。 メタデータテーブル-データベースに追加のテーブルを作成することをお勧めします-そのdescribeアプリケーションが現在使用している実際のテーブル。あなたは(少なくとも)必要になります

  • 各実際のテーブルを説明する1つのメタデータテーブルと
  • 各実際のテーブル内の各列を記述する別のメタデータテーブル。

このメタデータcanは実行時に照会され、データベース内の各テーブルとフィールド、その内容、および表示を許可されているかどうかなどを[正確に]記述します。それはまたdocuments "インフライト"で作成されたとしても、データベースの "デザイン"です。

重要なことは、これがすべてのU.I.に組み込まれていることです。実際のテーブルを作成するために使用します。フィールドをデータベースに追加する前に、このデータを入力する(「書き留める」)必要があります。

1
Phill W.

最善の解決策ではありませんが、機能するはずです。

テーブルデータを表示するには、入力するのはテーブルの名前だけです。だからあなたはやります

string sql = "SELECT * from " + tableName;

次に、DataSetに入力し、DataSetをList<List<string>>オブジェクト この回答では のように変換します。それをviewに渡します。 viewでループして、表形式のデータを表示します。ここでの注意点は、すべてのデータ型を文字列として処理することです。

WebGridは使えないと思います

0
IsmailS