2012-10-08 37 views
0
合并数据

声明:这是一个测试/ DUMMY/FAKE DATABASE从2个表

球员嗨,我有一个问题,以下是2层的表结构。当我使用

SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM dbo.Invoice; 

http://i48.tinypic.com/icpzpy.png

我希望在一列患者添加名称由地方将被标记,以发票号码。所以我的意思是说,当查询被执行时,它应该显示与发票号码一起标记的患者详细信息。但在这两种表格结构中都没有链接。我能想到的唯一连接“MedicalRecordID”。我试过使用UNION功能didnt给我所需的输出。任何帮助?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 


namespace MedicalDataExporter 
{ 
public partial class frmSales : Form 
{ 
    public frmSales() 
    { 
     InitializeComponent(); 
    } 


    private void dtpFrom_ValueChanged(object sender, EventArgs e) 
    { 

    } 

    private void btnExtract_Click(object sender, EventArgs e) 
    { 

     SqlConnection objConn = new SqlConnection("Data Source=test;Initial Catalog=test;Persist Security Info=True;User ID=test;Password=test"); 

     System.Data.SqlClient.SqlConnection(conStr); 
     objConn.Open(); 

     SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM Invoice WHERE (InvDate >= CONVERT(datetime, '"+dtpFrom.Text +"', 105)) AND (InvDate <= CONVERT(datetime, '"+dtpTo.Text+"', 105))", objConn); 

     SqlDataReader objReader; 
     objReader = objCmd.ExecuteReader(); 

     System.IO.FileStream fs = new System.IO.FileStream("C:\\CMSExportedData\\Sales-" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt", System.IO.FileMode.Create); 
     System.IO.StreamWriter sw = new System.IO.StreamWriter(fs, System.Text.Encoding.Default); 

     int count = 0; 
     while (objReader.Read()) 
     { 

      for (int i = 0; i < 5; i++) 
      { 
       if (!objReader.IsDBNull(i)) 
       { 
        string s; 
        s = objReader.GetDataTypeName(i); 
        //MessageBox.Show(s); 
        if (objReader.GetDataTypeName(i) == "char") 
        { 
         sw.Write(objReader.GetString(i)); 
        } 
        else if (objReader.GetDataTypeName(i) == "money") 

        { 
         sw.Write(objReader.GetSqlMoney(i).ToString()); 
        } 
        else if (objReader.GetDataTypeName(i) == "nvarchar") 
        { 
         sw.Write(objReader.GetString(i)); 
        } 
       } 
       if (i < 4) 
       { 
        sw.Write("\t"); 
       } 

      } 
      count = count + 1; 
      sw.WriteLine(); 

     } 
     sw.Flush(); 
     fs.Close(); 
     objReader.Close(); 
     objConn.Close(); 
     MessageBox.Show(count + " records exported successfully."); 
     this.Close(); 
    } 

    private void groupBox1_Enter(object sender, EventArgs e) 
    { 

    } 

    private void dtpTo_ValueChanged(object sender, EventArgs e) 
    { 

    } 

    private void frmSales_Load(object sender, EventArgs e) 
    { 

    } 
} 
} 

这里是表结构:

http://i45.tinypic.com/2cwu2j6.png

这里是第二个表结构:

http://i45.tinypic.com/29yplvl.png

回答

1

要查询在多个表中的数据,你要join the tables。我不是你的两个表之间的关系100%清楚,但如果MedicalRecordID是正确的关系,那么你的查询应该是这个样子:

SELECT 
    CONVERT(char(80), i.InvDate,3) AS InvDate, 
    i.InvoiceNo, 
    i.EmployerCode, 
    i.TaxAmount + i.SubTotal AS Amount, 
    '' AS Payment, 
    pd.LastName, 
    pd.GivenName 
FROM 
    dbo.Invoice i 
     INNER JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID) 
; 

这工作如果有一个对一表格之间的关系,以及每个发票总是有一个PatientDetails记录。如果PatientDetails是可选的,则使用LEFT JOIN而不是INNER JOIN

EDIT(响应评论):

我敢打赌,日期时间转换在WHERE子句中不工作您预期的方式。假设dtpFromdtpToDatePicker控件,则可能需要使用SelectedDate属性而不是Text。另外,我强烈建议在查询中使用参数,而不是连接字符串。你的代码会更干净,你会避免SQL injection。这里有一个简单的例子:

using (SqlConnection connection = new SqlConnection(...)) 
{ 
    connection.Open(); 

    string sql = @" 
       SELECT 
        CONVERT(char(80), i.InvDate,3) AS InvDate, 
        i.InvoiceNo, 
        i.EmployerCode, 
        i.TaxAmount + i.SubTotal AS Amount, 
        '' AS Payment, 
        pd.GivenName 
       FROM 
        dbo.Invoice i 
         LEFT JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID) 
       WHERE 
        InvDate >= @fromDate AND InvDate <= @toDate"; 

    SqlCommand cmd = new SqlCommand(sql, connection); 
    cmd.Parameters.AddWithValue("@fromDate", dtpFrom.SelectedDate); 
    cmd.Parameters.AddWithValue("@toDate", dtpTo.SelectedDate); 

    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     // do stuff with results 
    } 
} 
+0

谢谢你的回复。当我执行查询MSSQL时,它完全是我想要的。但是,当我转移到VB命令,它并没有告诉我,什么是在MSSQL中显示。 SqlCommand objCmd = new SqlCommand(“SELECT CONVERT(char(80),i.InvDate,3)AS InvDate,i.InvoiceNo,i.EmployerCode,i.TaxAmount + i.SubTotal AS Amount,''AS付款,pd.GivenName FROM dbo.Invoice i LEFT JOIN dbo.PatientDetails pd ON(pd.MedicalRecordID = i.MedicalRecordID)WHERE(InvDate> = CONVERT(datetime,'“+ dtpFrom.Text +”',105))AND InvDate <= CONVERT(datetime,'“+ dtpTo.Text +”',105))“,objConn);' – Newbie

+0

嗨,先生,经过6个小时的训练后,您的编码和帮助。它不会过滤日期和patientdetails.givenname不显示在TXT输出 – Newbie

+1

我会复制/粘贴上述查询从C#到Management Studio(复制/粘贴引号内的所有内容,而不会改变引号内的任何内容),然后添加两个查询前的变量声明('DECLARE @fromDate DATETIME ='2012-10-01 00:00''和'DECLARE @toDate DATETME ='2012-10-11 00:00'')。如果查询在Management Studio中工作,则返回到C#代码并设置断点并检查两个“SelectedDate”字段以确认它们是正确的。如果查询在Management Studio中未产生预期的结果,那么您需要处理查询。 – cbranch