«Ошибка входа» при использовании SMO ​​для создания сценария SQL с параметром ScriptData - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь экспортировать и импортировать схему базы данных и данные внутри. Для этого я использую SMO (объекты управления сервером), но хотя экспорт схемы работает нормально, установка ScriptData в true в параметрах сценариев приведет к исключению.

Server server = new Server(new ServerConnection(sqlCon));
Database database = server.Databases["SpectroGrass"];
ScriptingOptions options = new ScriptingOptions();
options.ScriptSchema = true;
options.ScriptData = false;
options.ScriptDrops = false;

string scriptData = String.Join("\r\n", database.Tables[tableName].EnumScript(options).ToList());

Создает схему и работает.

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON

CREATE TABLE [SpectroGrassAdmin].[Treatment]
(
    [TRM_ID] [int] NOT NULL,
    [TRM_Name] [varchar](150) COLLATE Latin1_General_CI_AS NULL,
    [TRM_Crop] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL
) ON [PRIMARY]

Но использование опции ScriptData ...

options.ScriptSchema = false;
options.ScriptData = true;
options.ScriptDrops = false;

string scriptData = String.Join("\r\n", database.Tables[tableName].EnumScript(options).ToList());

создаст исключение.

Ошибка входа для пользователя «SpectroGrassAdmin».

Я не уверен, почему я получаю эту указанную c ошибку. Я могу только предположить, что проблема кроется где-то еще, потому что вход на сервер и подключение к базе данных работает нормально, если я только хочу, чтобы схема экспортировалась.

Мне не хватает некоторых других параметров, чтобы иметь возможность создать сценарий для табличных данных?

1 Ответ

0 голосов
/ 13 января 2020

Постарайтесь максимально упростить это. Особенность smo заключается в том, что по умолчанию он указывает / подключается к экземпляру sql по умолчанию.

Бывает ли так, что у вас есть экземпляр по умолчанию на компьютере, на котором вы запускаете приложение, и вы пытаетесь копировать? другой экземпляр? (либо вторичный на вашем компьютере, либо удаленный экземпляр на другом компьютере).

Следующее было взято из примера smo с использованием ServerConnection, , который позволяет повторно использовать информацию о соединении .

//  https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/connecting-to-an-instance-of-sql-server?view=sql-server-ver15#connecting-to-an-instance-of-sql-server-by-using-sql-server-authentication-in-visual-c

//// compile with:   
// /r:Microsoft.SqlServer.Smo.dll  
// /r:Microsoft.SqlServer.ConnectionInfo.dll  
// /r:Microsoft.SqlServer.Management.Sdk.Sfc.dll   

using System;
using System.Linq;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace SMOConsoleApp
{
    class Program
    {
        static void Main()
        {

            // For remote connection, remote server name / ServerInstance needs to be specified  
            ServerConnection srvConn2 = new ServerConnection("machinename"/* <--default sql instance on machinename*/);  // or (@"machinename\sqlinstance") for named instances
            srvConn2.LoginSecure = false;
            srvConn2.Login = "sql_login_goes_here";
            srvConn2.Password = "password_goes_here";
            Server srv3 = new Server(srvConn2);

            Console.WriteLine("servername:{0} ---- version:{1}", srv3.Name, srv3.Information.Version);   // connection is established  
            Console.WriteLine(srv3.ConnectionContext); //check connection context

            ScriptingOptions scriptoptions = new ScriptingOptions();
            scriptoptions.ScriptSchema = true;
            scriptoptions.ScriptData = true;
            scriptoptions.ScriptDrops = false;

            Database mydb = srv3.Databases["master"];
            /*
                --execute this in ssms, in the master db
                select *
                into dbo.testsysobjects
                from sys.objects
            */
            Table mytable = mydb.Tables["testsysobjects", "dbo"];

            Console.WriteLine("database: {0} ---- table: {1} ---- rowcount: {2}", mytable.Parent.Name, mytable.Name, mytable.RowCount); //check table

            string scriptData = String.Join("\r\n", mytable.EnumScript(scriptoptions).ToList());

            Console.Write(scriptData);

            srvConn2.Disconnect();

        }
    }
}
...