【问题标题】:Call a stored procedure from .net从 .net 调用存储过程
【发布时间】:2009-06-17 08:04:10
【问题描述】:

我有一个这样的存储过程:

CREATE PROCEDURE up_action
(@id int
,@group varchar(30)=''
,@nom varchar(30)=''
,@compte varchar(30)=NULL
)
 AS
BEGIN
DECLARE @chrono int
......
select @date=date from users where compte=@compte
INSERT INTO dialog
(numappel,auteur,commentaire,etape,etapews,operant)
VALUES
(@numappel,@nomprenom,@dialogue,14,14,@nomoperateur)
SET @chrono = SCOPE_IDENTITY()      
select 'chrono'=@chrono
END

我想从一个用 C# 编写的应用程序调用这个存储过程,并可以提供由 , 分隔的参数(实际上是它们的值),然后最终接收一个记录集 rs,我可以从中获取值像 rs("chrono") 这样的变量。

我知道创建每个参数并告诉类型、名称、值等的可能性。 但我想要一个像 ASP 一样的方法,因为我有 100 个参数的程序......

【问题讨论】:

    标签: c# .net sql-server sql-server-2005 ado.net


    【解决方案1】:

    通常,使用 POADO(Plain Old ADO.Net)你会做这样的事情:

    using (SqlConnection conn = new SqlConnection(myConnectionString))
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "up_action"
        cmd.Parameters.AddWithValue("@group", group);
        cmd.Parameters.AddWithValue("@nom", nom);
        cmd.Parameters.AddWithValue("@compte", compte);
        conn.Open();
        using (SqlDataReader rd = cmd.ExecuteReader())
        {
            if (rd.Read())
            {
                chrono = rs["chrono"];
            }
        }
    }
    

    但正如 Richard 所指出的:您确实最好研究一下 LINQ to SQL 之类的东西,因为这将为每个存储过程生成一个方法(它会自动为您的存储过程的每个参数提供一个参数)。请参阅this link 了解更多信息。

    【讨论】:

      【解决方案2】:

      如果您想让任务更轻松,请查看 LINQ to SQL 之类的东西。

      【讨论】:

        【解决方案3】:

        所以..解决方案是:

        SqlCommand sqlCommand = new SqlCommand();
        sqlCommand.CommandText = strQuery;
        rdr = sqlCommand.ExecuteReader();
        rdr.Read();
        int chrono = Convert.ToInt32(rdr["chrono"])
        

        对于 2 个参数

        rdr.NextResult();
        rdr.Read();
        int str = Convert.ToInt32(rdr["str"]);
        

        谢谢大家的回答

        【讨论】:

        • 我不确定你是否理解正确......或者我可能误解了你。但是参数是您作为输入发送到存储过程的内容(并且您将其添加到 cmd.Parameters 集合中(请参阅我上面的答案))。结果集是存储过程返回的内容。如果返回多个结果集(我相信您的过程不是这种情况),您只需要 NextResult()。
        【解决方案4】:

        您可能还想查看Enterprise Libray 中的数据访问应用程序块,因为这为数据访问提供了良好的模式。我还建议你再看看你的 SP,看看你是否可以重构它们,100 个参数听起来有点过分了。

        【讨论】:

          【解决方案5】:

          我想这是一个插入/更新过程... 100 个参数对我来说听起来太多了,但如果这是您需要的,那么您可能需要查看表值参数(仅限 SQL 2008):

          http://msdn.microsoft.com/en-us/library/bb675163.aspx

          (不过,首先,我会接受上述建议,看看像 LINQ 这样的 ORM - 这将解决问题的繁重工作)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多