0

第一に、羊毛の主題のタイトルについてお詫びします。これを言葉にするのは難しいです。

それで…それを念頭に置いて、データベース関係図(以下を参照)を添付しました。これにより、より簡潔に説明できるようになります。

ここに画像の説明を入力してください

私たちは大規模なデータベースを継承しました(したがって、データベースを変更/合理化する機能はありません。残念ですが)。このデータベースには、多対多の関係がいくつかある4つのテーブルの厄介な「ループ」があります。

裁判所の名前、完全な住所、および一般的なメモを取得できる必要があります。これらはすべて、すべての裁判所に1つしかなく、その後に連絡先の詳細が2つのグループ(一般的な連絡先と特定の連絡先)に分けられます。裁判所に依存する1つ以上のリストが含まれています。以下の形式で表示するには、これが必要です。

アバーガベニー治安判事裁判所
アバーガベニー
NP75DL

この裁判所は公聴会のみに開かれています。追加の裁判所のメモ…。

連絡先
交換機:01633 64xxxx
ファックス:01633 64xxxx
サービス1:01633 64xxxx
サービス2:0163364xxxx
連絡先名1-裁判所長代理:0163364xxxx
連絡先名2-事務局長代理:0163364xxxx
連絡先名3-代理リスト役員:0163364xxxx
連絡先名前4-裁判官の書記官:01633 64xxxx

昨日StackOverflowに投稿して、1つの多対多の関係に対してSQLクエリとASP.NET C#コードを正しく記述する方法を調べました。簡単にするために、私が提供した情報は非常に言い換えられており、基本的に上記のループの半分しか含まれていませんでした。しかし、それ以来、同じ原則を完全なループに適用する試みに失敗しました。

SQLクエリ(ループの前半で機能します。つまり、裁判所の住所の詳細と特定の連絡先のリストを提供します)は次のようになります。

string myQuery = 
"SELECT C.court_id, court_name, court_addr1, court_town_name, court_county_name, " +
"court_country_name, court_addr_pcode, court_addr_dx, court_code, court_note, " +
"court_contacts_name, court_contacts_no, CCT.court_contact_type_desc " +      
"FROM court C " +
"JOIN court_addr CA ON C.court_addr_id = CA.court_addr_id " +
"JOIN court_town CT ON CA.court_town_id = CT.court_town_id " +
"JOIN court_county CC ON CT.court_county_id = CC.court_county_id " +
"JOIN court_country CCO ON CC.court_country_id = CCO.court_country_id " +
"JOIN court_contacts CCON ON C.court_id = CCON.court_id " +
"JOIN court_contact_type CCT ON CCON.court_contact_type_id = CCT.court_contact_type_id " + 
"WHERE C.court_id = '25' " + 
"ORDER BY C.court_id";

C#は次のようになりますが、次のようになります。

if (myDataReader.HasRows)
{

    string last_id = string.Empty;

    while (myDataReader.Read())
    {

        string court_id = myDataReader["court_id"].ToString();
        string court_name = myDataReader["court_name"].ToString();
        string court_addr = myDataReader["court_addr1"].ToString();
        string court_town = myDataReader["court_town_name"].ToString();
        string court_county = myDataReader["court_county_name"].ToString();
        string court_country = myDataReader["court_country_name"].ToString();
        string court_pcode = myDataReader["court_addr_pcode"].ToString();
        string court_dx = myDataReader["court_addr_dx"].ToString();
        string court_code = myDataReader["court_code"].ToString();
        string court_note = myDataReader["court_note"].ToString();
        string court_contact_name = myDataReader["court_contacts_name"].ToString();
        string court_contact_desc = myDataReader["court_contact_type_desc"].ToString();
        string court_contact_no = myDataReader["court_contacts_no"].ToString();

        if (last_id != court_id) {

            Response.Write("<strong>" + court_name + "</strong><br>" + court_addr +
                           "<br>" + court_town + "<br>" + court_county + "<br>" + 
                           court_country + "<br>" + court_pcode + "<br><br>" + 
                           court_dx + "<br><p>Court code " + court_code + "</p><p>" + 
                           court_note + "</p>" + court_contact_name + " - " + 
                           court_contact_desc + ": " + court_contact_no + "<br>");

        } else {

            Response.Write("<br>" + court_contact_name + " - " + court_contact_desc + 
                           ": " + court_contact_no + "<br>");

        }

        last_id = court_id;

    }

}

