Выполнение хранимой процедуры с использованием DbConnection - PullRequest
3 голосов
/ 30 декабря 2010

Мне нужно выполнить хранимую процедуру в базе данных. Это то, что я получил до сих пор, что работает:

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 ]

10 голосов
/ 30 декабря 2010

Для 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 голосов
/ 30 декабря 2010

Создайте команду, текст команды должен быть именем SP, а тип команды должен быть StoredProcedure.

0 голосов
/ 14 июня 2017

Я делаю динамические запросы в большинстве приложений, но у меня тоже есть 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();
            }
...