ASP.NET Web APIからストアドプロシージャを実行(呼び出す)方法は?

Roga Lu

今日、私は最初にエンティティデータモデルとコードを使用してASP.NETでWebAPIサービスを開発する方法を学びました。これまで、Webサービスを作成し、Json形式を取得しました。しかし、今では、ストアドプロシージャの実行からデータを取得する方法がわかりません。私の質問を例示するために、私はテスト演習を開発します。どんな助けでも大歓迎です。

まず、データベースにテーブルを作成し、ランダムな情報を入力します。

 CREATE TABLE dbo.web_api_Test
 (
     Id INT,
     Name VARCHAR(255),
     Age REAL,
     Country VARCHAR(255),
     Savings REAL

     PRIMARY KEY(Id)
 );

 INSERT INTO dbo.web_api_Test(Id, Name, Age, Country, Savings)
 VALUES  (1, 'Luis', 30,'USA',45.90),
         (2, 'Keny', 19,'Netherlands',105.50),
         (3, 'Sam', 23,'Germany',5.50),
         (4, 'Deysi', 40,'Canada',22.10),
         (5, 'Eliana', 67,'Mexico',1067.50),
         (6, 'Bear', 22,'France',95.00),
         (7, 'Susan', 32,'Chile',125.70),
         (8, 'Zac', 21,'Italy',34.50),
         (9, 'Saito', 53,'Japan',10.25);

次に、ストアドプロシージャを作成しました。

 CREATE PROCEDURE FindPeople 
      (@Country NVARCHAR(10)) 
 AS 
     SELECT *
     FROM dbo.web_api_Test 
     WHERE Country = @Country
 GO

Visual Studio 2017を使用して、WebAPIを呼び出すためのすべての構造を作成しました。

私のエンティティモデルクラス:

public partial class Modelo : DbContext
{
    public Modelo() : base("name=Modelo") 
    {
    }

    public DbSet<web_api_Test> web_api_Test { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<web_api_Test>()
            .Property(e => e.Name)
            .IsUnicode(false);

        modelBuilder.Entity<web_api_Test>()
            .Property(e => e.Country)
            .IsUnicode(false);
    }
}

私のテーブルモデルクラス

public partial class web_api_Test
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    [StringLength(255)]
    public string Name { get; set; }

    public float? Age { get; set; }

    [StringLength(255)]
    public string Country { get; set; }

    public float? Savings { get; set; }
 }

私のコントローラークラス

public class web_api_TestController : ApiController
{
    private Modelo db = new Modelo();

    // GET: api/web_api_Test
    public IQueryable<web_api_Test> Getweb_api_Test()
    {
        return db.web_api_Test;
    }

    // GET: api/web_api_Test/5
    [ResponseType(typeof(web_api_Test))]
    public async Task<IHttpActionResult> Getweb_api_Test(int id)
    {
        web_api_Test web_api_Test = await db.web_api_Test.FindAsync(id);

        if (web_api_Test == null)
        {
            return NotFound();
        }

        return Ok(web_api_Test);
    }

    // PUT: api/web_api_Test/5
    [ResponseType(typeof(void))]
    public async Task<IHttpActionResult> Putweb_api_Test(int id, web_api_Test web_api_Test)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != web_api_Test.Id)
        {
            return BadRequest();
        }

        db.Entry(web_api_Test).State = EntityState.Modified;

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!web_api_TestExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/web_api_Test
    [ResponseType(typeof(web_api_Test))]
    public async Task<IHttpActionResult> Postweb_api_Test(web_api_Test web_api_Test)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.web_api_Test.Add(web_api_Test);

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (web_api_TestExists(web_api_Test.Id))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("DefaultApi", new { id = web_api_Test.Id }, 
   web_api_Test);
    }

    // DELETE: api/web_api_Test/5
    [ResponseType(typeof(web_api_Test))]
    public async Task<IHttpActionResult> Deleteweb_api_Test(int id)
    {
        web_api_Test web_api_Test = await db.web_api_Test.FindAsync(id);

        if (web_api_Test == null)
        {
            return NotFound();
        }

        db.web_api_Test.Remove(web_api_Test);
        await db.SaveChangesAsync();

        return Ok(web_api_Test);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }

        base.Dispose(disposing);
    }

    private bool web_api_TestExists(int id)
    {
        return db.web_api_Test.Count(e => e.Id == id) > 0;
    }
}

