こんにちは、アンダーソンです。
たまーにやってしまうミスがあったのでちょっと書いとこうと思いまして、
残しておきます。
Contents
クエリやアクセスでのエラー
List has no rows for assignment to SObject
皆さんも何度か遭遇したことがあるかと思います。
例外として出るのですが、どのような時に出るのかをみてみましょう。
Account acc = [SELECT Id FROM Account WHERE Name LIKE '%テスト%'];
例えばテストという名前のAccountが2件あったとします。
その際にSOQLが返すのは2件なのに、accに入れられるのは1件なので
例外が発生します。
この対処法としては、
List<Account> accList = [SELECT Id FROM Account WHERE Name LIKE '%テスト%'];
配列に入れてあげればOKです。
List index out of bounds: n
次にこのリストに対して、存在しないインデックスに対してアクセスしてみます。
Account acc = accList[2];
このリストには2つしかレコードがない為、エラーになります。
SObject row was retrieved via SOQL without querying the requested field
では次はどのようなエラーでしょうか。
上記のコードを少し変えます。
List<Account> accList = [SELECT Id FROM Account WHERE Name LIKE '%テスト%'];
Account acc = accList[0];
String s = acc.Name;
この場合に、SOQL内でName項目を取得していない為、上記のエラーが出ます。
対策としてはSOQLで項目を取得しておくことです。
必要のない項目までクエリするのはパフォーマンスの低下につながりますが、
必要なものは取っておかないとエラーの原因になるので気をつけましょう。
まとめ
今回は短いですがかなり重要なことです。
なぜならVisualforceに表示させることができずにユーザには真っ白な画面にエラーの文言だけが
出されます。
こうならないためにも日頃からレコードの取得の仕方には気をつけておきましょう。
コメント