2012-05-08 31 views
1

我看到一些DataContext連接字符串問題。我將嘗試區分這一點:構造DataContext類的連接字符串

  1. 如何構造一個通用連接字符串到數據庫localhost |用戶PC \用戶|某些數據庫...(它由Microsoft SQL 2008託管/管理)

  2. 我注意到它是IDisposable。因此,如果我有多個用戶訪問我的網站,我的代碼一次只能訪問一個實例的數據庫,並且必須等到每個實例處置完畢,才能讓每個用戶的數據保持一致。

  3. 是否有可能以某種方式啓用F#中的LINQ -Interactive,並從那裏連接到數據庫?我不知道如何啓用/加載System.Data dll到fsi。也許這對我的安裝是獨特的,或者它是一個共同的線程? (即,我的安裝也無法識別windows.base.dll - 我必須手動從程序\引用程序集中獲取它)。

無論如何,我已經差不多確鑿發現

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

...不起作用。

回答

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 
+0

謝謝你。這正是我所需要的:計算機和可以放入自定義配置文件的可讀內容之間的緩衝區。 – chris

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#中生成的LINQ to SQL數據上下文Northwind,F#交互使用是這樣的:

#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 
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; 

}