C# C MS Access查询返回字符串聚合
在我的数据库中,[Customer]和[Car]表之间存在一对多关系,其中一个客户可能拥有零辆或多辆汽车 我的项目要求我输出一个所有客户的列表,其中有一列显示车辆注册信息[VehicleReg]。如果客户有多辆车,则所有车辆登记必须以逗号分隔显示。如果客户没有汽车,则该列应为空 这是查询的基础,但我不知道如何返回注册号 选择[Customer].[FirstName],[CustomerLastName],在[Customer].[CustomerId]=[Car].[fkCustomerId]上从[Customer]左侧加入[Car]以逗号分隔的车辆注册表 我想要的输出是这样的C# C MS Access查询返回字符串聚合,c#,string,C#,String,在我的数据库中,[Customer]和[Car]表之间存在一对多关系,其中一个客户可能拥有零辆或多辆汽车 我的项目要求我输出一个所有客户的列表,其中有一列显示车辆注册信息[VehicleReg]。如果客户有多辆车,则所有车辆登记必须以逗号分隔显示。如果客户没有汽车,则该列应为空 这是查询的基础,但我不知道如何返回注册号 选择[Customer].[FirstName],[CustomerLastName],在[Customer].[CustomerId]=[Car].[fkCustomerId]
FirstName | LastName | VehicleRegistrations
-------------------------------------------------
John | Smith | MY51 4RT
Joe | Mason | MU08 5TH
Connor | Norman |
Graham | Naughton | HT09 6TY, HT11 8UQ
Lilly | Adams | JK55 8HY
我使用的是MS Access 1997数据库、C和.NET 4.0
在现阶段,性能不是主要问题
到目前为止,我唯一可行的解决方案是将车辆登记保存到[Customer]表中的一列中。虽然这将起作用,但它将涉及手动保持新列与[Car]表中车辆登记的任何更改同步,这并不太困难,但一旦我将项目转交给其他人进行维护,这可能是一种危险的方法
非常感谢为了实现这一点,您需要一个助手函数 公共函数JoinFromRecordset_ 数据源为字符串,可选分隔符为字符串=_ 可选列的长度=1作为字符串 Dim db作为DAO.Database,rs作为DAO.Recordset,s作为String,col作为Long Set db=CurrentDb 设置rs=db.OpenRecordsetDataSource,dbOpenForwardOnly 直到R.EOF为止 对于列=0到列-1 如果s=那么 s=Nzrscol 其他的 s=s&分隔符&Nzrscol 如果结束 下一列 下一个 环 rs.关闭:设置rs=无 db.Close:设置db=Nothing JoinFromRecordset=s 端函数 现在你可以写作了 选择FirstName、CustomerLastName、, JoinFromRecordset“从车辆中选择车辆如fkCustomerId=”和 客户ID作为车辆注册 来自客户
我会保持数据库不变,并在您的应用程序中运行报告操作,类似于我在下面所做的操作,使用Northwind数据库并将客户加入到订单中,订单Id取代您的注册号 创建两个类:
public class Customer
{
public string Name { get; set; }
public IEnumerable<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
}
为您的数据创建一个数据集,其中包含客户和订单的数据表以及外键上的表之间的关系。我使用类型化数据集自动创建适配器,但如果手动滚动,同样的原则也适用
创建一个ViewModel类,用于获取数据并对其进行排列
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SO_StringAggregate
{
public class ViewModel
{
public ViewModel()
{
// populate the data set
var dataSet = new NorthwindDataSet();
using (var customersAdp = new NorthwindDataSetTableAdapters.CustomersTableAdapter())
using (var ordersAdp = new NorthwindDataSetTableAdapters.OrdersTableAdapter())
{
customersAdp.Fill(dataSet.Customers);
ordersAdp.Fill(dataSet.Orders);
}
// populate your domain objects
var customers = dataSet.Customers.ToArray().Select(cust => new Customer
{
Name = cust.Company_Name,
Orders = cust.GetOrdersRows().Select(order => new Order { Id = order.Order_ID })
});
this.Customers = customers;
// build the report
StringBuilder report = new StringBuilder();
string formatString = "{0,-30}|{1}";
report.Append(string.Format(formatString, "Name", "Order Ids"));
report.Append(Environment.NewLine);
Customers.ToList().ForEach(cust => report.AppendLine(string.Format(
formatString,
cust.Name,
string.Join(",", cust.Orders.Select(o => o.Id).ToArray()))
));
// display the report
Report = report.ToString();
}
public IEnumerable<Customer> Customers { get; set; }
public string Report { get; set; }
}
}
然后,可以在绑定到报表属性的视图中显示数据
<Window x:Class="SO_StringAggregate.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox FontFamily="Consolas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Text="{Binding Report}" />
</Grid>
</Window>
试试这个它会有帮助的,http://stackoverflow.com/a/1048235/405673@Furqan,TSQL在这种情况下可以工作吗mdb/.NET4?您在哪里输出这些数据?在win form应用程序上的datagridview上?@nicholas将数据加载到自定义实体列表中,并绑定到网格基础设施超链接。仅检查一下,用户打算从.NET应用程序运行select查询。这可能意味着函数是在mdb中定义的,表适配器能够调用自定义函数吗?对不起,我错过了。我的建议仅适用于Access应用程序;我在寻找一个比我写的DConcat函数更优雅的解决方案。我喜欢这给你的控制。它也可以用ADODB::Recordset::GetStrings编写。上面没有看到您的UltraWinGrid注释。在这种情况下,在Customer类上创建一个JoinedReg属性,该属性返回string.Join、、this.RegistrationNumber.ToArray