SQL Server消息输出上的C#句柄[重复]

     2023-02-24     56

关键词:

【中文标题】SQL Server消息输出上的C#句柄[重复]【英文标题】:C# Handle on SQL Server Message Output [duplicate] 【发布时间】:2011-12-01 14:33:32 【问题描述】:

在 SQL Server Management Studio 中执行脚本时,通常会生成显示在消息窗口中的消息。例如在运行数据库备份时:

10% 已处理。

20% 已处理。

等等……

为数据库“Sample”处理了 1722608 个页面,文件 1 上的文件“Sampe”。

100% 已处理。

为数据库“Sample”处理了 1 页,文件 1 上的文件“Sample_Log”。

BACKUP DATABASE 在 202.985 成功处理了 1722609 个页面 秒(66.299 MB/秒)。

我希望能够在针对数据库运行 SQL 脚本的 C# 应用程序中显示这些消息。但是,我无法弄清楚如何处理生成的 SQL 消息输出。有人知道怎么做这个吗?我必须使用哪种连接框架对我来说并不重要。我对 LINQ、NHibernate、Entity Framework、ADO.Net、Enterprise Library 比较熟悉,并且很高兴学习新的。

【问题讨论】:

【参考方案1】:

这是我尝试过的示例代码,它适用于我。 http://www.dotnetcurry.com/ShowArticle.aspx?ID=344

请注意,您需要的代码实际上是这部分:

cn.Open();
cn.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
                                    
         txtMessages.Text += "\n" + e.Message;                                   
;

是e.Message不断将消息返回给txtMessages(您可以替换为TextBox或Label)。

您也可以参考这篇文章: Backup SQL Server Database with progress

我的代码示例如下:

//The idea of the following code is to display the progress on a progressbar using the value returning from the SQL Server message. 
//When done, it will show the final message on the textbox. 
String connectionString = "Data Source=server;Integrated Security=SSPI;";
SqlConnection sqlConnection = new SqlConnection(connectionString);

public void DatabaseWork(SqlConnection con)

    con.FireInfoMessageEventOnUserErrors = true;
    //con.InfoMessage += OnInfoMessage;
    con.Open();
    con.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
    
        //Use textBox due to textBox has Invoke function. You can also utilize other way. 
        this.textBox.Invoke(
            (MethodInvoker)delegate()
            
                int num1;
                //Get the message from e.Message index 0 to the length of first ' '
                bool res = int.TryParse(e.Message.Substring(0, e.Message.IndexOf(' ')), out num1);

                //If the substring can convert to integer
                if (res)
                
                    //keep updating progressbar
                    this.progressBar.Value = int.Parse(e.Message.Substring(0, e.Message.IndexOf(' ')));
                
                else
                
                    //Check status from message 
                    int succ;
                    succ = textBox.Text.IndexOf("successfully");
                    //or succ = e.Message.IndexOf("successfully");  //get result from e.Message directly
                    if (succ != -1) //If IndexOf find nothing, it will return -1
                    
                        progressBar.Value = 100;
                        MessageBox.Show("Done!");
                    
                    else
                    
                        progressBar.Value = 0;
                        MessageBox.Show("Error, backup failed!");
                     
                
            
        );
    ;
    using (var cmd = new SqlCommand(string.Format(
        "Your SQL Script"//,
        //QuoteIdentifier(databaseName),
        //QuoteString(Filename)//,
        //QuoteString(backupDescription),
        //QuoteString(backupName)
        ), con))
    
        //Set timeout = 1200 seconds (equal 20 minutes, you can set smaller value for shoter time out. 
        cmd.CommandTimeout = 1200;
        cmd.ExecuteNonQuery();
    
    con.Close();
    //con.InfoMessage -= OnInfoMessage;
    con.FireInfoMessageEventOnUserErrors = false;

为了让进度条正常工作,您需要使用后台工作程序来实现这一点,这样您的应用程序就不会冻结并突然 100% 完成。

【讨论】:

【参考方案2】:

SqlConnection.InfoMessage 事件在 SQL Server 返回警告或信息性消息时发生。 This website 展示了一种可能的实现方式。

【讨论】:

方法名称预期 C# SQL Server Visual Studio 2019 [重复]

】方法名称预期C#SQLServerVisualStudio2019[重复]【英文标题】:MethodnameexpectedC#SQLServervisualstudio2019[duplicate]【发布时间】:2020-12-0517:33:29【问题描述】:我正在尝试从数据源读取数据,但在ExecuteReader方法中出现此错误,当我尝试在某... 查看详情

使用 C# 连接到服务器上的 SQL Server 数据库

】使用C#连接到服务器上的SQLServer数据库【英文标题】:ConnectingtoSQLServerdatabaseonaserverwithC#【发布时间】:2015-05-2618:13:42【问题描述】:我正在尝试使用我的C#程序连接到服务器上的数据库,但连接一直超时。我的连接字符串是:... 查看详情

如何使用 C# 将数据表从 SQL Server 转换为 Excel [重复]

】如何使用C#将数据表从SQLServer转换为Excel[重复]【英文标题】:HowtoconvertdatatablefromSQLServertoExcelusingC#[duplicate]【发布时间】:2019-12-0523:18:33【问题描述】:我想下载一个Excel文件,其中包含C#中SQLServer表中的数据。获得它的最佳方... 查看详情

如何捕获从 SQL Server 到 C# 应用程序的消息选项卡的所有内容?

】如何捕获从SQLServer到C#应用程序的消息选项卡的所有内容?【英文标题】:HowtocaptureeverythingfromMessageTabfromSQLServertoC#Application?【发布时间】:2019-08-1604:04:44【问题描述】:我的应用程序的一点点背景。我正在使用C#开发FileWatcherW... 查看详情

