1

ASP.NET C# を使用して SQL Server データベース クエリの結果を出力し、裁判所ごとに 1 つのレコードのみを表示する結果を取得しようとしていますが、裁判所ごとに複数の連絡先の詳細も表示されます。

関連するテーブルは次のとおりです (ボールド体の PK、イタリック体の FK)。

裁判所 ( Court_ID , Court_Name, Note, Town, Postcode)

連絡先 ( Contact_ID , Contacts_Name, Contacts_no, *Court_ID*, *Court_Contact_Type_ID*)

Contact_Type ( Court_Contact_Type_ID , Court_Contact_Type_Desc)

現在、私の問題は、各裁判所と同じ数の連絡先について、各裁判所の詳細を複数回繰り返すことです。なぜそれをしているのかはわかっていますが、思い通りに機能させる方法はわかりません。

'HasRows' を使用しているため、解決策が SQL クエリ自体にあるのか (ネストによって解決されるのでしょうか...?)、C# コードにあるのかわかりません。以下に両方のコード スニペットを含めました。

string myQuery = "SELECT Court_Name, Town, Postcode, Note, Contacts_Name, Contacts_no, Court_Contact_Type_Desc " +
                 "FROM Court C, Contacts CON, Contact_type CONT " +
                 "WHERE C.Court_ID = CON.Court_ID AND CON.Court_Contact_Type_ID = CONT.Court_Contact_Type_ID AND C.Court_ID = '3' ";


SqlConnection connection = new SqlConnection(connStr);
SqlCommand myCommand = new SqlCommand(myQuery, connection);
SqlDataReader myDataReader;
connection.Open();

myDataReader = myCommand.ExecuteReader();

if (myDataReader.HasRows)
{

    while (myDataReader.Read())
    {

        string court_name = myDataReader["Court_Name"].ToString();
        string court_town = myDataReader["Town"].ToString();
        string court_pcode = myDataReader["Postcode"].ToString();
        string court_note = myDataReader["Note"].ToString();
        string court_contact_name = myDataReader["Contacts_Name"].ToString();
        string court_contact_desc = myDataReader["Court_Contact_Type_Desc"].ToString();
        string court_contacts_no = myDataReader["Contacts_no"].ToString();

        Response.Write("<strong>" + court_name + "</strong><br>" + court_town + "<br>" + court_pcode + "<p>" + court_note + "</p>" + "<p>" + court_contact_name + " - " + court_contact_desc + " : " + court_contacts_no + "</p>");

    }

}

最終的な出力は次のようになります。

アバーガベニー治安判事裁判所
アバーガベニー
NP7 5DL

この裁判所は審理のみに開かれています。追加の法廷メモ….

連絡
先 連絡先名 1 - 裁判所マネージャー代理: 01633 64xxxx
連絡先名 2 - 事務所マネージャー代理: 01633 64xxxx
連絡先名 3 - リスト担当官代理: 01633 64xxxx
連絡先名 4 - 司法書記官: 01633 64xxxx

いつものように、どんな助けもありがたく受け取りました!

乾杯

4

3 に答える 3

2

次のように問題を解決できます。

  • 選択リストに court_id を追加します
  • 同じ裁判所に属する行を隣り合わせにする順序基準を追加します
  • 戻ってきたデータを繰り返し処理するときは、以前にコート ID を見たことがあるかどうかを確認してください
  • 裁判所 ID を初めて見る場合は、裁判所と連絡先の両方を表示してください
  • この裁判所 ID を以前に見たことがある場合は、連絡先情報のみを表示してください

これを行う方法の例を次に示します。

string myQuery = "SELECT C.Court_ID, Court_Name, Town, Postcode, Note, Contacts_Name, Contacts_no, Court_Contact_Type_Desc " +
             "FROM Court C "+
             "JOIN Contacts CON ON C.Court_ID = CON.Court_ID "+
             "JOIN Contact_type CONT ON CON.Court_Contact_Type_ID = CONT.Court_Contact_Type_ID " +
             "WHERE C.Court_ID = '3' "+ // I assume the search criteria will be different
             "ORDER BY C.Court_ID"; // Very important: records for the same court must be together

...
string last_id = string.Empty;
while (myDataReader.Read())
{
    string court_id = myDataReader["Court_ID"].ToString();
    string court_name = myDataReader["Court_Name"].ToString();
    string court_town = myDataReader["Town"].ToString();
    string court_pcode = myDataReader["Postcode"].ToString();
    string court_note = myDataReader["Note"].ToString();
    string court_contact_name = myDataReader["Contacts_Name"].ToString();
    string court_contact_desc = myDataReader["Court_Contact_Type_Desc"].ToString();
    string court_contacts_no = myDataReader["Contacts_no"].ToString();
    if (last_id != court_id) {
        // Write court AND contact
        Response.Write("<strong>" + court_name + "</strong><br>" + court_town + "<br>" + court_pcode + "<p>" + court_note + "</p>" + "<p>" + court_contact_name + " - " + court_contact_desc + " : " + court_contacts_no + "</p>");
    } else {
        // Write only contact
        Response.Write("<p>" + court_contact_name + " - " + court_contact_desc + " : " + court_contacts_no + "</p>");
    }
    last_id = court_id;
}
于 2012-12-20T11:29:39.907 に答える
0

あなたはこれを試してみたくなるかもしれません (私があなたが見せたかったものが正しければ)。トー私は連絡先と連絡先タイプが1:1リンクであると推測しました。

SELECT Court_Name, Town, Postcode, Note, contacts
    from Court
    where Court_ID = '3'
    CROSS APPLY
    (
    select substring((
        SELECT ',' + Contact_Name+ ' ' +Contacts_no + ' ' + Court_Contact_Type_Desc 
        FROM Contacts join Contact_Type on  Contacts.Court_Contact_Type_ID = Contact_Type.Court_Contact_Type_ID  
        WHERE Contacts.CourtID = Court.CourtID
        FOR XML PATH('')
        ),2,1000)
        as Contacts    
    ) contacts

Tho、これにより、C#でデータを異なる方法で解析し、コードに書き込むことができます。

于 2012-12-20T11:28:15.913 に答える
0

最も簡単な方法は、2 つのクエリに分割することです。

1 番目のクエリ: 指定された ID を持つコートを取得します。
2 番目のクエリ: 指定された ID を持つ裁判所の連絡先のリストを取得します。

良い面は、物事がシンプルで理解しやすいことです。また、連絡先が見つからない場合でも (その可能性はわかりません)、正しい裁判所の住所を出力できます。

欠点は、データベースに対して 2 つの SQL クエリを実行することです。それはパフォーマンスに関する考慮事項かもしれません。

注意: 例のように文字列を連結して SQL クエリを作成する場合は、SQL インジェクション攻撃に注意してください。参照: SQL インジェクションとパラメータ化されたクエリ

于 2012-12-20T12:07:48.840 に答える