2016-09-12 28 views
3

In this articleSqlCommandProviderタイプの使い方を示します。サンプルコードは、このた:型コンストラクタ名の前<... ,...>F#コンストラクタで<文字列>、str>

use cmd = new SqlCommandProvider<" 
    SELECT TOP(@topN) FirstName, LastName, SalesYTD 
    FROM Sales.vSalesPerson 
    WHERE CountryRegionName = @regionName AND SalesYTD > @salesMoreThan 
    ORDER BY SalesYTD 
    " , connectionString>(connectionString) 

何を意味していると、なぜ 最初のパラメータには、リテラル文字列である必要がありますか?それはジェネリックのように見えますが、変数は型ではありません。コンストラクタがすでに<>セクションにある接続文字列を取り込んでいるようです。

答えて

3

山括弧は、あるタイプの構成です。 例では、タイプを定義していて、同じタイプのインスタンスを作成しています。ステップが分かれていると明確になります。

タイプを定義します。

type SalesPersonQuery = SqlCommandProvider<query, connectionString> 

それには実際にあなたがそれを作成する必要があります型のインスタンスを持っている:

let command = new SalesPersonQuery() 

今、あなたはというし、SalesPersonQuery.Execute()command.Execute()を使用することができます。

後に(実行時に)あなたがそう例えば、定義内に提供された1つ、その後別のに接続文字列を変更することができますので、コンストラクタはあり理由:

let command = new SalesPersonQuery(differentConnectionString) 

することができます構成セクションでthe documentationでそれを見つける:

接続文字列は、実行時にオーバーライドすることができ、コンストラクタオプションのパラメータを経由して

最初のパラメータには、SQLスクリプトまたはSQLクエリへのパスを指定できます。それが文字列の理由だと思います.SQLクエリをどのように定義したいのですか?

ここでも、ドキュメントから:

コマンドテキスト(SQLスクリプト)

+0

* .sqlファイルへのリテラルまたはパスのいずれかになります私は、変数とタイプを作ることができますどのような方法がありますクエリ?私はパラメータとしてクエリを受け取りたいと思います。 –

+0

私はそうは思わない。あるいは、少なくとも私はそのようなオプションをドキュメントに見ていませんでした。私はそれを操作するための可変変数を持つことを試みるかもしれないと思います(私はそれを試していないので、それが可能かどうかをテストしなければなりません)。しかし、あなたは、マルチスレッド環境でのロックの必要性のような不変の値を持つ利点を失います。 – PiotrWolkowski

関連する問題