从.net调用存储过程

时间:2009-06-17 08:04:11

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

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

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个参数的程序......

5 个答案:

答案 0 :(得分:6)

通常情况下,使用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"];
        }
    }
}

但正如理查德所指出的那样:你确实最好看看像LINQ to SQL这样的东西,因为这会为每个存储过程生成一个方法(它会自动为你的存储过程的每个参数设置一个参数)。有关详细信息,请参阅this link

答案 1 :(得分:1)

如果你想让这个任务更容易看看像LINQ to SQL这样的东西。

答案 2 :(得分:1)

所以......解决方案是:

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"]);

谢谢大家的回答

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

(首先,我会接受上述建议并看一下像LINQ这样的ORM - 这将解决问题的重大问题)