C# 从另外两个数据表中选择行,动态生成一个数据表
我有一个SQL表,用于存储向客户收取的不同费率。 该表还包括一个“默认”费率列表,如果客户没有特定的费率,则将使用这些费率。 我需要的是,一旦用户从组合框中选择一个客户机,为该客户机创建一个费率表,包括默认值或该客户机特定的费率,或两者的组合,如下所示:C# 从另外两个数据表中选择行,动态生成一个数据表,c#,sql,winforms,C#,Sql,Winforms,我有一个SQL表,用于存储向客户收取的不同费率。 该表还包括一个“默认”费率列表,如果客户没有特定的费率,则将使用这些费率。 我需要的是,一旦用户从组合框中选择一个客户机,为该客户机创建一个费率表,包括默认值或该客户机特定的费率,或两者的组合,如下所示: Client Type of Work Rate ABC Ltd Type A 100 XYZ & Co Type B 150 Default Type A
Client Type of Work Rate
ABC Ltd Type A 100
XYZ & Co Type B 150
Default Type A 125
Default Type B 175
ABC Ltd Type A 100
Type B 175 (default)
XYZ & Co Type A 125 (default)
Type B 150
Anyone else Type A 125 (default)
Type B 175 (default)
因此,返回的费率如下所示:
Client Type of Work Rate
ABC Ltd Type A 100
XYZ & Co Type B 150
Default Type A 125
Default Type B 175
ABC Ltd Type A 100
Type B 175 (default)
XYZ & Co Type A 125 (default)
Type B 150
Anyone else Type A 125 (default)
Type B 175 (default)
数据库中的信息结构如下
Table for clients
Table for Types of Work
Table for Rates (foreign keys linking to clients and types of work)
有谁能解释一下,在winforms应用程序中使用SQL语句、C#例程或两者的组合如何获得上述结果
另外,我很抱歉,但我不确定如何在本网站的表格中列出我的数据
到目前为止我都试过了
public static DataTable TableOfRates(string pIPName = "Default")
{
try
{
string sqlText1 = "SELECT RateID, IPName, RateName, Rate, DateFrom, DateTo, Active, " +
"(RateName + ': £' + CONVERT(VARCHAR, Rate) + CONVERT(VARCHAR, " +
"(CASE WHEN Active = '1' THEN ' (Active)' ELSE ' (Inactive)' END))) AS ListRate " +
"FROM tblRates WHERE IPName IS NULL AND Active = 'true';";
aSqlQuery cQ1 = new aSqlQuery(sqlText1, "table");
DataTable defaultRates = cQ1.TableResult;
string sqlText2 = "SELECT RateID, IPName, RateName, Rate, DateFrom, DateTo, Active, " +
"(RateName + ': £' + CONVERT(VARCHAR, Rate) + CONVERT(VARCHAR, " +
"(CASE WHEN Active = '1' THEN ' (Active)' ELSE ' (Inactive)' END))) AS ListRate " +
"FROM tblRates WHERE IPName = '" + pIPName + "' " +
"AND Active = 'true';";
aSqlQuery cQ2 = new aSqlQuery(sqlText2, "table");
DataTable clientRates = cQ2.TableResult;
foreach(DataRow defaultRow in defaultRates.Rows)
{
string defaultType = defaultRow["RateName"].ToString();
foreach (DataRow clientRow in clientRates.Rows)
{
string clientType = clientRow["RateName"].ToString();
if (defaultType == clientType)
{
clientRates.Rows.Add(defaultRow.ItemArray);
}
}
}
return clientRates;
}
catch (Exception eX)
{
throw new Exception("cRate: Error compiling Table Of Rates (mode = '" + pIPName + "')" + Environment.NewLine + eX.Message);
}
}
但是,无论使用“添加行”、“导入行”还是“添加项数组”,都会出现错误。它似乎不喜欢使用多个表中的数据行。您必须有一个列出客户机和作业的表-考虑到这一点,您可能正在执行以下操作
SELECT
CASE R1.RATE WHEN NULL THEN R2.RATE else r1.rate AS RATE END
FROM
CLIENTJOBS C LEFT JOIN RATES R1 ON
R1.CLIENT = C.CLIENT AND R1.WORKTYPE = C.WORKTYPE
JOIN RATES R2 ON
R2.WORKTYPE = C.WORKTYPE AND R2.CLIENT = 'DEFAULT'
请记住,这是未经测试的猜测代码,但如果您确实需要加载数据表,希望它能为您指明正确的方向:
CREATE TABLE
#MyTempTable (myColumn1 DataType, myColumn2 DataType, myColumn3 DataType)
INSERT INTO
#MyTempTable(myColumn1, myColumn2, myColumn3)
SELECT
f.Bar1, o.Bar2, o.Bar3 FROM FooTable AS f
INNER JOIN
TableFoo o ON f.Bar1 = o.Bar1
通过一些调整,此脚本将创建一个临时表,只要您的连接保持活动状态,该表就会持续存在,并包含您所需的其他表中的数据。您可以提供示例数据(创建表和数据的代码)吗?您确定要在内存中而不是通过sql在数据库中执行此操作(这将更高效/更可扩展)?sql是一种特定于关系数据的语言。这意味着它喜欢标准化数据。你说的是为了演示目的而旋转它。我强烈建议您在SQL中处理数据时保留已有的结构,只在表示层(在C#中,而不是在SQL中)对其进行重新格式化。通过解耦各层并减少隐藏的依赖性,这使得代码更易于维护、适应、可移植、可靠等?DataTable并不是用来保存来自不同表的少量数据,而是用代码从关系数据库复制一个表?