【发布时间】:2021-10-01 16:33:03
【问题描述】:
我想知道如何在存储过程的帮助下将额外的数据添加到dataGridView
注意:这可能是我的 SQL 查询的问题(不确定)。
我有以下代码将我的产品数据返回到dataGridView
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["SampleDatabaseWalkthrough.Properties.Settings.SampleDatabaseConnectionString"].ConnectionString))
{
if (cn.State == ConnectionState.Closed)
cn.Open();
using (DataTable dt = new DataTable())
{
using (SqlCommand cmd = new SqlCommand("exec dbo.GetProducts", cn))
{
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dt);
dataGridViewProducts.DataSource = dt;
dataGridViewProducts.AutoGenerateColumns = false;
}
}
}
这是我与上述代码关联的默认存储过程:
CREATE PROCEDURE [dbo].[GetProducts]
AS
begin
SELECT * from Products
end
以上代码的组合 100% 有效。现在我想将关系表数据添加到我的产品查询中,如下所示:
CREATE PROCEDURE [dbo].[GetProducts]
AS
begin
SELECT * from Products p
Join Serials s ON s.Id = p.Id
end
上面的这个存储过程应该返回我的产品数据+每个产品序列的计数。 (即):
Name: Product 1
Origin: Local
Serials: 15 <-- this is count of relationship table
截图:
问题
正如您在我的屏幕截图中看到的,我的两个产品都在serials 列中收到序列号但是只有我的产品Table 有序列号,因此在产品表的serials 列中应该说2,对于产品Lamp,应该说0
更新
我刚刚注意到,在我的查询中,我应该得到像 Join Serials s ON s.ProductId = p.Id 这样的连续剧,而不是像 Join Serials s ON s.Id= p.Id 这样得到它们。
但问题是这次我在dataGridView 中获得了 2 个 Table 和没有 Lamp 产品(因为 Lamp 没有与之关联的任何序列号)。
有什么建议吗?
更新 2
序列表架构
CREATE TABLE [dbo].[Serials] (
[Id] INT NOT NULL,
[ProductId] INT NOT NULL,
[Serial] NVARCHAR (50) NOT NULL,
[Sold] bit NOT NULL DEFAULT 0,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Serials_Products] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Products] ([Id])
);
【问题讨论】:
-
在查询中尝试使用 Left out join。如果您需要帮助,请分享示例数据和预期结果。
-
@AmitVerma 它说
out部分语法不正确 -
它是左外连接
-
@AmitVerma 和
left join我得到以下结果(截图)ibb.co/KXFrvZJ -
这意味着序列表有 2 行相同的产品 ID。现在你必须根据业务逻辑来决定如何处理。我再说一遍,分享样本数据和预期结果。
标签: c# mysql sql visual-studio winforms