【问题标题】:Copy one table to another based on criteria [closed]根据标准将一个表复制到另一个表[关闭]
【发布时间】:2011-10-17 02:36:03
【问题描述】:

在下面的程序中,我将从 MBRHISTDETL 中选择的每条记录写入数据表。但是,每当从 MBRHISTDTL 文件中读取记录时,我想在将其写入数据表之前执行更多操作。但是,程序的编写方式是,当我只想写入特定记录时,它会将整个结果集写入数据表。我怎样才能改变这个?我想做的是:

  1. 从 MBRHISTDETL 中选择一条记录
  2. 是 BILLTYPE 09 并且是 BILLMOYR 9999?如果是,请继续。如果没有,请再获取一条记录。
  3. 使用来自 MBRHISTDETL 的 MBRNUM 从 LOCINFODETL 获取 LOCATION、DISTRICT 和 CYCLE。
  4. DISTRICT 和 CYCLE 是否与输入参数 cbDistrict 和 cbCycle 匹配?如果没有,请获取另一条记录。
  5. 填充数据表
  6. 除非文件结束,否则返回 1。

由于我的代码是现在编写的,我只能完成第 1 步到第 3 步,因为我还没有找到从 MBRHISTDETL 中获取记录并使用该信息从 LOCINDODETL 中选择另一条记录来验证我拥有的记录的方法在写入数据表之前是正确的。基本上,我试图从两个不同的数据库文件中获取信息并将信息写入数据表。我这样做的方式是否正确?

到目前为止,这是我的代码:

private void btnGo_Click(object sender, EventArgs e)
    {
        //get parameters
        string cycle = cbCycle.Text;
        string district = cbDistrict.Text;

        //create a connection to the database
        OdbcConnection DbConnection = new OdbcConnection("DSN=UPN2;uid=xxxx;pwd=xxxx");
        DbConnection.Open();

        //create a command to extract the required data and
        //assign it to the connection string
        OdbcCommand DbCommand = DbConnection.CreateCommand();
        DbCommand.CommandText = "SELECT * FROM CAV_MBRHISTDETL WHERE BILLTYPE = '09' " +
            "AND BILLMOYR <> '9999'";

        //Create a DataAdapter to run the command and fill the datatable
        OdbcDataAdapter da = new OdbcDataAdapter();
        da.SelectCommand = DbCommand;
        DataTable dt = new DataTable();

        //Put results into datatable.
        da.Fill(dt);


        tbOutput.Text = PrintDataTable(dt);

        DbCommand.Dispose();
        DbConnection.Close();

    }

【问题讨论】:

  • 我想我可以像我目前正在做的那样将初始结果集写入数据表,然后遍历该数据表并从 LOCINFODETL 文件中选择更多信息并将其写入另一个数据表。然后我可以组合来自两个数据表的信息并根据需要输出。不过好像有点“脏”。我认为应该有一种方法可以对结果集采取行动,而不必先将其存储在数据表中。不过,为了做到这一点,我认为程序必须一次处理一条记录。嗯。

标签: c# sql datatable resultset


【解决方案1】:

如果表在同一个数据库中,您可能(取决于数据库后端和配置)可以使用内部联接在单个查询中获取所有数据。例如:

DbCommand.CommandText = 
 @"SELECT HIST.Field1, HIST.Field2, LOCINFO.Field3 FROM CAV_MBRHISTDEL AS HIST
   INNER JOIN LOCINFODETL AS LOCINFO ON HIST.MBRNUM = LOCINFO.MBRNUM 
   WHERE LOCINFO.CYCLE = @CYCLE AND
         LOCINFO.DISTRICT = @DISTRICT AND
         HIST.BILLTYPE = '09' AND
         HIST.BOLLMOYR <> '9999'";

DbCommand.Parameters.AddWithValue("@CYCLE", cycle);
DbCommand.Parameters.AddWithValue("@DISTRICT", district);

这会处理您的步骤 1、2、3、4 和 6,这些步骤都与选择您需要的数据有关。步骤 5 只需要执行命令来填充数据表。 (注意:将Field1、Field2等替换为数据表所需的实际字段,并将LOCINFO.MBRNUM替换为LOCINFO。(LOCINFODETL中的哪个字段对应MBRNUM)。)

如果 SQL 查询语法不清楚,您可能需要参考 inner joinsparameterized queriestable aliasing 以了解有关语法的更多信息。

【讨论】:

  • 哇!太感谢了!这正是我所需要的。我很感激你花时间为我写出来。 Tem 让我接受了他的回答,但你的回答几乎填补了空白,然后是一些。再次,非常感谢!
【解决方案2】:

如果 MBRNUM 是 LOCINFODETL 中的外键,那么您只需要来自 MBRHISDETL 的所需 MRBNUM。尝试子选择:

SELECT MBRNUM, LOCATION, DISTRICT, CYCLE
from
    CAV_LOCINFODETL
WHERE
    MBRNUM IN (SELECT MBRNUM
               FROM CAV_MBRHISTDETL
               WHERE BILLTYPE = '09' AND BILLMOYR <> '9999')

【讨论】:

  • 这对我来说效果很好,Tem!非常感谢!
【解决方案3】:

基本上,我正在尝试从两个不同的数据库中获取信息 文件并将信息写入数据表

我假设数据库表在同一个数据库中。我会在您的查询语句中使用联合将两个表链接到一个公共键。有很多关于如何建立关系的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多