2017-12-27 508 views
0

事实证明,我与SignalR,凡在HTML视图我提出以下要求到客户工作:SelectCommand.Connection属性尚未初始化。 MySQL的

var myHub = $.connection.myHub; 
    var direccionWeb = $("#direccionWeb").val().toString(); 
    $.connection.hub.url = direccionWeb + "/signalr"; 
    $.connection.hub.start().done(function() { 
     myHub.server.broadcastMessageToPrinterReportTicket(global_venta, global_mesa, nombregarzon, idgrupo, grupo); 

    }).fail(function (error) { 
     console.error(error); 
    }); 

轮毂文件我有以下几点:

public void BroadcastMessageToPrinterReportTicket(String global_venta,String global_mesa,String nombregarzon,String idgrupo, String grupo) 
{ 
    string namePrinter = group; 
    DataTable dt = new DataTable(); 

    string sql = "SELECT " + 
     "cant," + 
     "det " + 
     "FROM producto " +     
     "WHERE [email protected]_venta AND venta>0 AND [email protected] AND comandasd.pedido=0"; 
    conexion.conectar(); 

    using (MySqlCommand command = new MySqlCommand(sql, conexion.con)) 
    { 
     command.Parameters.AddWithValue("@global_venta", global_venta); 
     command.Parameters.AddWithValue("@idgrupo", idgrupo); 
     using (MySqlDataAdapter reader = new MySqlDataAdapter(command)) 
     { 
      using (MySqlDataAdapter sda = new MySqlDataAdapter(command)) 
      { 
       sda.Fill(dt); 
      } 
     } 
    } 
    conexion.cerrar(); 


    Clients.All.printReport(datos, ........); 
} 

包含连接类的文件如下:

public void conectar() 
{ 
    try 
    { 
     string ip = HttpContext.Current.Session["ip"].ToString(); 
     string db = HttpContext.Current.Session["db"].ToString(); 
     string user = HttpContext.Current.Session["user"].ToString(); 
     string pass = HttpContext.Current.Session["pass"].ToString(); 

     con = new MySqlConnection("server=" + ip + ";user id=" + user + ";password=" + pass + ";database=" + db + ";port=3306;Allow User Variables=true"); 
     con.Open(); 
    } 
    catch 
    { 

    } 
} 

但是当我尝试将数据添加到数据表,也就是上线,其中sda.Fill(DT)说,出现以下错误:SelectCommand.Connection属性尚未初始化。

奇怪的是,当我使用它是在控制器中声明相同的功能,它工作正常。我想要的是能够使用BroadcastMessageToPrinterReportTicket接收的参数获取数据表并将其发送给客户端。

如果有人知道如何纠正错误,或者一些帮助,将不胜感激。

问候

+0

您是否能够确认如果你有一个通过集线器的实际会话?我怀疑不会,意味着你的连接字符串不包含IP,Db,用户或传递。另外,是否有理由使用会话来存储数据库信誉,而不是说web.config? – Darren

+0

@Darren Tengo un archivo clase que uso para conectarme。在这里您可以找到关于会议中心变量的更多信息。 Las variables de session del archivo clase deconecciónlas necesito para rescatar sus valores y trabajarlos – Danilo

+0

@Danilo这是主要的英文网站,但也有其他的,如[Stack Overflow enEspañol](https://es.stackoverflow。 com)如果这是一种更方便的语言供您沟通。 – tadman

回答

1

的SelectCommand.Connection属性尚未初始化

MySqlCommand.Connection属性需要可以使用的命令之前进行设置。例外是告诉你它还没有设置。

您使用,设置它的构造:

using (MySqlCommand command = new MySqlCommand(sql, conexion.con)) 

的逻辑推论是,conexion.con == null。我们发现con设置在conectar。但是,该代码周围有一个try/catch块。因此,在分配con之前,必须抛出异常(并忽略)。

最可能的解释是,HttpContext.Current.Session["..."]值中的一个(或多个)是null,因此调用.ToString()它抛出一个NullReferenceException

建议:

  1. 不要捕捉和忽略例外;他们经常表示需要正确处理的真正问题。
  2. 会话状态似乎是一个非常奇怪的地方存储数据库凭证;改为使用web.config设置。 (或者您可能希望刚开始时对它们进行硬编码以查看是否可以使代码的其余部分正常工作,然后在知道其他所有内容都正确时将它们移动到Settings)。
+0

你是对的。在我的情况下,我使用的会话变量可以正常工作,但是我意识到,当我从signalR的HUB文件调用连接文件时,会话变量被删除,即使我声明了任何会话变量,也不允许它,因为我得到一个错误。我发现由于某种原因,它不允许我使用会话变量 – Danilo

+0

@Danilo如果回答了问题,请接受答案(点击“打勾”图标)。 –

+0

我找到了解决方案,会发生什么情况是在Hub中,它不会与会话变量一起工作,所以我不得不用全局变量替换它,因为在连接文件中我有会话变量 – Danilo

相关问题