"Login Failed" 使用 SMO 创建带有 ScriptData 选项的 SQL 脚本时
"Login Failed" when using SMO to create SQL script with the ScriptData option
我正在尝试导出和导入数据库架构及其中的数据。我正在使用 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());
会产生异常。
Login failed for user 'SpectroGrassAdmin'.
我不确定为什么会收到此特定错误。我只能假设问题出在其他地方,因为如果我只想导出模式,登录到服务器并连接到数据库工作正常。
我是否遗漏了一些能够为 table 数据创建脚本的其他选项?
尽量简化。
smo 的特点是默认情况下它 points/connects 到默认 sql 实例。
是否碰巧您在 运行 您的应用程序的机器上有一个默认实例,并且您正在尝试 smo 到另一个实例? (您机器上的辅助实例或另一台机器上的远程实例)。
以下内容是from an example of 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();
}
}
}
我正在尝试导出和导入数据库架构及其中的数据。我正在使用 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());
会产生异常。
Login failed for user 'SpectroGrassAdmin'.
我不确定为什么会收到此特定错误。我只能假设问题出在其他地方,因为如果我只想导出模式,登录到服务器并连接到数据库工作正常。
我是否遗漏了一些能够为 table 数据创建脚本的其他选项?
尽量简化。 smo 的特点是默认情况下它 points/connects 到默认 sql 实例。
是否碰巧您在 运行 您的应用程序的机器上有一个默认实例,并且您正在尝试 smo 到另一个实例? (您机器上的辅助实例或另一台机器上的远程实例)。
以下内容是from an example of 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();
}
}
}