ScoopTw Ответов: 2

Используйте процедуру одной базы данных и сохраните данные в другой таблице базы данных с помощью C#


У меня есть много баз данных, и база данных динамически изменяется путем ввода в строку подключения. Но у меня есть процедура в одной базе данных, предположим, с именем "DB1", и я хочу вставить данные в другую базу данных с именем "DB2".

SqlConnection conn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["connString"].ConnectionString);
conn1.Open();
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = conn1;
cmd3.CommandType = CommandType.StoredProcedure;
cmd3.CommandText = "storeProcedure";
cmd3.Parameters.AddWithValue("@Col0", string.IsNullOrEmpty(index[0].ToString()) ? (object)DBNull.Value : index[0].ToString());    
cmd3.Parameters.AddWithValue("@Col1", string.IsNullOrEmpty(index[1].ToString()) ? (object)DBNull.Value : index[1].ToString());
cmd3.Parameters.AddWithValue("@Col2", string.IsNullOrEmpty(index[2].ToString()) ? (object)DBNull.Value : index[2].ToString());
cmd3.Parameters.AddWithValue("@Col3", string.IsNullOrEmpty(index[3].ToString()) ? (object)DBNull.Value : index[3].ToString());
cmd3.ExecuteNonQuery();


Я не могу сделать еще одну connectonString для вставки цели, потому что я не знаю ни о каких базах данных.

Что я уже пробовал:

Я использую две строки подключения, одну для использования процедуры, а вторую для вставки данных в конкретную базу данных. Я хочу вставить данные во 2-ю строку подключения с именем connString1. Но я не знаю, как я могу это сделать. Мой параметр connectionString:
<add name="connString" connectionString="Data Source=DBSERVER-PC\SQL2012;Database=DB1;User ID=sa;Password=a "providerName="System.Data.SqlClient" />

Есть идеи, как я могу решить эту проблему?

2 Ответов

Рейтинг:
1

phil.o

Я не уверен, что полностью понимаю вашу проблему.
Вы можете объявить несколько строк подключения:

<add name="sourceDb" connectionString="Data Source=DBSERVER-PC\SQL2012;Database=DB1;User ID=sa;Password=a" providerName="System.Data.SqlClient" />

<add name="targetDb1" connectionString="Data Source=DBSERVER-PC\SQL2016;Database=DB1;User ID=sa;Password=b" providerName="System.Data.SqlClient" />

<add name="targetDb2" connectionString="Data Source=DBSERVER2-PC\SQL2013;Database=DB2;User ID=sa;Password=c" providerName="System.Data.SqlClient" />

А позже обратитесь к этим строкам подключения следующим образом:
SqlConnection sourceConn = new SqlConnection
(
   ConfigurationManager.ConnectionStrings["sourceDb"].ConnectionString
);

SqlConnection targetConn1 = new SqlConnection
(
   ConfigurationManager.ConnectionStrings["targetDb1"].ConnectionString
);

SqlConnection targetConn2 = new SqlConnection
(
   ConfigurationManager.ConnectionStrings["targetDb2"].ConnectionString
);

Вы даже можете поместить свои целевые соединения в список и повторять этот список, когда вам это нужно:
List<SqlConnection> targetConnections = new List<SqlConnection>
(
   new SqlConnection[] { targetConn1, targetConn2 }
);

// ...

foreach (SqlConnection conn in targetConnections)
{
   // Do whatever you have to with each target...
}


Рейтинг:
0

MadMyche

Есть несколько способов, которыми это может быть достигнуто; однако в исходном вопросе недостаточно информации, чтобы знать, какой метод будет работать для вас.

Если базы данных находятся на одном сервере и пользователь sql имеет разрешение и вторая база данных для доступа является постоянной вы можете изменить хранимую процедуру для выполнения вставки во вторую БД

ALTER PROCEDURE dbo.SP1 (
  @Value1 INT,
  @Value2 INT
) AS
BEGIN
  INSERT LocalTable (Col1, Col2) 
  VALUES (@Value1, @Value2)

  INSERT SecondDatabase.dbo.RemoteTable (Col1, Col2)
  VALUES (@Value1, @Value2)
END


Если это не так, то вам нужно будет вернуть значения из хранимой процедуры через OUTPUT параметры, а затем извлеките их, откройте второе соединение и выполните другую команду
ALTER PROCEDURE dbo.SP1 (
  @Value1 INT,
  @Value2 INT,
  @Value3 INT OUTPUT
) AS
BEGIN
  INSERT LocalTable (Col1, Col2) 
  VALUES (@Value1, @Value2)

  INSERT SecondDatabase.dbo.RemoteTable (Col1, Col2)
  VALUES (@Value1, @Value2)

  SET @Value3 = @Value1 + @Value2 + @Value3
END
а ваш вызывающий код нужно будет добавить в новый параметр и установить его в OUTPUT или INPUT/OUTPUT
Примечание: Я пропустил использование,попробуйте, поймайте, откройте, закройте для краткости
SqlConnection conn1 = new SqlConnection(ConnectionString1);
SqlCommand cmd1 = new SqlCommand(CommandText1, conn1) {CommandType = CommandType.StoredProcedure};

// Input parameters
cmd1.Parameters.AddWithValue("@Value1", Value1);
cmd1.Parameters.AddWithValue("@Value2", Value2);

// Input/Output parameter
SqlParameter Param3 = new SqlParameter("@Value3", Value3);
Param3.Direction = ParameterDirection.InputOutput;
cmd1.Parameters.Add(Param3);

cmd1.ExecuteNonQuery();
int NewValue3 = (int)Param3.value;

SqlConnection conn2 = new SqlConnection(ConnectionString2);
SqlCommand cmd2 = new SqlCommand(CommandText2, conn2) {CommandType= CommandType.StoredProcedure};

// all input params this time
cmd2.Parameters.AddWithValue("@Value1", Value1);
cmd2.Parameters.AddWithValue("@Value2", Value2);
cmd2.Parameters.AddWithValue("@Value2", Value3);

cmd2.ExecuteNonQuery();

Я надеюсь, что все это поможет