Как правильно выполнить хранимую процедуру связанного сервера из C # - PullRequest
0 голосов
/ 17 мая 2019

Я хочу выполнить хранимую процедуру, расположенную в базе данных связанного сервера. В настоящее время я использую это в SSMS:

INSERT INTO myTable
    EXEC [LINKEDSERVER\LINKED].[Data_Base_Name].[Store].usp_GetInfo 1, 1, NULL, 'H'

Это вставит в мою локальную БД данные результата из хранимой процедуры, расположенной в LINKEDSERVER\LINKED.

Я хочу быть в состоянии сделать это с помощью команды из C #, есть ли правильный способ сделать это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Вы можете выполнить SP из DataContext:

using (DataContext ctx = DataContext())
{
    int result = ctx.SP_ProcedureName("1", "2", "3");
}

Но сначала вам нужно добавить его в DataContext Diagram из вашей базы данных при добавлении таблиц, но из папки «Хранимые процедуры».

это более оборонительное и аккуратное решение.но если вы предпочитаете использовать необработанную командную строку, используйте хотя бы параметризованный запрос, как в этом примере:

string sqlText = "SELECT columnName FROM Test_Attachments WHERE Project_Id =@PID1 AND [Directory] = @Directory";

 SqlCommand myCommand = new SqlCommand(sqlText, SqlConnection);
 myCommand.Parameters.AddWithValue("@PID1", 12);
 myCommand.Parameters.AddwithValue("@Directory", "testPath");

Это способ избежать внедрения SQL-кода в ваш код.Также вы можете использовать блок finally для закрытого соединения:

    finally
    {
        command.Connection.Close();
    }
0 голосов
/ 17 мая 2019

Спасибо, ребята, за помощь. Олег, спасибо за ваше предложение. Что я сделал, это было:

qSQL = "INSERT INTO " + tableName + " EXEC [LINKEDSERVER\\LINKED].[Data_Base_Name]." + spName;
using (SqlConnection _connection = new SqlConnection(connectionString))
{
            try
            {
                    command = new SqlCommand();
                    command.Connection = _connection;
                    command.Connection.Open();
                    command.CommandText = _qSQL;
                    command.CommandTimeout = 300; //Because it takes long
                    SqlTransaction transaction;
                    transaction = connection.BeginTransaction();
                    try
                    {
                        command.Transaction = _transaction;
                        command.ExecuteNonQuery();
                        transaction.Commit();
                        Debug.WriteLine("Done");
                    }
                    catch (SqlException e)
                    {
                        Debug.WriteLine("Exception [{0}:{1}]", e.Number, e.Message);
                        transaction.Rollback();
                    }
            //close connection
                    command.Connection.Close();
                }
                catch (SqlException e)
                {
                    command.Connection.Close();
                    Debug.WriteLine("exception error number: " + e.Number + ": " + e.Message);
                }
            }
}

Если у вас есть предложения по улучшению, сообщите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...