これらのスクリーンショットは、IISGoogleを使用したときに得られる結果です。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ストアドプロシージャを呼び出すようにコードを変更するにはどうすればよいFindPeopleですか?

ありがとう

編集:私は次のコードを試しました:

    [HttpGet, Route("api/TestStoreProcN")]
    public IQueryable<web_api_Test> GetStore(String country)
    {
        var getDataLogs = db.web_api_Test.SqlQuery<web_api_Test>("exec 
   FindPeople @Country", country).AsQueryable();
        return getDataLogs;
    }

しかし、次のエラーが発生しました。

ここに画像の説明を入力してください

Pranav Singhの回答に基づいて、次の方法を実装しましたが、機能します。

回答1:

    [HttpGet, Route("api/TestProcedure/{country}")]
    public List<web_api_Test> GetList(string country)
    {

        SqlConnection connection = new SqlConnection();

        connection.ConnectionString =
        "Data Source=myserver;" +
        "Initial Catalog=mydatabase;" +
        "User id=myuser;" +
        "Password=secret;";

        connection.Open();

        string procedureName = "[dbo].[FindPeople]";
        var result = new List<web_api_Test>();
        using (SqlCommand command = new SqlCommand(procedureName, 
        connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add(new SqlParameter("@Country", country));

            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    int id = int.Parse(reader[0].ToString());
                    string name = reader[1].ToString();
                    float? age = float.Parse(reader[2]?.ToString());
                    string Country = reader[3].ToString();
                    float? savings = float.Parse(reader[4]?.ToString());
                    web_api_Test tmpRecord = new web_api_Test()
                    {
                        Id = id,
                        Name = name,
                        Age = age,
                        Country = country,
                        Savings = savings
                    };
                    result.Add(tmpRecord);
                }
            }
        }
        return result;
    } 

しかし、ここで、EntityFrameworkを使用して同じ結果を取得する方法を知りたいと思います。どうすればそれができますか?どんな参照や提案も歓迎します。

回答2:

最後に、EFを使用して解決策を見つけました。

    [HttpGet, Route("api/TestProcedure/{country}")]
    public List<web_api_Test> GetListProcedure(string country)
    {
        var parameter = new SqlParameter {
            ParameterName ="Country",
            Value =country};

        var result= db.web_api_Test.SqlQuery("EXEC FindPeople 
       @Country",parameter).ToList();

        return result;
    }

ご協力いただきありがとうございます。

プラナフシン

私は多くの理由でEFを長い間使用していません。私はあなたが直接的なアプローチで大丈夫です、あなたはこれを試すことができます:

public List<web_api_Test> GetList(string country){
    string procedureName = "[dbo].[FindPeople]";
    var result = new List<web_api_Test>();
    using (SqlCommand command = new SqlCommand(procedureName, connection))
    {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(new SqlParameter("@Country", country));

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                int id = int.Parse(reader[0].ToString());
                string name  = reader[1].ToString();
                float? age = float.Parse(reader[2]?.ToString()); 
                string Country   = reader[3].ToString();
                float? savings = float.Parse(reader[4]?.ToString()); 
                web_api_Test tmpRecord = new web_api_Test()
                {
                    Id = id,
                    Name =Name ,
                    Age =age,
                    Savings =savings
                };
                result.Add(tmpRecord);
            }
        }
    }
    return result;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ASP.NET から複数の入力値を持つ MySQL ストアド プロシージャを呼び出す方法

分類Dev

Web API を呼び出す ASP .Net Core Web アプリ

分類Dev

コントローラーコードasp.net mvc CoreからWeb URLを呼び出す方法

分類Dev

Android デバイスから asp.net Web API を呼び出す方法

分類Dev

Webサイト(ASP.NET)のストアドプロシージャと統合する方法

分類Dev

C#(ASP.Net)でパラメーター化されたストアドプロシージャを呼び出す方法は?

分類Dev

asp.net c#アプリケーションからのWebサービス呼び出しがnullを返すのはなぜですか?

分類Dev

EntityFramework7とAsp.Net5を使用してSQLストアドプロシージャを呼び出すにはどうすればよいですか

分類Dev

ASP.NET MVC:LINQ構文を使用してストアドプロシージャを実行する方法は?

分類Dev

ASP.NET Core EntityFramework呼び出しストアドプロシージャ

分類Dev

Web API(csまたはasp.net)を使用してPowershellスクリプトを呼び出す方法

分類Dev

Pythonからの入力パラメータでASP.net Web APiを呼び出す方法は?

