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