C# 合并来自2个表的数据
免责声明:这是一个测试/虚拟/假数据库 大家好,我有个问题,下面是两个表格结构。当我使用C# 合并来自2个表的数据,c#,sql,visual-studio-2010,sql-server-2008,C#,Sql,Visual Studio 2010,Sql Server 2008,免责声明:这是一个测试/虚拟/假数据库 大家好,我有个问题,下面是两个表格结构。当我使用 SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM dbo.Invoice; 我希望在一列中添加患者姓名,并将其标记到发票号。所以我的意思是,当执行查询时,它应该向我显示带发票号的patientdetails。但在这
SELECT CONVERT(char(80), InvDate,3) AS InvDate,InvoiceNo,EmployerCode,TaxAmount + SubTotal AS Amount,'' AS Payment FROM dbo.Invoice;
我希望在一列中添加患者姓名,并将其标记到发票号。所以我的意思是,当执行查询时,它应该向我显示带发票号的patientdetails。但在这两个表结构中都没有链接。我能想到的唯一联系就是“医学记录”。我尝试使用UNION函数,但没有得到所需的输出。有什么帮助吗
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)
{
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用System.Data.SqlClient;
命名空间MedicalDataExporter
{
公共部分类frmSales:表单
{
公共财务报表()
{
初始化组件();
}
私有无效dtpFrom_值已更改(对象发送方,事件参数e)
{
}
私有void btnExtract\u单击(对象发送方,事件参数e)
{
SqlConnection objConn=newsqlconnection(“数据源=test;初始目录=test;持久安全信息=True;用户ID=test;密码=test”);
System.Data.SqlClient.SqlConnection(conStr);
objConn.Open();
SqlCommand objCmd=新的SqlCommand(“选择转换(字符(80),InvDate,3)作为InvDate,InvoiceNo,员工代码,TAXAMUNT+小计作为金额”,作为发票付款,其中(InvDate>=转换(日期时间,“+dtpFrom.Text+”,105))和(InvDate要跨多个表查询数据,您需要。我不是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
而不是internal JOIN
编辑(回复评论):
我打赌WHERE子句中的DateTime转换没有按您预期的方式工作。假设dtpFrom
和dtpTo
是DatePicker
控件,您可能希望使用SelectedDate
属性,而不是Text
。此外,我强烈建议在q中使用参数查询而不是串接字符串。您的代码将更干净,而且您将避免。下面是一个快速示例:
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
}
}
使用(SqlConnection=newsqlconnection(…)
{
connection.Open();
字符串sql=@“
挑选
将(字符(80),即InvDate,3)转换为InvDate,
i、 发票号,
i、 员工代码,
i、 TaxAmount+i.小计为金额,
""作为报酬,,
吉文纳姆警长
从…起
dbo.发票一
左连接dbo.PatientDetails pd ON(pd.MedicalRecordID=i.MedicalRecordID)
哪里
InvDate>=@fromDate和InvDate感谢您的回复。当我执行查询MSSQL时,它完全符合我的要求。但是当我转换到vb命令时,它没有显示MSSQL中显示的内容。SqlCommand objCmd=new SqlCommand(“选择转换(char(80),i.InvDate,3))作为InvDate,i.InvoiceNo,i.EmployeerCode,i.TaxAmount+i.SubTotal AS Amount,“”作为付款,pd.GivenName来自dbo。发票我离开加入dbo.PatientDetails pd ON(pd.MedicalRecordID=i.MedicalRecordID),其中(InvDate>=转换(日期时间,“+dtpFrom.Text+”,105))和(InvDate您好,先生,经过6个小时的编码和帮助调整后。它不按日期和patientdetails过滤。txt输出中不显示givenname。我会将上述查询从C#over复制/粘贴到Management Studio(复制/粘贴引号内的所有内容,而不更改引号内的任何内容),然后在查询之前添加两个变量声明(DECLARE@fromDate-DATETIME='2012-10-01 00:00'
和DECLARE@todateme='2012-10-11 00:00'
)。如果查询在Management Studio中有效,则返回C代码并设置断点,检查两个SelectedDate
字段以确认它们是否正确。如果查询在Management Studio中未产生预期结果,则需要处理查询。