Introduction

Dynamic generate OData Controller from SQL Server. It expose the database to client through web API. Through this generated web API, client can query/insert/delete/update the database table , invoke the stored procedure, query the view and table-valued function.
the web API is followed the OData protocol (http://www.odata.org/)

Install

Database setup

In your database execute the database initial script, the initial script locate at folder ‘Sql/initialScript/’ https://github.com/maskx/OData/tree/master/maskx.OData/maskx.OData/Sql/initialScript/v2012

those scripts will create the stored procedures query the database schema for build web API ~ Note those scripts is for SQL server 2012 and beyond, and for SQL Server 2008, you should use the scripts in v2008 folder, it will need you do more configure. ~

WebApi setup

Create a web API project

Install odata nuget package

https://www.nuget.org/packages/maskx.OData/

Configure the controller

 configuration.Routes.MapDynamicODataServiceRoute("odata","odata");
 DataSourceProvider.AddDataSource(new maskx.OData.Sql.SQLDataSource("db");

the “db” is database connection string key in web.config

Configure database connection string in web.config

   <connectionStrings>
    <add name="db" connectionString="Data Source=.;Initial Catalog=<your database>;Integrated Security=True" />
  </connectionStrings>

Usage

now you can access the database object through the web API. you can visit this page for basic OData knowledge http://www.odata.org/getting-started/understand-odata-in-6-steps/

Table

Query

  $.get('odata/db/<table>').done(function (data) {alert(data.value) });

you can user $filter, $orderby, $top, $skip, $count query option restricts the set of items returned

Insert

  $.post('odata/db/<table>',{
    'col1':'col1 value',
    'col2':'col2 value',
    ...
  }).done(function (data) {alert(data.value) });

Update

  $.ajax({
    url:'odata/db/<table>(<ID>)',
    type:'PUT',
    data:{
      'col1':'col1 value',
      'col2':'col2 value',
      ...  
    }
  }).done(function (data) {alert(data)});

Merge

$.ajax({
    url:'odata/db/<table>(<ID>)',
    type:'PATCH',
    data:{
      'col1':'col1 value',
      'col2':'col2 value',
      ...  
    }
  }).done(function (data) {alert(data)});

Delete

  $.ajax({
    url:'odata/db/<table>(<ID>)',
    type:'DELETE'
  }).done(function (data) {alert(data) });

View

for view, only can query support

    $.get('odata/db/<view>').done(function (data) {alert(data.value) });

Stored procedure

 $.post('odata/db/<Stroed procedure name >()',{
    'par1':'par1 value',
    'par2':'par2 value',
    ...
  }).done(function (data) {alert(data) });
  

Table-valued function

   $.get('odata/db/<table-valued function name>()').done(function (data) {alert(data.value) });

Security

SQLDataSource has a BeforeExcute property, you can judge user’s permission in there

DataSourceProvider.AddDataSource(new maskx.OData.Sql.SQLDataSource(<DataSourceName>)
 {
   BeforeExcute = (ri) =>{
      if (ri.QueryOptions != null && ri.QueryOptions.SelectExpand != null) {
     
      }
      Console.WriteLine("BeforeExcute:{0}", ri.Target);
   }
 });

Audit

SQLDataSource has a BeforeExcute and AfterExcute properties, you can judge user’s permission in there

More

SQL Server 2008

Handling special characters in odata queries

Special Character Special Meaning Hexadecimal Value
+ Indicates a space(space cannot be used in url) %28
/ Separates directories and subdirectories %2F
? Separates the actual URL and the Parameters %3F
% Specifiers special characters %25
# Indicates the bookmark %23
& Spearator between parameters specified the URL %26

License

The MIT License (MIT) - See file ‘LICENSE’ in this project