C# 存储过程 如何返回 tatatable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 存储过程 如何返回 tatatable相关的知识,希望对你有一定的参考价值。

SqlConnection sqlcon = new SqlConnection("连接串");
SqlDataAdapter ada = new SqlDataAdapter();
SqlCommand sqlcom = new SqlCommand("SearchResult", sqlcon);
SqlParameter sp = new SqlParameter("@Title", "传入值");
sqlcom.CommandType = CommandType.StoredProcedure;
sqlcom.Parameters.Add(sp);
ada.SelectCommand = sqlcom;
DataSet ds = new DataSet();
ada.Fill(ds);
====================
以上语句 返回dataset,我想让它返回 datatable, 请问如何写?
ds.tables[""]或者ds.tables[i] 不就是 Datatable
=====================
实际上,我是知道这点的,但我想法是:不使用 SqlDataAdapter。
==================
看来还是用 SqlDataAdapter ,谢谢各位

参考技术A Database db = DALFactory.DatabaseCustomFoctory.CreateDatabase();
if (db != null)

string sqlCommand = "Web_DataV10_Area_SelectLayer";
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
db.AddInParameter(dbCommand, "OperatorID", DbType.Int32, EmpID);
db.AddInParameter(dbCommand, "AreaID", DbType.String, "");
ds = db.ExecuteDataSet(dbCommand);
现在都用工厂了,这种方法你可以体验一下,直接调用sql数据库中的存贮过程,返回dataset,得到datatable,不用SqlDataAdapter,可以吗
参考技术B 直接传DataTable
DataTable dt = new DataTable()
ada.Fill(dt);
参考技术C ds.tables[""]或者ds.tables[i] 不就是 Datatable本回答被提问者采纳

C# SQL Server 存储过程参数返回列表

【中文标题】C# SQL Server 存储过程参数返回列表【英文标题】:C# SQL Server stored procedure parameter return list 【发布时间】:2018-08-02 06:02:31 【问题描述】:

我正在尝试执行一个带有两个参数并返回结果列表的 SQL Server 存储过程。应用程序正在返回结果,但是我不确定如何将值分配给模型中的列表。正在使用的 ORM 是 Dapper。这是我的代码

string startTime = "2018-04-17 00:00:00.000";
string endTime = "2018-04-17 23:59:59.997";
string db = "database";

List<ShelfInventoryModel> output = new List<ShelfInventoryModel>();

using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SqlConnection.CnnString(db)))

    DataTable dt = new DataTable();

    var p = new DynamicParameters();
    p.Add("@StartDate", startTime);
    p.Add("@EndDate", endTime);

    output = connection.Query<ShelfInventoryModel>("dbo.spGetInventory_Liquor", p, commandType: CommandType.StoredProcedure).ToList();

    Console.WriteLine(output);
    Console.ReadLine();

这是模型类

public class ShelfInventoryModel

    public decimal Quantity  get; set; 
    public string ItemName  get; set; 

我了解需要将结果填充到可能的数据适配器中。但是,当我尝试将输出填充到数据适配器时,系统给了我一个错误

将结果返回到控制台的目的。但是,此时控制台只显示:

System.Collections.Generic.List`1[ProcedureTest.ShelfInventoryModel]

【问题讨论】:

什么列表“在模型中”?此外,如果您打算用 Query&lt;...&gt;(...).ToList() 返回的任何内容替换它,则无需为 output 分配新的 List 查询返回数量和商品名称。在这种情况下不需要列表吗?在单步执行应用程序时,它返回一个对象数组。我想将对象分配给列表。可能使用 foreach 语句 在您显示的代码的末尾,output 应该包含ShelfInventoryModel 对象的列表。看不出该代码有什么问题。所以我真的不确定你想在这里问什么 在代码的末尾,output 应该包含一个 ShelfInventoryModel 对象列表,存储过程返回的每一行对应一个对象,其值来自列 QuantityItemName放入那些对象。 (不需要数据适配器。)那么到底是什么问题? 最后一条评论是 critical 并且应该是您问题的一部分。 edit 将您的问题包含在这些信息中会比将其放入 cmets 更好 - 我已经为您完成了。 【参考方案1】:

Console.WriteLine(output); 将简单地在参数上显示 ToString 的结果,对于这种类型,它恢复为默认实现,它只显示 output 对象的类型名称。您需要使用foreach 遍历列表中的项目:

foreach (var item in output)

    Console.WriteLine(item);

这会导致你得到一行行,只给出该对象的类型。所以要么你可以为你的对象编写一个 ToString 的实现,或者简单地显示你想看到的位......

foreach (var item in output)

    Console.WriteLine($"item.ItemName item.Quantity");

【讨论】:

这也是我的普遍理解。但是,当我逐步执行语句时,返回到控制台的结果是 ProcedureTest.ShelfInventoryModel 回答已编辑以解释为什么这是同一件事的另一个实例以及如何克服它。 太棒了!非常感谢!这是我为解决我的问题所做的 foreach(ShelfInventoryModel item in output) Console.WriteLine($"item.Quantity item.ItemName"); Console.ReadLine(); 【参考方案2】:

你可以用这个:

string startTime = "2018-04-17 00:00:00.000";
string endTime = "2018-04-17 23:59:59.997";
string db = "database";

List<ShelfInventoryModel> output = new List<ShelfInventoryModel>();

using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(SqlConnection.CnnString(db)))

    DataTable dt = new DataTable();

    var p = new DynamicParameters();
    p.Add("@StartDate", startTime);
    p.Add("@EndDate", endTime);

    output = connection.Query<ShelfInventoryModel>("dbo.spGetInventory_Liquor", p, commandType: CommandType.StoredProcedure).ToList();

    foreach (ShelfInventoryModel item in output)
    
        Console.WriteLine(item.Quantity.ToString());
        Console.WriteLine(item.ItemName);
           

【讨论】:

【参考方案3】:

这是应用程序向控制台返回结果列表的工作代码

foreach(ShelfInventoryModel item in output)
            
                Console.WriteLine($"item.Quantity item.ItemName");

            
            Console.ReadLine();
        

【讨论】:

以上是关于C# 存储过程 如何返回 tatatable的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用存储过程输出参数

C# 如何调用此存储过程

如何使用c#执行返回多个游标的oracle存储过程

Asp.net(C#) 获取 执行sql server 语句/存储过程后的 多个返回值?

在 C# 中如何获取存储过程的返回值 ?

c#调用oracle存储过程,返回2个值