根据条件将一个表复制到另一个表

时间:2011-07-31 23:34:54

标签: c# sql datatable resultset

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

  1. 从MBRHISTDETL
  2. 中选择一条记录
  3. 是BILLTYPE 09并且是BILLMOYR<> 9999?如果是,请继续。如果没有,请再获取一条记录。
  4. 使用MBRHISTDETL中的MBRNUM从LOCINFODETL获取LOCATION,DISTRICT和CYCLE。
  5. DISTRICT和CYCLE是否匹配输入参数cbDistrict和cbCycle?如果不是,请再获取一条记录。
  6. 填充数据表
  7. 除非文件结束,否则返回1。
  8. 由于我的代码现在正在编写,我只能完成第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();
    
        }
    

3 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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以获取有关语法的更多信息。

答案 2 :(得分:0)

  

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

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