DNN 7+ で使用するモジュールを作成しており、データ アクセスに DAL2 を使用したいと考えていますが、データベースからアイテムを選択する際に問題が発生しています。
私のコードはデータベースに正常に接続しているように見えますが、DAL2 によって生成されたクエリには、データベース テーブル内のフィールドの名前が含まれていません。SQL Server プロファイラーを実行して、データベースに何が届くかを監視し、"SELECT NULL FROM Product..." で始まるクエリを確認しています。「SELECT * FROM Product...」または「SELECT ProductCode FROM Product...」が表示されることを期待しています。
問題を特定し、完全なコード サンプルを含めることができるようにするために、次のようにテストを行いました。 Product.cs ファイルがあります。
using System.Web.Caching;
using DotNetNuke.ComponentModel.DataAnnotations;
namespace MyModule.Components
{
[TableName("Product")]
[PrimaryKey("productCode")]
[Cacheable("MYMODULE_Product_", CacheItemPriority.Default, 20)]
[Scope("productCode")] //different values here did not change the result.
public class Product
{
public string productCode;
}
}
ProductRepository.cs ファイルがあります。
using DotNetNuke.Data;
namespace MyModule.Components
{
public class ProductRepository
{
private const string EXTERNAL_DB_CONNECTION_STRING = "MY_DB_CONNECTIONSTRING_NAME";
public Product GetProduct(string productCode)
{
Product t;
using (IDataContext ctx = DataContext.Instance(EXTERNAL_DB_CONNECTION_STRING))
{
var rep = ctx.GetRepository<Product>();
t = rep.GetById(productCode);
}
return t;
}
}
}
ビューでこれら 2 つのファイルを次のコードで使用します。
ProductRepository productRepo = new ProductRepository();
Product product = (Product)productRepo.GetProduct("MYCODE");
このコードを実行している間、SQL Server プロファイラーを使用して監視すると、次のクエリが実行されることがわかります。
exec sp_executesql N'SELECT NULL FROM [Product] WHERE [productCode]=@0',N'@0 nvarchar(4000)',@0=N'MYCODE'
上記の選択クエリが NULL を選択している理由がわかりません。Product.cs ファイルまたは * 文字からの製品フィールドのリストを期待しています。
productCode のデータベース フィールド定義 (Microsoft SQL Server Management Studio のツリー ビューから見た場合) は次のとおりです。
productCode(PK, varchar(50), not null)
外部データベースに接続していますが、データが特定のモジュールまたはポータルに接続されていません。そのため、スコープとして「productCode」を指定します。データがポータルまたはモジュールに関連付けられていない場合、スコープの適切な使用方法がわかりません。問題が Product.cs ファイルの Scope 属性に関連していないことを確認するために、Scope 変数を "PortalId"、"ModuleId"、"productCode"、および "Nothing" に設定してテストしました。これらの値はすべて、SQL Server プロファイラーに同じクエリが表示されました。
また、Scope 属性を完全に削除してテストしました。Scope 属性が含まれていない場合、SQL Server プロファイラーで次のクエリが表示されました。
SELECT NULL FROM [Product]
Scope 属性が除外されたときに WHERE 句が削除された理由はわかりませんが、それがテスト結果で示されました。
Scope 属性を使用したこれらのテストにより、私が見ている「SELECT NULL」の問題とは関係がないと信じるようになりましたが、完全を期すためにここに含めたいと思いました。
なぜこれがNULLで選択を作成するのですか?データを選択するにはどうすればよいですか?
ありがとう!