构造DataContext类的连接字符串

时间:2012-05-08 02:55:32

标签: asp.net sql sql-server-2008 f# f#-interactive

我看到了几个DataContext连接字符串问题。我将尝试区分这一点:

  1. 如何构建一个到数据库的通用连接字符串localhost用户PC \用户|一些数据库......(由Microsoft SQL 2008托管/管理)

  2. 我注意到它是IDisposable。因此,如果我有多个用户访问我的网站,我的代码一次只能访问数据库一个实例,并且必须等到每个实例都被处理掉,以便每个用户的数据一致吗?

    < / LI>
  3. 是否有可能以某种方式在F#-Interactive中以某种方式启用LINQ,并从那里连接到数据库?我无法弄清楚如何启用/加载System.Data dll到fsi。也许这对我的安装来说是独特的,或者它是一个常见的线程? (即,我的安装也无法识别windows.base.dll - 我必须从程序\引用程序集手动获取它。)

  4. 无论如何,我几乎已经确定地发现了

    let x = new System.Data.Linq.DataContext("localhost") 
    

    ......不起作用。

3 个答案:

答案 0 :(得分:2)

  

1)如何构建数据库的通用连接字符串?

没有通用的方法来构造连接字符串。最好的办法是将连接字符串保存在某个配置文件中,您可以根据您的配置(SQL Server计算机的名称,身份验证选项,无论是基于文件的数据库还是正常)更改连接字符串。有web site with examples for most of the options

  

2)我注意到它是IDisposable。因此,如果我有多个用户访问我的网站,我的代码一次只能访问数据库一个实例?

不,这不是DataContext的工作方式。 DataContext不会保持与服务器的实时连接,阻止其他人使用SQL服务器。它保留了一些状态(即已经获得的缓存实体),并使用optimistic concurrency来确保状态是一致的(如果这是你想要的,你可以使用事务来阻止其他连接)。

  

3)是否有可能以某种方式以某种方式启用F#中的LINQ -Interactive [...]?

那应该不是问题。您可以在F#interactive中使用#r "foo.dll"引用程序集。 F#2.0的典型方法是使用C#工具生成数据上下文,然后引用它(对于F#3.0,事情更容易,因为您可以使用类型提供程序)。

如果在C#中为Northwind生成LINQ to SQL数据上下文,则F#Interactive使用将如下所示:

#r @"<whatever_path>\Northwind.dll"
#r "System.Data.Linq.dll"

open Northwind
open Microsoft.FSharp.Linq

let connStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=<path>\NORTHWND.MDF;" +
              @"Integrated Security=True;User Instance=True"

let operation () =
   // Using 'use' to make sure it gets disposed at the end
   use db = new NorthwindDataContext(connStr)
   // do something with the database

答案 1 :(得分:0)

实际上有一种通用的方法来构造连接字符串:

open System.Data.Common
open System.Data.SqlClient

let providerName = "System.Data.SqlClient"
let factory = DbProviderFactories.GetFactory(providerName)
let cnBuilder = factory.CreateConnectionStringBuilder() :?> SqlConnectionStringBuilder
cnBuilder.DataSource <- "localhost"
cnBuilder.InitialCatalog <- "MyDatabase"
cnBuilder.IntegratedSecurity <- true
let connStr = cnBuilder.ConnectionString

答案 2 :(得分:0)

我的方法是拥有1个连接字符串,然后将其用于我的所有DataContext连接。所以这段代码基于MyConnString构建了EntityConnectionString:

protected override MyEntities CreateObjectContext()
   {
      string ConnString =ConfigurationManager.ConnectionStrings["MyConnString"];

      string seConn = ConfigurationManager.ConnectionStrings["MyEntities"].ToString();

      EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder(seConn);
      ecsb.ProviderConnectionString = ConnString;

      EntityConnection ec = new EntityConnection(ecsb.ToString());

      ScheduleEntities ctx = new ScheduleEntities(ec);

      return ctx;

}