【问题标题】:How to read the stored procedure query from Sql Server 2005 in C#?如何在 C# 中从 Sql Server 2005 读取存储过程查询?
【发布时间】:2012-08-30 09:10:29
【问题描述】:

我有一个简单的存储过程

CREATE PROCEDURE [dbo].[simple]

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX)

    SELECT @sql = '
            SELECT TOP(5) * FROM aTable'
        PRINT @sql

    EXEC sp_executesql 
        @sql
END

现在,在 C# 中,如果可能的话,我想从存储过程中获取 @sql 值(在它执行之后)。

我使用的是 Sql Server 2005。

如何在 C# 中做到这一点?

【问题讨论】:

  • 您想要命令的结果,还是@sql 变量的值?
  • 您的意思是:simple 之外(及之后)您想知道@sql?或者你的意思是你想inside simple,看看EXEC sp_executesql @sql的结果?
  • 顺便说一句,SET NOCOUNT ON 不应更改与额外结果集有关的任何内容 /SELECT - 它只是避免了一些信息输出

标签: c# sql sql-server-2005


【解决方案1】:

从 cmets,您希望在调用该方法之后从 C# 代码访问@sql。所以:

CREATE PROCEDURE [dbo].[simple]
    @sql nvarchar(4000) = null OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @sql = N'SELECT TOP(5) * FROM aTable'

    EXEC sp_executesql @sql
END

然后只需在您的 ADO.NET 代码中:

using(var cmd = connection.CreateCommand()) {
    cmd.CommandText = "dbo.simple";
    cmd.CommandType = CommandType.StoredProcedure;
    var sqlParam = cmd.Parameters.Add("sql", SqlDbType.NVarChar, 4000);
    sqlParam.Direction = ParameterDirection.Output;
    // TODO here: ExecuteNonQuery, ExecuteReader, etc, i.e. your existing code
    string sql = (string)sqlParam.Value;
}

【讨论】:

    【解决方案2】:

    您需要从您的 SPROC 中显式返回它。

    您至少有 3 2 个选项

    1. OUT 参数 (CREATE PROCEDURE [dbo].[simple] @sql NVARCHAR(MAX) OUT)
    2. RETURN 值 (RETURN @sql)
    3. 只需 SELECT @sql 作为 SPROC 的最后一行

    然后您需要在您的 C# 代码中将其绑定到适当的技术中

    编辑返回无效 - Integer expressions only

    Re : 我如何在 C# 中做到这一点?

    假设您使用的是 ADO.NET SqlClient:

    如果你使用输出

    var myParam = new SqlParameter("@sql", SqlDbType.VarChar);
    myParam.Direction = ParameterDirection.Output;
    myCmd.Parameters.Add(myParam);
    

    如果您使用 SELECT,它将作为附加结果集传递给您的 SPROC。 由于您的 proc 已经发出了一个结果集(通过 'sp_executesql @sql'),这将是第二个。

    【讨论】:

      【解决方案3】:

      你为什么不用这个,@sql变量需要什么:

      CREATE PROCEDURE [dbo].[simple]
      AS
      BEGIN
          -- SET NOCOUNT ON added to prevent extra result sets from
          -- interfering with SELECT statements.
          SET NOCOUNT ON;
      
          SELECT TOP(5) * FROM aTable
      END
      

      C#代码:

          SqlConnection sqlConnection = new SqlConnection("ConnectionString"); 
          SqlCommand cmd = new SqlCommand("simple", sqlConnection);
          cmd.CommandType = CommandType.StoredProcedure;
          SqlDataAdapter adp = new SqlDataAdapter(cmd);
          DataSet ds = new DataSet();
          adp.Fill(ds);
      

      【讨论】:

        【解决方案4】:

        SqlCommand 类具有可用于读取过程的属性 CommandText,“获取或设置要在数据源执行的 Transact-SQL 语句、表名或存储过程。”你可以找到一些例子here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-09
          • 1970-01-01
          • 2010-12-11
          • 2013-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多