Pracuję z dwiema bazami danych. Z pierwszej bazy danych na serwerze pobieram wszystkie tabele i wstawiam na maszynie lokalnej w jedną pustą bazę danych za pomocą procedury składowanej.

To jest moja procedura przechowywana:

SET ANSI_NULLS ON
 GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[ImportScriptAndData]

@Branch int,
@MainServer varchar(20),
@LocalServer varchar(20),
@LocalDBName varchar(20),
@AuditType int

AS Begin

set nocount on;


-- Delete the master tables

-- dbo.AuditArea
print ('delete from ['+ @LocalServer +'].['+ @LocalDBName +'].[dbo].AuditArea')
exec  ('delete from ['+ @LocalServer +'].['+ @LocalDBName +'].[dbo].AuditArea')

-- Insert data into master tables

-- dbo.AuditArea
print ('insert into ['+ @LocalServer +'].[HDFCAudit].dbo.AuditArea
select * from ['+ @MainServer +'].[HDFCAudit].dbo.AuditArea')
exec ('insert into ['+ @LocalServer +'].['+ @LocalDBName +'].dbo.AuditArea
select * from ['+ @MainServer +'].['+ @LocalDBName +'].dbo.AuditArea')

End

Ta procedura składowana znajduje się w bazie danych serwera.

Podłączam dwa komputery na lan. Jeden to serwer, a drugi to klient

W aplikacji klienckiej mam przycisk, który można kliknąć, gdy chcę przenieść wszystkie tabele z bazy danych serwera do lokalnej pustej bazy danych.

Mój kod przycisku kliknięcia to:

SqlConnection con = new SqlConnection(newConn);  //string newConn = "Data Source=Servername;Initial Catalog=Audit;uid=sa;pwd=admin@123";
            con.Open();
            SqlConnection conn = new SqlConnection(connectionstringLOCAL); //string connectionstringLOCAL = "Data Source=Clientname;Initial Catalog=Audit;uid=sa;pwd=admin@123";
            conn.Open();
            BranchCode = Convert.ToInt32(cboBranch.SelectedValue.ToString());
            MainServer = "Servername";
            LocalServer = "ClientName"; //express
            LocalDatabase = "Audit";
            AuditType = 1;
            SqlCommand cmd = new SqlCommand("dbo.ImportScriptAndData", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@Branch", SqlDbType.Int)).Value = BranchCode;
            cmd.Parameters.Add(new SqlParameter("@MainServer", SqlDbType.VarChar)).Value = MainServer;
            cmd.Parameters.Add(new SqlParameter("@LocalServer", SqlDbType.VarChar)).Value = LocalServer;
            cmd.Parameters.Add(new SqlParameter("@LocalDBName", SqlDbType.VarChar)).Value = LocalDatabase;
            cmd.Parameters.Add(new SqlParameter("@AuditType", SqlDbType.Int)).Value = AuditType;
            //cmd.Parameters.AddWithValue("@Branch", BranchCode);
            //cmd.Parameters.AddWithValue("@MainServer", MainServer);
            //cmd.Parameters.AddWithValue("@LocalServer", LocalServer);
            //cmd.Parameters.AddWithValue("@LocalDBName", LocalDatabase);
            cmd.ExecuteNonQuery(); // **error on this line**

I otrzymuję następujący błąd w tej linii:

Nie można znaleźć serwera „nazwa klienta” w sys.servers. Sprawdź, czy została podana poprawna nazwa serwera. W razie potrzeby wykonaj procedurę składowaną sp_addlinkedserver, aby dodać serwer do sys.servers.

Co zrobić teraz?

0
omkar patade 26 wrzesień 2012, 12:16

2 odpowiedzi

Najlepsza odpowiedź

Uruchamianie zapytań rozproszonych między dwoma serwerami. widziany musi połączyć dwa serwery.

USE master;
GO
EXEC sp_addlinkedserver 
   N'Other Server',
   N'SQL Server';
GO

Link : http://msdn.microsoft.com/fr-fr/library/ms190479 .aspx

0
Aghilas Yakoub 26 wrzesień 2012, 13:08

Najpierw sprawdź tabelę

select * from sys.servers 

Sprawdź, czy zawiera nazwę serwera „nazwa klienta”.

Jeśli nie, musisz dodać serwer połączony, aby wykonać operację wstawiania. Oznacza to, że na komputerze z serwerem musisz dodać nazwę serwera klienta jako serwer połączony.

Lub

Możesz użyć metody C#.net SqlBulkCopy, aby łatwo wykonać transfer danych.

0
AnandPhadke 26 wrzesień 2012, 12:20