SQLクエリの同じロジックに従って、court_contacts_general_noの追加のSELECTパラメーターとcourt_contacts_generalテーブルを取り込むためのいくつかの追加のJOIN行を追加しようとしましたが以下を参照)、これにより'相関の行に沿ってエラーが発生します。名前CCGはFROM句で複数回指定されているか、2番目の相関名が削除されると完全に空白になります。

"JOIN court_contacts_general CCG ON C.court_id = CCG.court_id " +                                  
"JOIN court_contacts_general CCG ON CCT.court_contact_type_id = CCG.court_contact_type_id " +

C#で、court_contact_general_noの新しい文字列を追加し、この新しい変数から受け取った応答の書き込みに基づいて、別のif/elseループを作成しようとしました。

いずれにせよ、私が得ているのは、大きな空白のページまたは上記のSQL関連のエラーだけです。

何か案は?

すべて/すべての助けを事前に感謝します。

4

2 に答える 2

0

1回のクエリで同じテーブルを複数回結合するには、異なるテーブル名エイリアスを使用する必要があります

JOIN court_contacts_general CCG1
JOIN court_contacts_general CCG2.. etc

その場合は、返されるデータに関連する名前をテーブルに付けることをお勧めします。

于 2012-12-21T14:34:48.750 に答える
0

それは確かにエレガントではありませんが(間違いなくそれを書くためのはるかに良い方法があります!)、2番目のSQLクエリを記述し、最初のクエリがタグを閉じた直後に2番目のSqlconnectionを開くことで、問題の解決策を見つけることができました連絡先の2番目のバッチ。

SQLクエリ:

string myQuery2 = 
"SELECT C.court_id, court_contacts_name, court_contacts_no, court_contact_type_desc " +
"FROM court C " +
"JOIN court_contacts CCON ON C.court_id = CCON.court_id " +
"JOIN court_contact_type CCT ON CCON.court_contact_type_id = CCT.court_contact_type_id " +
"WHERE C.court_id = '" + court_id_no + "' " +
"ORDER BY C.court_id";

C#コード:

myDataReader.Close();
connection.Close();

SqlConnection connection2 = new SqlConnection(connStr);
SqlCommand myCommand2 = new SqlCommand(myQuery2, connection2);
SqlDataReader myDataReader2;
connection2.Open();

myDataReader2 = myCommand2.ExecuteReader();

if (myDataReader2.HasRows) {

    string last_id = string.Empty;

    while (myDataReader2.Read()) {

        string court_id = myDataReader2["court_id"].ToString();
        string court_contact_desc = myDataReader2["court_contact_type_desc"].ToString();
        string court_contact_name = myDataReader2["court_contacts_name"].ToString();
        string court_contact_no = myDataReader2["court_contacts_no"].ToString();

        if (string.IsNullOrWhiteSpace(court_contact_no)) {
            court_contact_no = generic_contact_no;
        }

        if (last_id != court_id) {

            Response.Write(court_contact_name + " - " + court_contact_desc + ": " + court_contact_no + "<br>");

        } else {

            Response.Write(court_contact_name + " - " + court_contact_desc + ": " + court_contact_no + "<br>");

        }

        last_id = court_id;

    }
}

私が言うように、きれいではありませんが、重要なことはそれが機能することです。

于 2012-12-21T16:58:48.683 に答える