使用DbConnection执行存储过程

4

我需要在数据库上执行存储过程。以下是目前可行的代码:

protected DbProviderFactory dbProviderFactory;
this.dbProviderFactory = DalFactory.GetFactory(this.adapterConfiguration);

DbConnection dbConnection = dbProviderFactory.CreateConnection();

dbConnection.ConnectionString = this.adapterConfiguration.DatabaseInformation.ExternalDatabaseInformation.connectionString;
            try
            {
                dbConnection.Open();
            }
            catch (Exception e)
            {

                throw;
            }

我猜DbCommand可以做到,但我还没有找到有效的方法。假设需要执行名为“initialize”的存储过程,我该怎么做?

3个回答

15

对于 SqlServer,可以像这样:

DbCommand command = new SqlCommand();
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "<your stored proc>";
command.Connection = dbConnection;

SqlParameter param1 = new SqlParameter("<your parameter>", MyVar);
command.Parameters.Add(param1);
//[...]

SqlParameter returnValue = new SqlParameter("ReturnValue", User);
returnValue.Direction = System.Data.ParameterDirection.ReturnValue;
command.Parameters.Add(returnValue);

command.Connection.Open();
command.ExecuteNonQuery();
int result = (int)command.Parameters["ReturnValue"].Value;
command.Connection.Close();

2

创建一个命令,命令文本应该是存储过程的名称,命令类型应该是StoredProcedure。


如果没有返回结果,就使用ExecuteNonQuery;如果返回结果集,则使用ExecuteReader。 - Jahan Zinedine
还有ExecuteScalar。 - fejesjoco
谢谢。它没有返回任何结果,所以我使用了ExecuteNonQuery。 - Kasper Hansen

0

我在我的大多数应用程序中都在做动态查询,但也使用EF。我传递了一个 _ctx EF DbContext 来运行我的存储过程。我相信有一种方法可以在SQL中完成所有这些操作,但我还没有想出来。

            using (_ctx)
            {
                if (_ctx.Database.Connection.State != ConnectionState.Open)
                    _ctx.Database.Connection.Open();
                foreach (var name in _tableNames)
                {
                    using (var cmd = _ctx.Database.Connection.CreateCommand())
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.CommandText = @"UpdateRMRowsToUpload";
                        cmd.Parameters.Add(new SqlParameter("@tableName", SqlDbType.VarChar));
                        cmd.Parameters["@tableName"].Direction = Input;
                        cmd.Parameters["@tableName"].Value = name;
                        cmd.ExecuteNonQuery();
                    }
                }
                if (_ctx.Database.Connection.State == ConnectionState.Open)
                    _ctx.Database.Connection.Close();
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接