存储过程返回到 C# .Net 中的 DataSet
Posted
技术标签:
【中文标题】存储过程返回到 C# .Net 中的 DataSet【英文标题】:Stored procedure return into DataSet in C# .Net 【发布时间】:2012-10-10 00:57:30 【问题描述】:我想从存储过程中返回虚拟表,我想在 c# .net 的数据集中使用它。我的程序有点复杂,找不到如何返回表并将其设置在数据集中
这是我的修改程序:
ALTER PROCEDURE [dbo].[Procedure1]
@Start datetime,
@Finish datetime,
@TimeRange time
AS
BEGIN
SET NOCOUNT ON;
declare @TimeRanges as TABLE (SessionStart datetime, SessionEnd datetime);
with TimeRanges as (
select @Start as StartTime, @Start + @TimeRange as EndTime
union all
select StartTime + @TimeRange, EndTime + @TimeRange
from TimeRanges
where StartTime < @Finish )
select StartTime, EndTime, Count( Test.ScenarioID ) as TotalPeaks
from TimeRanges as TR left outer join
dbo.Test as Test on TR.StartTime <= Test.SessionStartTime and Test.SessionCloseTime < TR.EndTime
group by TR.StartTime, TR.EndTime
END
【问题讨论】:
欢迎使用 ***:如果您发布代码、XML 或数据示例,请在文本编辑器中突出显示这些行并单击“代码示例”按钮 (
) 在编辑器工具栏上以很好地格式化和语法突出显示它!
【参考方案1】:
您可以在全局级别声明 SqlConnection
和 SqlCommand
实例,以便您可以在整个课程中使用它。连接字符串在Web.Config
。
SqlConnection sqlConn = new SqlConnection(WebConfigurationManager.ConnectionStrings["SqlConnector"].ConnectionString);
SqlCommand sqlcomm = new SqlCommand();
现在您可以使用以下方法将值传递给存储过程并获取DataSet
。
public DataSet GetDataSet(string paramValue)
sqlcomm.Connection = sqlConn;
using (sqlConn)
try
using (SqlDataAdapter da = new SqlDataAdapter())
// This will be your input parameter and its value
sqlcomm.Parameters.AddWithValue("@ParameterName", paramValue);
// You can retrieve values of `output` variables
var returnParam = new SqlParameter
ParameterName = "@Error",
Direction = ParameterDirection.Output,
Size = 1000
;
sqlcomm.Parameters.Add(returnParam);
// Name of stored procedure
sqlcomm.CommandText = "StoredProcedureName";
da.SelectCommand = sqlcomm;
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
da.Fill(ds);
catch (SQLException ex)
Console.WriteLine("SQL Error: " + ex.Message);
catch (Exception e)
Console.WriteLine("Error: " + e.Message);
return new DataSet();
以下是配置文件中的连接字符串示例
<connectionStrings>
<add name="SqlConnector"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=YourDatabaseName;User id=YourUserName;Password=YourPassword"
providerName="System.Data.SqlClient" />
</connectionStrings>
【讨论】:
不,您应该始终像使用它们一样在using
语句中创建 SqlCommand 和 SqlConnection 对象,以便之后处理它们并确保它们不被多个线程使用。
由于 SqlCommand 和 SqlConnection 也用于多个方法的全局级别(出于重用目的),我既没有使用 using
也没有使用任何命令来处理。理想情况下,我曾经在必要/应用程序结束的地方处理它。另外,请注意,我没有提到程序中的完整代码,因为我的目的是回答 OP 的要求。这就是你没有看到任何处理代码的原因@Rory
我的意思是最好不要按照你的建议去做。你的例子不应该被效仿。当您直接使用 SqlCommand 或 SqlConnection 对象时,没有充分的理由保留它,并且有很多缺点(例如,由多个线程使用,没有正确处理,妨碍有效的连接池,保持比需要更多的连接打开)。
另外,GetDataSet()
中似乎有一些错误,例如它总是返回一个新的空DataSet
对象,它在第一次执行后处理sqlconn
变量。这是一个从 proc ***.com/a/12974098/8479 填充 DataSet 的好例子【参考方案2】:
试试这个
DataSet ds = new DataSet("TimeRanges");
using(SqlConnection conn = new SqlConnection("ConnectionString"))
SqlCommand sqlComm = new SqlCommand("Procedure1", conn);
sqlComm.Parameters.AddWithValue("@Start", StartTime);
sqlComm.Parameters.AddWithValue("@Finish", FinishTime);
sqlComm.Parameters.AddWithValue("@TimeRange", TimeRange);
sqlComm.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = sqlComm;
da.Fill(ds);
【讨论】:
在尝试使用此答案时让我感到惊讶的是,我必须将命令类型设置为CommandType.StoredProcedure
。所以它看起来像这样sqlComm.CommandType = CommandType.StoredProcedure
。
没问题。在我用谷歌搜索它并找到MS article that gave me the missing piece之前,我坐在那里挣扎了一个小时左右。但这无疑让我达到了 99.9% 的目标。很好的答案。
@codingbiz 如果 t sql 也返回数据表旁边的输出参数呢?是否也有可能获得?如何?样品?
ds.Tables[0].Rows[0][0]
获取第一行的第一列,因为您只有一行一列
插入时使用输出参数...这是一种选择查询方式【参考方案3】:
我应该告诉你基本的步骤,休息取决于你自己的努力。您需要执行以下步骤。
创建一个连接字符串。 创建 SQL 连接 创建 SQL 命令 创建 SQL 数据适配器 填写您的数据集。不要忘记打开和关闭连接。关注此link 了解更多信息。
【讨论】:
作为答案,我认为这不是很有帮助。除非另有说明,否则我觉得人们想要的是细节而不是泛型。以上是关于存储过程返回到 C# .Net 中的 DataSet的主要内容,如果未能解决你的问题,请参考以下文章
C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值