How to fetch dynamic data for dynamic table from database? - sql-server

I am dealing with e-commerce admin panel. I designed dynamic table that lists customer details for admin panel. User can add new columns to table or remove.
So I must fetch data from database dynamically. It must just fetch data in the columns that the user selected. By using Entity-Framework, how does I fetch data dynamically? There are total 47 columns and in different tables. Also, I designed all database operations by using stored-procedures. You know that there are entity classes to execute the procedures in EF. What is the best option to solve this problem?
For example, I create a stored-procedure that execute dynamically, but I can't match with entity class in EF. Thank you.

Simply you can't do it using Entity Framework. Entity Framework have typed models (POCO). You might need a custom solution, may be try a datasource of type IDictionary<string, object> which can be converted to ExpandoObject available in C#. But that also depends if your CMS supports it.

Related

Managing multiple datasources in CakePHP

I'm planning to develop a web application in CakePHP that shows information in graphics and cards. I chose CakePHP because the information that we need to show is very structured, so the model approach makes easier to manage data; also I have some experience with MVC from ASP.NET and I like how simple is to use the routing.
So, my problem is that the multiple organizations that could use the app would have their own database with a different schema that the one we need. I can't just set their string connection in the app.php file because their database won't match my model.
And the organization datasource couldn't fit my model for a lot of reasons: the tables don't have the same name, the schema is different, the fields of my entity are in separated tables, maybe they have the info in different databases or also in different DBMS!
I want to know if there's a way to make an interface that achieves this
In such a way that cakephp Model/Entity can use data regardless of the source. Do you have any suggestions of how to do that? Does CakePHP have an option to make this possible? Should I use PHP with some kind of markup language like JSON or XML? Maybe MySQL has an utility to transform data from different sources into a view and I can make CakePHP use the view instead of the table?
In case you have an answer be as detailed as you can.
This other options are possible if it's impossible to make the interface:
- Usw another framework that can handle this easier and has the features I mentioned above.
- Make the organization change their database so it matches my model (I don't like this one, and probably they won't do it).
- Transfer the data in the application own database.
Additional information:
The data shown in graphics are from students in university. Any university has its own database with their own structure and applications using the db, that's why isn't that easy to change structure. I just want to make it as easy as possible to any school to configure their own db.
EDIT:
The version is CakePHP 3.2.
An important appointment is that it doesn't need all CRUD operations, only "reading". Hope that makes the solution easier.
I don't think your "question" can be answered properly, it doesn't contain enough information, not enough details. I guess there is something that will stay the same for all organizations but their data and business logic will be different. But I'll try it.
And the organization datasource couldn't fit my model for a lot of reasons: the tables don't have the same name, the schema is different, the fields of my entity are in separated tables, maybe they have the info in different databases or also in different DBMS!
Model is a whole layer, so if you have completely different table schemas your business logic, which is part of that layer, will be different as well. Simply changing the database connection alone won't help you then. The data needs to be shown in the views as well and the views must be different as well then.
So what you could try to do and what your 2nd image shows is, that you implement a layer that contains interfaces and base classes. Then create a Cake plugin for each of the organizations that uses these interfaces and base classes and write some code that will conditionally use the plugin depending on whatever criteria (guess domain or sub-domain) is checked. You will have to define the intermediate interfaces in a way that you can access any organization the same way on the API level.
And one technical thing: You can define the connection of a table object in the model layer. Any entity knows about it's origin but you should not implement business logic inside an entity nor change the connection through an entity.
EDIT: The version is CakePHP 3.2. An important appointment is that it doesn't need all CRUD operations, only "reading". Hope that makes the solution easier.
If that's true either use the CRUD plugin (yes, you can use only the R part of it) or write some code, like a class that describes the organization and will be used to create your table objects and views on the fly.
Overall it's a pretty interesting problem but IMHO to broad for a simple answer or solution that can be given here. I think this would require some discussion and analysis to find the best solution. If you're interested in consulting you can contact me, check my profile.
I found a way without coding any interface. In fact, it's using some features already included in the DBMS and CakePHP.
In the case that the schema doesn't fit the model, you can create views to match de table names and column names from the model. By definition, views work as a table so CakePHP searches for the same table name and columns and the DBMS makes the work.
I made a test with views in MySQL and it worked fine. You can also combine the data from different tables.
MySQL views
SQL Server views.
If the user uses another DBMS you just change the datasource in app.php, and make the views if it's necessary
If the data is distributed in different DBMS, CakePHP let's you set a datasource for each table, you just add it to app.php and call it in the table if it's required.
Finally, in case you just need the "reading" option, create a user with limited access to the views and only with SELECT privileges.
USING:
CakePHP 3.2
SQL SERVER 2016
MySQL5.7

