C# 从另外两个数据表中选择行,动态生成一个数据表

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

我有一个SQL表,用于存储向客户收取的不同费率。 该表还包括一个“默认”费率列表,如果客户没有特定的费率,则将使用这些费率。 我需要的是,一旦用户从组合框中选择一个客户机,为该客户机创建一个费率表,包括默认值或该客户机特定的费率,或两者的组合,如下所示:

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并不是用来保存来自不同表的少量数据,而是用代码从关系数据库复制一个表?