如何检查Linq2Sql应用程序中的连接,以便在失败时不冻结?

时间:2014-05-06 19:42:29

标签: c# linq-to-sql sqlconnection

所以我一直在为我的C#项目使用LINQ to SQL(dbml),因为它使我很容易集成SQL ..唯一的事情是一切都是如此自动化,我不知道如何实际上是编辑东西。

使用LINQ to SQL使它能够在配置文件中创建的连接字符串中使用用户和pw自动连接到数据库IP,但是说数据库没有启动...或者我想要更改IP ..应用程序在启动时冻结。

如何在自动连接之前测试连接?我似乎无法在代码中找到它的确切位置。

2 个答案:

答案 0 :(得分:2)

您对实体的设置,我在Linq to SQL上生锈但认为它类似,是在您创建Linq to SQL模型的项目的App.Config中。它们与此类似(使用实体模型):

    < connectionStrings>
    < add name="Example" connectionString="metadata=res://*/ExampleDB.csdl|res://*/ExampleDB.ssdl|res://*/ExampleDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=ACTUALSERVER;initial catalog=ACTUALDATABASE;persist security info=True;user id=(SET USER HERE);password=(SET PASSWORD HERE);multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    < /connectionStrings>

连接的重要部分是连接字符串:

&quot;data source=ACTUALSERVER;initial catalog=ACTUALDATABASE;persist security info=True;user id=(SET USER HERE);password=(SET PASSWORD HERE);

如果需要,您可以尝试将其更改为不同的连接字符串,并保持元数据相同。对于不同的环境,如“Dev”,“QA”,“UAT”,“PROD”等...然后复制并粘贴以'&lt;'开头的连接块。添加name =“'直到'providerName ='(thing)'/&gt;的结尾部分。然后只需更改连接字符串并给它一个不同的名称。然后你可以让调用代码使用不同的上下文或连接,如:

using(MyContext context = new MyContext())
{
context.Connection = (new connection)

 (your data return method)
}

您可以直接在上下文的构造函数(MyContext)中执行此操作。不记得了。通常我通常会设置多个配置“DEV”,“QA”,“UAT”,“PROD”,并为不同的服务环境构建它们。您可以手动构建连接字符串,但动态连接字符串可能会很困难,因为开发人员现在需要确保一些事情:

  1. Dev环境的模型与模型中的对象完全匹配。如果没有再见代码返回。
  2. 如果您正在调用设置用户,以确保您的用户拥有某些环境的权利
  3. 您没有公开显示用户设置,从而使代码的完整性受到威胁。

答案 1 :(得分:1)

(所有假设您正在使用Sql Server)

扩展djangojazz's answer

public void TestDbConnection()
{
  Task.Factory.StartNew(() =>
  {
    bool isAvailable = false;
    using(MyContext context = new MyContext())
    {
      var connection = ((IObjectContext)context).Connection as SqlConnection;

      try
      {
        connection.Open();
        isAvailble = true;
      }
      catch (Exception ex)
      {
      }
    }
    TestDbConnectionComplete(isAvailable);
  });
}

public void TestDbConnectionComplete(bool isAvailable)
{
}