Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从其他类订阅SQL InfoMessage?_C#_Sql - Fatal编程技术网

C# 如何从其他类订阅SQL InfoMessage?

C# 如何从其他类订阅SQL InfoMessage?,c#,sql,C#,Sql,我有两门课: Class Home这是我的表单,有一个列表框,等待从Class SQL发送的所有信息 我想知道如何将Class SQLInfoMessages传递到Class Home 在类SQL中我的代码如下: public void runSqlCmd(string sqlCmd, Boolean dsRequired) { try { using (SqlConnection con = new SqlConnection(conString))

我有两门课:

Class Home
这是我的表单,有一个列表框,等待从
Class SQL
发送的所有信息

我想知道如何将
Class SQL
InfoMessages
传递到
Class Home

类SQL中
我的代码如下:

public void runSqlCmd(string sqlCmd, Boolean dsRequired)
{
    try
    {
        using (SqlConnection con = new SqlConnection(conString))
        {
            try
            {
                con.Open();
                con.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)
                {
                     sqlMsg += "\n" + e.Message;
                };

                if (dsRequired)
                {
                    ds.Clear();
                    SqlDataAdapter da = new SqlDataAdapter(sqlCmd, con);
                    da.Fill(ds);
                }
                else if (!dsRequired)
                {
                    using (SqlCommand cmd = new SqlCommand(sqlCmd, con))
                    {
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (SqlException sqlEx)
            {
                throw sqlEx;
            }
            finally
            {
                con.Close();
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
如果该代码具有:

con.InfoMessage += delegate (object sender, SqlInfoMessageEventArgs e)
                        {
                             sqlMsg += "\n" + e.Message;
                        };
这就是我想要的

我的
ClassHome
代码是:

private void btn_getLocation_Click(object sender, EventArgs e)
{
    try
    {
        tb_location.Clear();
        if (cb_database.Text != null)
        {
            updateConString();
            _sql.runSqlCmd(_sqlScripts.getLocation, _sqlScripts.dsRequired);
            foreach (DataTable table in _sql.ds.Tables)
            {
                foreach (DataRow dr in table.Rows)
                {
                    tb_location.Text = dr[1].ToString();
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString(), ex.Message.ToString());
    }
}

您可以在本文中找到示例

你需要写这样的东西

public class ClassHome
{
    public static void ConnectionInfoMessage(object sender, SqlInfoMessageEventArgs e)
    {
        if (e.Errors.Count > 0)
        {
            // Check to make sure we are information only messages
            Console.WriteLine("Received {0} messages", e.Errors.Count);
            foreach (SqlError info in e.Errors)
            {
                if (info.Class > 9) // Severity
                {
                    Console.WriteLine("Error Message : {0} :   State : {1}", info.Message, info.State);
                }
                else
                {
                    Console.WriteLine("Info Message : {0} :   State : {1}", info.Message, info.State);
                }
            }
        }
        else
        {
            Console.WriteLine("Received Connection Info Message : {0}", e.Message);
        }
    }
}
然后从SQL类订阅

command.Connection.InfoMessage += ClassHome.ConnectionInfoMessage;

我可以用
lb.Items.Add
(其中lb=listbox)替换
Console.WriteLine
。My
ClassHome
有一个提交SQL语句的函数。
ConnectionInfoMessage
是否单独工作,或者如何将它们合并在一起。是的,您可以替换。对于第二个问题-ConnectionInfoMessage只需自己处理,不要捕获并立即重新播放。捕捉的要点是处理错误——如果你没有真正处理它,那么首先就不要捕捉!不要抛出sqlEx。您丢失了堆栈跟踪,调试起来更加混乱。只要把
扔出去如果要重新引发相同的异常,或者创建一个新异常,将原始异常作为内部异常并引发新异常。