【问题标题】:SQL Compact allow only one WCF ClientSQL Compact 只允许一个 WCF 客户端
【发布时间】:2010-01-15 13:18:13
【问题描述】:

我写了一个小聊天应用程序。为了保存一些信息,例如用户名和密码,我将数据存储在 SQL-Compact 3.5 SP1 数据库中。

一切正常,但如果另一个(同一台机器上的相同 .exe)客户端想要访问服务。它来自第二个客户端的 ServiceReference.Class.Open() 的 EndpointNotFound 异常。

所以我删除了 CE 数据访问代码,我没有收到错误(带有 if (false))

问题出在哪里? 我用谷歌搜索了这个,但似乎没有人跟我得到同样的错误:(

解决方案

我使用了包装器 http://csharponphone.blogspot.com/2007/01/keeping-sqlceconnection-open-and-thread.html 为了安全起见,现在它可以工作了:)


客户代码:

public test()
{
    var newCompositeType = new Client.ServiceReference1.CompositeType();
    newCompositeType.StringValue = "Hallo" + DateTime.Now.ToLongTimeString();

    newCompositeType.Save = (Console.ReadKey().Key == ConsoleKey.J);

    ServiceReference1.Service1Client sc = new Client.ServiceReference1.Service1Client();
    sc.Open(); 
    Console.WriteLine("Save " + newCompositeType.StringValue);
    sc.GetDataUsingDataContract(newCompositeType);
    sc.Close();
}

服务器代码

public CompositeType GetDataUsingDataContract(CompositeType composite)
{
    if (composite.Save)  
    {
        SqlCeConnection con = new SqlCeConnection(Properties.Settings.Default.Con);
        con.Open();

        var com = con.CreateCommand();
        com.CommandText = "SELECT * FROM TEST";

        SqlCeResultSet result = com.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);

        var rec = result.CreateRecord();
        rec["TextField"] = composite.StringValue;
        result.Insert(rec);



        result.Close();
        result.Dispose();
        com.Dispose();
        con.Close();
        con.Dispose();  
    }    
    return composite;
}

【问题讨论】:

  • 我编写了一个具有相同功能的控制台应用程序,添加时没有错误:(我现在不知道它来自哪里...。WCF 有什么不同?
  • 我使用csharponphone.blogspot.com/2007/01/… 中的包装器来保护威胁安全,现在它可以工作了

标签: c# sql-server-ce data-access


【解决方案1】:

在释放 con 对象之前,您没有关闭连接。

试试:

con.Close();
con.Dispose();

【讨论】:

  • 感谢您的快速回复。我试过这个,但没有效果。我将其注释掉并运行,但缺少一些东西。我也使用 Enity Framework 进行了尝试,行为相同。 SqlCeResultSet 结果 = com.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable); var rec = result.CreateRecord(); rec["TextField"] = 复合.StringValue;结果.插入(rec);
  • 谢谢我找到了解决方案,问题是多线程。
【解决方案2】:

可能是在第二个客户端连接时服务初始化期间发生的异常。在运行第二个exe的同时调试服务,

在 VS 中设置异常行为以在引发公共语言运行时异常以及未处理它们时中断,您将看到错误。

正如 tomlog 的回答所述 - 这可能是因为您没有正确关闭连接。

【讨论】:

  • 我设置了一个断点,它没有到达服务器代码的第一行。
  • 现在运行一次,如果我设置一些断点并对其进行调试:(
  • 您是否开启了所有异常(调试 -> 异常 -> 勾选通用语言运行时异常旁边的“抛出”复选框)。我的理论是,它在尝试为第二个客户端初始化服务实例并轰炸时抛出异常。 WCF 将吞下异常,因此您需要启用“所有异常中断”。
  • 谢谢安德拉斯,我试过了,但没有结果。我找到了一个解决方案。
【解决方案3】:

我使用http://csharponphone.blogspot.com/2007/01/keeping-sqlceconnection-open-and-thread.html 中的包装器来保证威胁安全,现在它可以工作了 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2013-12-22
    • 2013-08-05
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多