這兩天幫一個朋友調試使用BDC(Business Data Catalog)來串連MySql中的資料,發現不少需要特別注意的地方。在使用BDC串連時,MySql和MS Sql Server的區別還是很大的。
我的朋友在伺服器上是使用的MyODBC這個Driver。對於LobSystemInstance的定義,基本類似:
<LobSystemInstance Name="MySQL_Lob">
<Properties>
<Property Name="rdbconnection Driver" Type="System.String">{MySQL ODBC 3.51 Driver}</Property>
<Property Name="rdbconnection server" Type="System.String">MySQL伺服器名稱</Property>
<Property Name="rdbconnection database" Type="System.String">MySQL Database名稱</Property>
<Property Name="rdbconnection user" Type="System.String">root</Property>
<Property Name="rdbconnection password" Type="System.String">123456</Property>
<Property Name="rdbconnection option" Type="System.String">3</Property>
<Property Name="RdbConnection Trusted_Connection" Type="System.String">true</Property>
<Property Name="DatabaseAccessProvider" Type="Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.Db.DbAccessProvider">Odbc</Property>
<Property Name="AuthenticationMode" Type="Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.Db.DbAuthenticationMode">PassThrough</Property>
</Properties>
</LobSystemInstance>
不同的Database Driver,其Connection String是不同的。所以如果你使用的並非MyODBC Driver,那麼LobSystemInstance的寫法會有不同。
由於我對MySQL並不熟悉,所以在寫Entity的Method的時候,又遇到不少問題。其中之一是SQL語句的Parameter的問題。對於MS SqlServer,我們可以使用類似“@ParameterName”的格式來定義SQL語句中的參數。但是,這對於MySQL並不一定有效。使用不同的Database Driver去串連MySQL,對於參數,都有不同的定義方法。我搜尋了一下MyODBC的文檔,發現它不支援具名引數,而直接使用“?”來代表參數,然後按照順序來添加參數的值。
所以,在寫Entity Method的SQL查詢語句時,如果其中有參數,就只能寫成類似:
Select CustomerID, CustomerName, ContactName from Customers where CustomerID = ?
但是Entity中Parameter的定義,仍然可以按與具名引數一模一樣的寫法即可。