Retrieve data from a SQL Server stored procedure into a List<T>

I have this project that I am creating a library to handle all the data from multiple projects, I have organized the queries in stored procedures. I need to pass 4 parameters to the store procedure and get back some data. I cannot believe there is no easy way to accomplish this.
I have tried the datareader, datatable I do not want to have to iterate through the data as it does have the possibility to grow large.
Thank you for your help.
I would suggest using Dapper http://code.google.com/p/dapper-dot-net/
It's a micro ORM, much faster than EF - written by and used by guys behind SO ;-)
Note: I do not want to have to iterate through the data as it does have the possibility to grow large - someone will have to iterate through the result set - either you or the framework you will be using. Consider paging if you think you might get too much data at once.
Entity Framework is nice.
Add new item > ADO.NET entity Model
Generate from database
select only the SP's, unless you want to import the table schema too.
Once it finds your SP's, it will create complex types for you and everything will be really easy.
entity Framework for the win.

Which is the recommended approach to design a data model with custom fields for a generic crm software?

I want to develop a generic CRM application using SQL Server 2008.
The application must enable custom user fields using some extension technique.
I read a lot about the different options such as:
Observable Pattern, and
Entity Attribute Value (EAV)
But unfortunately these options are difficult to implement and I understand the application performance is affected and also it's difficult to query the repository using Entity Framework Code First.
I would appreciate some other simple options to implement.
Most of the time a package extension system like this is used to add user-defined columns to existing tables.
You can allow users to define their own tables which are placed in their own (segregated) schema. Your administration UI which manages this extension process will need to run the DDL code necessary to build these user-defined tables. If they are defined as being an extension of a predefined table, your system should enforce a 1:1 relationship between the predefined and user-defined table that it extends. You could also allow free-standing user-defined tables, if you want.
Once you have your user-defined tables created, use a (predefined) mapping table to connect the user-defined tables/columns to your predefined fields in your CRM UI. If you also allow users to define UI forms and fields, then your mapping table can tie to these too/instead.

Database schema considerations for a dynamic form creation/survey web application

I'm building a web application that will essentially allow 'admins' to create forms with any number and combination of form elements (checkboxes, combo-boxes, text-fields, date-fields, radio-groups, etc). 'Users' will log into this application and complete the forms that admins create.
We're using MySQL for our database. Has anyone implemented an application with this type of functionality? My first thoughts are to serialize the form schema has JSON and store this as a field in one of my database tables, and then serialize the submissions from different users and also store this in a mysql table. Another thought: is this something that a no-sql database such as MongoDB would be suited for?
Yes, a document-oriented database such as MongoDB, CouchDB, or Solr could do this. Each instance of a form or a form response could have a potentially different set of fields. You can also index fields, and they'll help you query for documents if they contain that respective field.
Another solution I've seen for implementing this in an SQL database is the one described in How FriendFeed uses MySQL to store schema-less data.
Basically like your idea for storing semi-structured data in serialized JSON, but then also create another table for each distinct form field you want to index. Then you can do quick indexed lookups and join back to the row where the serialized JSON data includes that field/value pair you're looking for.

Should I clone or denormalize my database for portable use?

I have a database that has lots of data and is all "neat", normalized (within reason - using EAV), and I have stored procedures to access and modify the data.
I also have a WinForms application that users download to search and view this data (no inserts). To make things handy for use and updates, I've been using SQLite to store this data and it works really well.
I'm working on updating the entire process and I was wondering if I should use a denormalized view of the data to ship out to the users, ala the 1 table with all the properties as columns, or continue to use the same schema as the master database?
My initial thoughts are along the lines of :
Denormalized View:
Benefits...
Provides a simple method of querying the data (since I'm not doing a lot of joins, just a bunch of column searching.
Cons...
I'd have to manage a second data access layer. Granted I don't think it will be difficult, but it is still a bit more work.
If a new property is added, I'd have to modify the schema again and accomodate for the changes. Wheras I can simply query the property bag and work form there.
Same Schema:
Pros...
Same layout as master database, so updates are minimal, and I can even use the same queries when building my Data Access Layer since SQLite doesn't support stored procedures.
Cons...
There is a lot of small tables for lookup codes and the like, so I could start running into issues when building the queries and managing it in the DAL.
How should I proceed?
If you develop your application to query views of the data rather than the underlying data itself, you will be able to keep the same database for both scenarios without concern or the need to alter your DAL.

Resources