我试图在水晶报告上显示一些数据。在编写代码之后,报告的发布部分显示良好,而接收部分仅显示所选范围内的第一个数据并重复多次。这是下面的代码
public DataSet itembincardreport(string date1, string date2, string
itemcode)
{
SqlCommand cmd = new SqlCommand();
SqlConnection con = null;
Connection cs = new Connection();
con = new SqlConnection(cs.DBcon);
con.Open();
DataSet ds = new DataSet();
frmReport frm = new frmReport();
string sql = "select * from ISSUED, RECEIVED WHERE
ISSUED.ITEMCODE=RECEIVED.ITEMCODE AND ISSUED.ITEMCODE = '" + itemcode + "'
AND RECEIVED.ITEMCODE = '" + itemcode + "' and ISSUED.TRANSDATE
between '" + Convert.ToDateTime(date1) + "' and '" +
Convert.ToDateTime(date2) + "' and RECEIVED.TRANSDATE between '" +
Convert.ToDateTime(date1) + "' and '" + Convert.ToDateTime(date2) + "'";
SqlDataAdapter dadbt = new SqlDataAdapter(sql, mycon.DBcon);
dadbt.Fill(ds);
dadbt.Dispose();
return ds;
}
答案 0 :(得分:0)
问题的根本原因是查询。接收表和已发布的表是否有多个彼此匹配的行,我不能说(您需要发布一些比给出的屏幕截图更好的示例表数据)但是您在字符串中的查询应该写成:
string sql =
@"select *
from
ISSUED
inner join
RECEIVED
on
ISSUED.ITEMCODE=RECEIVED.ITEMCODE -- this is probably the fault
-- try joining on ISSUEDID = RECEIVED instead??
where
ISSUED.ITEMCODE = @itemcode and
ISSUED.TRANSDATE between @date1 and @date2 and
RECEIVED.TRANSDATE between @date1 and @date2";
稍后在您的代码中,您应该致电:
var c = new SqlCommand();
c.CommandText = sql;
c.Connection mycon;
c.Parameters.AddWithValue("@itemcode", itemcode);
c.Parameters.AddWithValue("@date1", Convert.ToDateTime(date1)); //you should make the method argument a DateTime
c.Parameters.AddWithValue("@date2", Convert.ToDateTime(date2)); //you should make the method argument a DateTime
SqlDataAdapter dadbt = new SqlDataAdapter(c);
如何正确地使用参数进行数据库查询..现在是否存在重复行完全取决于您的表数据*,但至少您的SQL不受黑客放置项目代码{{ 1}}进入并搞砸你的世界
*如果您需要帮助,请发布一些详细的示例数据,我将编辑此答案。看一下SQLFiddle.com