如何在C#中获得“EXEC存储过程()”的结果

时间:2014-05-08 04:23:48

标签: c# sql-server sql-server-2008

不要问我为什么,但我想放入一个像这样的sqlCommand对象:

sqlConnection a = new sqlConection(...);
sqlCommand b = new sqlCommand("EXEC storedProcedure()", a);
sqlDataAdapter c = new sqlDataAdapter(b);
DataTable d = new DataTable();
c.Fill(d);

因此,当存储过程进行插入时,行已成功添加,但代码会抛出异常。

我知道存在专门用于存储过程的sqlCommand.CommandType,但我的架构需要以这种方式制作。

3 个答案:

答案 0 :(得分:0)

设置适配器" SelectCommand"财产改为

var cmd = new SqlCommand("EXEC storedProcedure()", a);
cmd.CommandType = CommandType.StoredProcedure; //set command property
//..
var adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd; //set adapter command for select query

并且您的命令类型必须为CommandType.StoredProcedure才能执行SP,您的架构不需要这个吗?只是问他有充分的理由。

答案 1 :(得分:0)

您的SQL语法已关闭。

来自http://technet.microsoft.com/en-us/library/ms188332.aspx

USE AdventureWorks2012;
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO

所以你的代码应该是:

new sqlCommand("EXEC storedProcedure", a);

答案 2 :(得分:0)

虽然有很多方法可以做同样的事情,但有些事情在你按框架建议的方式进行时效果最好。

在这种情况下,运行存储过程时可能会发生一些事情,具体取决于它是哪个过程。它可能返回一组行,或几组行,或者根本不返回任何行。已经有了我们可以做的事情来处理所有这些情况,由.NET框架提供。

以下是我过去用于返回一个或多个行集的任何SP的扩展程序代码:

public static DataSet ExecuteStoredProcedure(this SqlConnection connection, string SPName, params object[] parameters)
{
    using (var cmd = connection.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = SPName;
        cmd.CommandTimeout = 60;

        if (connection.State != ConnectionState.Open)
            connection.Open();

        SqlCommandBuilder.DeriveParameters(cmd);
        int index = 1;
        foreach (object p in parameters)
        {
            if (index >= cmd.Parameters.Count)
                break;
            cmd.Parameters[index++].Value = (p == null ? DBNull.Value : p);
        }

        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
        {
            DataSet res = new DataSet();
            adapter.Fill(res);

            return res;
        }
    }
}

处理非行集返回值和输出参数需要更多工作,但这可以满足您的直接需求:

var conn = new SqlConnection("some connection string");
DataSet ds = conn.ExecuteStoredProcedure("storedProcedure");
DataTable d = ds == null ? null : ds.Tables.Length < 1 ? null : ds.Tables[0];