2014-12-03 32 views
0

我做的一個學生項目,現在已經做了一些顯示的數據到一個DataGridView,你可以在這裏看到:SQL添加兩行到一個單元格

1 Beijing Potato Beijing 123456 [email protected] Mr Potato Potato    
1 Beijing Potato Beijing 123456 [email protected] Mr Potato Chips    
2 Fish Company Qingdao 123457 [email protected] Mr Fish Turtle    
4 Fruit & Stuff Xian 234567 [email protected] Mrs Fruit Sallad    
5 Connor Company Jinan 345678 [email protected] Connor Si Chocolate   
7 Cookies & Friends Boras 255424 [email protected] Ms Cookie Beer     
6 Alcohol Limited Shanghai 456790 [email protected] Mr Alcohol Cookie    
5 Connor Company Jinan 345678 [email protected] Connor Si Flower 

我的問題是,我想知道是否有任何SQL注入允許我將「供應」添加到一個單元中,以便供應商北京馬鈴薯只能在一行中看到,但在最後一個單元中將具有馬鈴薯,薯片。

public void populateDgv() 
{ 
    string sqlString = "SELECT s.SupplierId AS [Supplier Id], 
    s.SupplierName AS [Supplier Name], s.SupplierCity AS [Supplier.City], 
    s.SupplierPhone AS [Phonenumber], s.SupplierMail AS [E-Mail], 
    s.SupplierContactPerson AS [Contact Person], p.ProductName AS [Supply] 
    FROM Supplier s INNER JOIN Products p ON s.SupplierId=p.SupplierId;"; 
    DataTable dt = clsDB.fromDB(sqlString); 
    dgvSupplier.DataSource = dt; 
} 

我的表:

CREATE TABLE [dbo].[Products] (
[ProductId]  INT    IDENTITY (1000, 1) NOT NULL, 
[ProductName] VARCHAR (20) NOT NULL, 
[OrderPrice] DECIMAL (18, 2) NOT NULL, 
[SellingPrice] DECIMAL (18, 2) NOT NULL, 
[CurrentStock] INT    NULL, 
[LowStockLimit] INT    DEFAULT ((15)) NOT NULL, 
[OrderStatus] BIT    DEFAULT ((0)) NULL, 
[OrderQuanity] INT    NULL, 
[SupplierId] INT    NOT NULL, 
PRIMARY KEY CLUSTERED ([ProductId] ASC), 
CONSTRAINT [FK_Products_Suppliers] FOREIGN KEY ([SupplierId]) REFERENCES [dbo].[Supplier] ([SupplierId] 

CREATE TABLE [dbo].[Supplier] (
[SupplierId]   INT   IDENTITY (1, 1) NOT NULL, 
[SupplierName]   VARCHAR (50) NOT NULL, 
[SupplierCity]   VARCHAR (50) NOT NULL, 
[SupplierPhone]   INT   NOT NULL, 
[SupplierMail]   VARCHAR (50) NOT NULL, 
[SupplierContactPerson] VARCHAR (50) NOT NULL, 
PRIMARY KEY CLUSTERED ([SupplierId] ASC) 
+2

這與SQL注入沒有任何關係,但是,是的,這是可能的。你的DBMS是哪一個? – 2014-12-03 16:10:52

+0

我正在Visual Studio 13中工作,並創建了本地數據庫文件 – Linshen 2014-12-03 16:14:31

回答

0

嘗試使用STUFFFOR XML PATH結合:

SELECT s.SupplierId AS [Supplier Id], 
     s.SupplierName AS [Supplier Name], 
     s.SupplierCity AS [Supplier.City], 
     s.SupplierPhone AS [Phonenumber], 
     s.SupplierMail AS [E-Mail], 
     s.SupplierContactPerson AS [Contact Person], 
     STUFF((SELECT ',' + LTRIM(RTRIM(p.productName)) AS [text()] 
       FROM Products p 
       WHERE s.SupplierId = p.SupplierId 
       FOR XML PATH('') 
      ), 1, 1, '') 
      AS [Products] 
    FROM Supplier s 

看,喲可以很容易地從你的Products表中刪除[SupplierName][SupplierCity][SupplierPhone][SupplierMail][SupplierContactPerson],在引用的Supplier表中存在的所有這些值。將這些值存儲在多個位置會佔用更多空間而沒有任何優勢。

+0

謝謝!這解決了問題。產品細胞現在看起來像巧克力,花朵。在它們之間有一個TAB(?),或者像打10次的空間。我知道這只是美麗的缺陷,但你知道如何去除兩者之間的空間嗎? – Linshen 2014-12-03 16:55:39

+0

使用'LTRIM(RTRIM(yourColumn)''將刪除單元格內容之前或之後的所有空格。我相應地編輯了答案。 – 2014-12-03 17:02:06

+0

再次感謝!Products表中只有SupplierId,我的錯誤是供應商的複製粘貼兩次,Ltrim完美無缺。 – Linshen 2014-12-04 02:46:52

0

你爲什麼不你不使用LINQ,並把它回爲一個列表?

this.dt.Suppliers.Include( 「產品」)。其中(x => x.YourId ==編號)

(的。哪裏()是可選的,OFC)

-1

試試這個查詢:

SELECT distinct s.SupplierId AS [Supplier Id], s.SupplierName AS [Supplier Name], s.SupplierCity AS [Supplier.City], s.SupplierPhone AS [Phonenumber], s.SupplierMail AS [E-Mail], s.SupplierContactPerson AS [Contact Person], 
coalesce(select distinct productname from products p where p.SupplierId = s.SupplierId) as productlist 
FROM Supplier s 

我無法測試它,因爲我沒有您的數據庫。你可能需要調整一下。複製並粘貼到您的查詢工具中,看看您是否能夠正常工作。

+0

COALESCE不連接行,它只返回第一個空元素,並且不應該像那樣使用AFAIK。 http://msdn.microsoft.com/en-US/library/ms190349.aspx – 2014-12-03 16:43:04

+0

不幸的是,我沒有工作,我已經更新了整個表格構建的帖子 – Linshen 2014-12-03 16:43:25

+0

對不起。我看到STUFF的作品,我得看看它! – Resource 2014-12-03 16:58:39

0

看起來您可能在「產品」表中有「供應商ID」兩條記錄。要將其記錄爲一條記錄,對於該供應商,您需要以某種方式確定您需要從「產品」表中記錄哪條記錄。

相關問題