C# 如何从Sql Server系统消息中获取返回值?
我正在尝试对sql server Express使用命令验证我刚才在c#中完成的备份C# 如何从Sql Server系统消息中获取返回值?,c#,sql,sql-server,smo,C#,Sql,Sql Server,Smo,我正在尝试对sql server Express使用命令验证我刚才在c#中完成的备份 string _commandText = string.Format("RESTORE VERIFYONLY FROM DISK = '{0}'", backupLocation); SqlDataReader _sqlDataReader = SqlHelper.ExecuteReader("BookssortedSQLDbConnection", CommandType.Text, _comman
string _commandText = string.Format("RESTORE VERIFYONLY FROM DISK = '{0}'", backupLocation);
SqlDataReader _sqlDataReader = SqlHelper.ExecuteReader("BookssortedSQLDbConnection", CommandType.Text, _commandText);
如果在SSMS中执行该命令,它将返回“文件1上的备份集有效”。但如何将该消息返回到代码中
读卡器无法工作,因为没有返回行
注意:我已经尝试了SMO.Restore对象来尝试和验证它,但它不起作用,这就是我这样做的原因
_restore.SqlVerify(srv, out _errorMessage); //returns false even though bakcup is fine
顺便说一句-接受建议,因为我不认为这是实现我尝试的目标的理想方式将ssms消息检索到前端应用程序非常困难。但是,您可以将消息写入文本文件,然后从文件中读取数据
declare @cmd varchar(1000)
SET @cmd = 'osql -S YourServer -E -d YourDatabase -q "RESTORE VERIFYONLY FROM DISK=''c:\yourBackup.bkp''" -o c:\result.txt'
EXEC master.dbo.xp_cmdshell @cmd
您可以从应用程序中执行上述sql语句,然后从result.txt文件读取结果(严重性小于10的)信息性消息和打印输出返回到客户端,并由SqlConnection
实例作为InfoMessage
事件引发。每个事件都包含SqlError
对象的集合(这与SqlException.Errors
中使用的类相同)
下面是一个完整的示例,显示连接状态更改、信息消息和异常。请注意,我使用了ExecuteReader
而不是ExecuteNonQuery
,但是信息和异常结果是相同的
namespace Test
{
using System;
using System.Data;
using System.Data.SqlClient;
public class Program
{
public static int Main(string[] args)
{
if (args.Length != 2)
{
Usage();
return 1;
}
var conn = args[0];
var sqlText = args[1];
ShowSqlErrorsAndInfo(conn, sqlText);
return 0;
}
private static void Usage()
{
Console.WriteLine("Usage: sqlServerConnectionString sqlCommand");
Console.WriteLine("");
Console.WriteLine(" example: \"Data Source=.;Integrated Security=true\" \"DBCC CHECKDB\"");
}
public static void ShowSqlErrorsAndInfo(string connectionString, string query)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.StateChange += OnStateChange;
connection.InfoMessage += OnInfoMessage;
SqlCommand command = new SqlCommand(query, connection);
try
{
command.Connection.Open();
Console.WriteLine("Command execution starting.");
SqlDataReader dr = command.ExecuteReader();
if (dr.HasRows)
{
Console.WriteLine("Rows returned.");
while (dr.Read())
{
for (int idx = 0; idx < dr.FieldCount; idx++)
{
Console.Write("{0} ", dr[idx].ToString());
}
Console.WriteLine();
}
}
Console.WriteLine("Command execution complete.");
}
catch (SqlException ex)
{
DisplaySqlErrors(ex);
}
finally
{
command.Connection.Close();
}
}
}
private static void DisplaySqlErrors(SqlException exception)
{
foreach (SqlError err in exception.Errors)
{
Console.WriteLine("ERROR: {0}", err.Message);
}
}
private static void OnInfoMessage(object sender, SqlInfoMessageEventArgs e)
{
foreach (SqlError info in e.Errors)
{
Console.WriteLine("INFO: {0}", info.Message);
}
}
private static void OnStateChange(object sender, StateChangeEventArgs e)
{
Console.WriteLine("Connection state changed: {0} => {1}", e.OriginalState, e.CurrentState);
}
}
}
名称空间测试
{
使用制度;
使用系统数据;
使用System.Data.SqlClient;
公共课程
{
公共静态int Main(字符串[]args)
{
如果(参数长度!=2)
{
用法();
返回1;
}
var conn=args[0];
var sqlText=args[1];
ShowSqlErrorsAndInfo(conn、sqlText);
返回0;
}
私有静态void用法()
{
WriteLine(“用法:sqlServerConnectionString sqlCommand”);
控制台。写线(“”);
WriteLine(“示例:\”数据源=;集成安全性=true\“\”DBCC CHECKDB\”);
}
公共静态void ShowSqlErrorsAndInfo(字符串连接字符串,字符串查询)
{
使用(SqlConnection连接=新的SqlConnection(connectionString))
{
connection.StateChange+=OnStateChange;
connection.InfoMessage+=OnInfoMessage;
SqlCommand=newsqlcommand(查询、连接);
尝试
{
command.Connection.Open();
WriteLine(“命令执行开始”);
SqlDataReader dr=command.ExecuteReader();
如果(哈斯罗博士)
{
WriteLine(“返回的行”);
while(dr.Read())
{
对于(int idx=0;idx{1}”,e.OriginalState,e.CurrentState);
}
}
}