分類Dev

C#ASP.Net:WSDLまたはプロキシクラスを使用せずに.NET 4.0 C#でWebサービスを呼び出す方法

分類Dev

ASP.NETこのストアドプロシージャの呼び出し方法

分類Dev

ASP.NET Web APIを使用してJava Webサービスを呼び出す

分類Dev

ストアドプロシージャ実行の一貫性のない結果-ASP.netコードと直接SP呼び出し

分類Dev

ASP.NETストアドプロシージャ呼び出しinsertVarBinaryをSQLに

分類Dev

Angularjs + ASP.NET MVC + ASP.NET Web API

分類Dev

ASP.NET5およびMVC6でスタートアップ構成をWebプロジェクトから切り離す最良の方法

分類Dev

ASP.Net Core Web APIアプリケーション:すべてのアクションメソッドから成功を返し、特定のモードでコードを実行しない方法は?

分類Dev

ThreadStatic in asynchronous ASP.NET Web API

分類Dev

ASP.NET Web API 2 ViewModels?

分類Dev

ASP.NET Web API Dependency Injection

分類Dev

ASP.net MVC Web Api + Android

分類Dev

Using transactions in ASP.NET Web API

分類Dev

DryIoc ASP.NET 5 Web API

分類Dev

Asp.net Web API 構成

分類Dev

ASP.Net WebフォームアプリケーションのJqueryから内部目的で使用されるWebサービス(.asmx)を安全に呼び出すにはどうすればよいですか?

分類Dev

Webアプリケーションを検索ボットから隠す方法は?(ASP.NET)

Related 関連記事

  1. 1

    ASP.NET から複数の入力値を持つ MySQL ストアド プロシージャを呼び出す方法

  2. 2

    Web API を呼び出す ASP .Net Core Web アプリ

  3. 3

    コントローラーコードasp.net mvc CoreからWeb URLを呼び出す方法

  4. 4

    Android デバイスから asp.net Web API を呼び出す方法

  5. 5

    Webサイト(ASP.NET)のストアドプロシージャと統合する方法

  6. 6

    C#(ASP.Net)でパラメーター化されたストアドプロシージャを呼び出す方法は?

  7. 7

    asp.net c#アプリケーションからのWebサービス呼び出しがnullを返すのはなぜですか?

  8. 8

    EntityFramework7とAsp.Net5を使用してSQLストアドプロシージャを呼び出すにはどうすればよいですか

  9. 9

    ASP.NET MVC:LINQ構文を使用してストアドプロシージャを実行する方法は?

  10. 10

    ASP.NET Core EntityFramework呼び出しストアドプロシージャ

  11. 11

    Web API(csまたはasp.net)を使用してPowershellスクリプトを呼び出す方法

  12. 12

    Pythonからの入力パラメータでASP.net Web APiを呼び出す方法は?

  13. 13

    C#ASP.Net:WSDLまたはプロキシクラスを使用せずに.NET 4.0 C#でWebサービスを呼び出す方法

  14. 14

    ASP.NETこのストアドプロシージャの呼び出し方法

  15. 15

    ASP.NET Web APIを使用してJava Webサービスを呼び出す

  16. 16

    ストアドプロシージャ実行の一貫性のない結果-ASP.netコードと直接SP呼び出し

  17. 17

    ASP.NETストアドプロシージャ呼び出しinsertVarBinaryをSQLに

  18. 18

    Angularjs + ASP.NET MVC + ASP.NET Web API

  19. 19

    ASP.NET5およびMVC6でスタートアップ構成をWebプロジェクトから切り離す最良の方法

  20. 20

    ASP.Net Core Web APIアプリケーション:すべてのアクションメソッドから成功を返し、特定のモードでコードを実行しない方法は?

  21. 21

    ThreadStatic in asynchronous ASP.NET Web API

  22. 22

    ASP.NET Web API 2 ViewModels?

  23. 23

    ASP.NET Web API Dependency Injection

  24. 24

    ASP.net MVC Web Api + Android

  25. 25

    Using transactions in ASP.NET Web API

  26. 26

    DryIoc ASP.NET 5 Web API

  27. 27

    Asp.net Web API 構成

  28. 28

    ASP.Net WebフォームアプリケーションのJqueryから内部目的で使用されるWebサービス(.asmx)を安全に呼び出すにはどうすればよいですか?

  29. 29

    Webアプリケーションを検索ボットから隠す方法は?(ASP.NET)

ホットタグ

アーカイブ