【问题标题】:Get the output for a stored procedure in the format of a string in C# [duplicate]以 C# 中的字符串格式获取存储过程的输出 [重复]
【发布时间】:2015-02-07 17:04:18
【问题描述】:

我有一个返回字符串的存储过程:

DECLARE @SqlStatement VARCHAR(MAX)

SELECT @SqlStatement = 
    COALESCE(@SqlStatement, '') + 'DROP TABLE [TMP].' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TMP'

PRINT @SqlStatement

我尝试像这样返回字符串:

var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DBBASE"].ConnectionString);

using (var cmd = new SqlCommand("proSQL", con)
{
    CommandType = CommandType.StoredProcedure
})
{
    cmd.Parameters.Add("SqlStatement", SqlDbType.VarChar);
    var returnParameter = cmd.Parameters.Add("@SqlStatement", SqlDbType.VarChar);
    returnParameter.Direction = ParameterDirection.Output;

    con.Open();
    cmd.ExecuteNonQuery();
    var result = returnParameter.Value;
}

当我运行代码时,我得到了错误:

过程 proSQL 没有提供参数和参数

我不确定我做错了什么。有人能告诉我如何以字符串格式获取存储过程的输出吗?

【问题讨论】:

  • @ReturnVal 在哪里是 SP
  • @Ganesh_Devlekar 没有,只​​是编辑了问题
  • 我也想过退货,但没有。改用 returnParameter.Direction = ParameterDirection.Output
  • @Jauch 您确实在存储过程中提到了输出参数...请粘贴整个 SP
  • 存储过程不返回任何内容。无论如何,在 TSQL 中进行字符串连接有什么意义?

标签: c# sql-server tsql stored-procedures sqlcommand


【解决方案1】:

SP 的变化:

DECLARE @SqlStatement VARCHAR(MAX) OUTPUT 

更改 C# 代码:

var returnParameter = new SQLParameter("@SqlStatement", SqlDbType.VarChar, -1);
returnParameter.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(returnParameter);

【讨论】:

  • 我收到错误:String[1]: Size 属性的大小为 0 无效。
  • @nate,你必须提供 varchar 类型的参数的大小。尝试使用-1。例如:msdn.microsoft.com/en-us/library/a1904w6t%28VS.80%29.aspx
  • 出现错误:cmd.ExecuteNonQuery();
  • 尝试使用参数定义中的 -1 :)
  • cmd.Parameters.Add("SqlStatement", SqlDbType.VarChar, -1); var returnParameter = cmd.Parameters.Add("@SqlStatement", SqlDbType.VarChar, -1);
【解决方案2】:

您的 SQL 应该如下所示,

CREATE PROCEDURE [GetTableNames]
     @schema NVARCHAR(128)
AS
    SELECT
            [TABLE_NAME]
    FROM
            [INFORMATION_SCHEMA].[TABLES]
    WHERE
            [TABLE_SCHEMA] = @schema
RETURN 0;

那么你就可以这样得到你想要的字符串了,

var tableNames = new List<string>();
var con = new SqlConnection(
              ConfigurationManager.ConnectionStrings["DBBASE"].ConnectionString);

using (var cmd = new SqlCommand("GetTableNames", con)
        {
            CommandType = CommandType.StoredProcedure
        })
{                 
    cmd.Parameters.Add("@schema", "TMP");    
    con.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while(reader.MoveNext())
        {
            tableNames.Add(reader.GetString(0))
        }
    }
}

var result = string.Join(
    Environment.NewLine,
    tableNames
        .Select(tn => string.Format("DROP TABLE [TMP].[{0}];", tn))
        .ToArray());

【讨论】:

    猜你喜欢
    • 2018-04-23
    • 2023-03-04
    • 2019-07-16
    • 1970-01-01
    • 2018-08-02
    • 2016-04-13
    • 2012-10-04
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多