iT邦幫忙

1

ASP.NET C# 與 MS SQL 重複資料查詢問題 _已解決

  • 分享至 

  • xImage

各位前輩大家好,目前透過Table A的P_ID欄位來搜尋Table B做資料查詢
但同一個P_ID會有重複新增固定五比資料的情況如圖二
目前是想用資料建立的時間來做為搜尋的條件
但是不知從何做起,想請問各位前輩可以在SQL就設定完條件呈現在GridView上
還是要再ASP.NET C#做處理呢???
Table A.
https://ithelp.ithome.com.tw/upload/images/20180325/201074440dOFdtuQQ6.jpg
Table B.
https://ithelp.ithome.com.tw/upload/images/20180325/20107444zXdksSj6W6.jpg
搜尋後結果
https://ithelp.ithome.com.tw/upload/images/20180325/2010744456zcWulxGI.jpg

private void loadGridData2()
{
 string constr = ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString;
 using (SqlConnection con = new SqlConnection(constr))
 {
   using (SqlCommand cmd = new SqlCommand())
   {
    cmd.CommandText = "SELECT P_ID FROM Patient_infor WHERE P_ID LIKE '%' + @P_ID + '%'";
                cmd.Connection = con;
                cmd.Parameters.AddWithValue("@P_ID", txtSearch.Text.Trim());
                DataTable dt = new DataTable();
                using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                {
                    sda.Fill(dt);
                    GridView2.DataSource = dt;
                    GridView2.DataBind();
                }
            }
        }
    }
看更多先前的討論...收起先前的討論...
神Q超人 iT邦研究生 5 級 ‧ 2018-03-25 21:23:10 檢舉
為什麼會有重複五筆的狀況@@
而且他們的JOIN欄位好像只有P_ID而已,我該怎麼知道TableA的第14筆是對應到TableB的哪一筆呢?
小火車 iT邦新手 4 級 ‧ 2018-03-25 23:43:38 檢舉
回神Q超人因為P_ID這欄位式客戶ID,而客戶會固定下五筆訂單
我想到這可不可以用關聯式資料庫來解決呢??
Table A (Pa_infor_ID)這個欄位是自動編號(IDENTITY)
我有辦法把Pa_infor_ID這個欄位跟Table B做關聯嗎??
不好意思 我是SQL完全新手
石頭 iT邦高手 1 級 ‧ 2018-03-26 00:25:47 檢舉
請問 A表 (Pa_infor_ID) 是PK嗎
如果是 你需要再 Table B表中 新增一個欄位 來關聯A表 (Pa_infor_ID)
神Q超人 iT邦研究生 5 級 ‧ 2018-03-26 00:59:10 檢舉
樓上的大大說的沒錯哦!
因為你只用P_ID去連結,所以才會找出所有有關該客戶的訂單,應該要在TableB表加上一個可以分辨那些訂單內容是屬於哪張訂單的。
如果TableA是訂單主檔,TableB又是訂單明細的狀況下啦,希望我沒有判斷錯@@
小火車 iT邦新手 4 級 ‧ 2018-03-26 09:48:03 檢舉
對 沒錯 Table A (Pa_infor_ID) 是PK值
我大概知道怎麼做了
謝謝各位前輩的指點
小火車 iT邦新手 4 級 ‧ 2018-03-26 11:25:16 檢舉
不好意思想再請教大大們
我已經在SQL設定好Table B新增一個FK欄位(Pa_infor_ID) 來關聯Table A (Pa_infor_ID) PK 欄位(此欄位是自動編號)
請問在C#要INSERT Table A PK值到 Table B FK 值 語法要怎麼做呢??
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
暐翰
iT邦大師 1 級 ‧ 2018-03-26 15:53:12
最佳解答

我已經在SQL設定好Table B新增一個FK欄位(Pa_infor_ID) 來關聯Table A (Pa_infor_ID) PK 欄位(此欄位是自動編號)
請問在C#要INSERT Table A PK值到 Table B FK 值 語法要怎麼做呢??

回答:

先建立一個FK(PersonID)測試Script
來模擬一個使用者下兩個訂單情況

CREATE TABLE Persons (
    PersonID int NOT NULL PRIMARY KEY,
    Name varchar(255) NOT NULL
);

CREATE TABLE Orders (
    OrderID int NOT NULL PRIMARY KEY,
    OrderNumber int NOT NULL,
    PersonID int FOREIGN KEY REFERENCES Persons(PersonID)
);

insert Persons (PersonID,Name) values (1,N'weihan');
public static void loadGridData2()
{
	string constr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=c:\users\hanyang\source\repos\ConsoleApp7\ConsoleApp7\Database1.mdf;Integrated Security=True";
	using (SqlConnection con = new SqlConnection(constr))
	{
		con.Open();
		using (SqlTransaction ts = con.BeginTransaction())
		using (SqlCommand cmd = new SqlCommand())
		{
			cmd.Connection = con;
			cmd.Transaction = ts;
			
			//模擬:使用者登入、確認
			cmd.CommandText = "SELECT * FROM Persons where PersonID = @PersonID ";
			cmd.Parameters.AddWithValue("@PersonID", 2);
			DataTable dt = new DataTable();
			using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
				sda.Fill(dt);
			if (dt.Rows.Count==0)
				throw new Exception("沒有此使用者,不能下訂單!");

			//模擬:使用者下兩筆訂單
			cmd.CommandText = @"
				insert Orders (OrderID,OrderNumber,PersonID) values (2,2,@PersonID);
				insert Orders (OrderID,OrderNumber,PersonID) values (3,3,@PersonID);
			";
			var count_insert = cmd.ExecuteNonQuery();
			
			//確定交易送出到DB
			ts.Commit();
		}
	}
}

原理:

1 使用transation確保區塊運行沒有錯誤,才把資料送出到DB

2 共用一個FK參數(以例子來說就是@PersonID)
解決你的問題

INSERT Table A PK值到 Table B FK 值

小火車 iT邦新手 4 級 ‧ 2018-03-26 17:11:14 檢舉

非常感謝大大費心的指導

0
小魚
iT邦大師 1 級 ‧ 2018-03-26 11:59:47

你的資料庫設計不是很好,
通常我們會有一個資料表,
一筆訂單就只有一個編號,
甚至你要拿這個編號來當主鍵也可以,
然後這筆訂單有5項,
另外一個資料表存5項,
然後用主鍵關聯到這個資料表,
如果每一項還需要好幾筆細節,
另外再開一個資料表.

我要發表回答

立即登入回答