在sql server中格式化日期输出[重复]

】在sqlserver中格式化日期输出[重复]【英文标题】:formatingdateoutputinsqlserver[duplicate]【发布时间】:2013-09-2019:13:56【问题描述】:我的表中有nvarchar(255)列。数据格式为9/4/2013SELECTYEAR([LastRevisionDate])+\'-\'+MONTH([LastRevisionDate])+\'-\'+DAY([... 查看详情

SSIS 包中的 C# 脚本在 SQL Server 表的数据执行过程中挂起,没有明确的错误消息

】SSIS包中的C#脚本在SQLServer表的数据执行过程中挂起,没有明确的错误消息【英文标题】:C#scriptinSSISpackagehangsinthemiddleofdataimplementationtoSQLServertablewithnoclearerrormessage【发布时间】:2021-02-0311:40:46【问题描述】:我不是C#专家,但... 查看详情

无法将数据从 DataSet 更新到 C# 和 SQL Server 上的数据库

】无法将数据从DataSet更新到C#和SQLServer上的数据库【英文标题】:Can\'tupdatedatafromDataSettodatabaseonC#&SQLServer【发布时间】:2018-05-1602:50:04【问题描述】:我正在编写一个关于使用C#和SQLServer进行库存管理的桌面应用程序。现在我... 查看详情

SQL Server 2005 上的“警告:没有看到 LOP_CKPT_END”消息是啥意思?

】SQLServer2005上的“警告:没有看到LOP_CKPT_END”消息是啥意思?【英文标题】:Whatdoesa"WARNING:didnotseeLOP_CKPT_END"messagemeanonSQLServer2005?SQLServer2005上的“警告:没有看到LOP_CKPT_END”消息是什么意思?【发布时间】:2008-09-1912:44:4... 查看详情

使用 c# 创建新的 sql server 表

】使用c#创建新的sqlserver表【英文标题】:Creatingnewsqlservertablewithc#【发布时间】:2011-05-3106:36:03【问题描述】:我有这段代码来创建新的sql表当我执行此操作时,它会显示屏幕截图上的此错误。在我的数据库中没有这样的表。它... 查看详情

C# - MySQL 与 Microsoft SQL Server [关闭]

】C#-MySQL与MicrosoftSQLServer[关闭]【英文标题】:C#-MySQLvsMicrosoftSQLServer[closed]【发布时间】:2010-12-1723:41:30【问题描述】:很长一段时间以来,我一直在使用MySQL服务器来处理数据(在JAVA和C#中)。但最近,我听到了有关LINQ和SQLServe... 查看详情

SQL SERVER 2012 表修改 [重复]

】SQLSERVER2012表修改[重复]【英文标题】:SQLSERVER2012tablemodify[duplicate]【发布时间】:2013-10-0816:49:29【问题描述】:我使用的是VB2012和SQLServer2012。我将一个表从Access数据库(2000格式)导出到SQLServer2012。但SQLServer不允许我修改该表... 查看详情

谁帮我把这段易语言代码写成c#代码?

...内容,对游戏有效(无返回值).参数窗口句柄,整数型,,接收消息的窗口句柄.参数文本内容,文本型,,发送的文本内容.局部变量消息,字节集.局部变量计次,整数型消息=到字节集(文本内容).计次循环首(取字节集长度(消息),计次)投递消... 查看详情

通过 ADO.NET 访问 SQL Server 消息

】通过ADO.NET访问SQLServer消息【英文标题】:AccesstoSQLServermessagesviaADO.NET【发布时间】:2009-04-1909:45:27【问题描述】:是否可以通过ADO.NET访问SQLServer“副产品消息”?由于缺少文字,“副产品消息”是指出现在MicrosoftSQLServerManageme... 查看详情

C# - 使项目 MySQL 和 SQL Server 兼容

】C#-使项目MySQL和SQLServer兼容【英文标题】:C#-MakeaprojectMySQLandSQLServercompatible【发布时间】:2018-12-1310:46:49【问题描述】:我正在开发一个希望MySQL和MSQL兼容的项目。一切正常,但我有一个关于代码重复的小问题:我对所有数据... 查看详情

通过查询创建SQL Server的数据库脚本[重复]

】通过查询创建SQLServer的数据库脚本[重复]【英文标题】:CreatedatabasescriptofSQLServerthroughquery[duplicate]【发布时间】:2016-01-2704:07:59【问题描述】:我是C#和SQLServer编程的新手。我有一个项目,我必须在每次交易后自动创建数据库... 查看详情

通过 C# 查询时 SQL Server 2005 区分大小写

】通过C#查询时SQLServer2005区分大小写【英文标题】:SQLServer2005CaseSensitivewhenqueriedviaC#【发布时间】:2012-04-1714:34:21【问题描述】:我在安装一个在多个客户站点上运行良好的产品时遇到了问题,我相信这个问题与他们数据库服务... 查看详情

选择没有时间的日期(SQL Server(+)[重复]

】选择没有时间的日期(SQLServer(+)[重复]【英文标题】:Selectadatewithouttime(SQLServer(+)[duplicate]【发布时间】:2016-07-1804:11:49【问题描述】:我想检索一个负1年的日期,但没有时间符号。以下查询SELECTDATEADD(year,-1,GETDATE())输出:20... 查看详情

c#调用win32api的sendmessage函数,里面的属性用法?

...WPARAMwParam,LPARAMIParam);参数:hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发... 查看详情